Merge lp:~sinzui/launchpad/remove-main-template into lp:launchpad

Proposed by Curtis Hovey
Status: Merged
Approved by: Aaron Bentley
Approved revision: not available
Merged at revision: not available
Proposed branch: lp:~sinzui/launchpad/remove-main-template
Merge into: lp:launchpad
Diff against target: 939 lines (+49/-535)
21 files modified
lib/canonical/launchpad/doc/tales-macro.txt (+3/-32)
lib/canonical/launchpad/doc/zcmldirectives.txt (+2/-2)
lib/canonical/launchpad/icing/style.css (+0/-1)
lib/canonical/launchpad/pagetitles.py (+0/-9)
lib/canonical/launchpad/templates/launchpad-forgottenpassword.pt (+1/-2)
lib/canonical/launchpad/templates/main-template-macros.pt (+0/-33)
lib/canonical/launchpad/templates/main-template.pt (+0/-308)
lib/canonical/launchpad/webapp/login.py (+1/-0)
lib/canonical/launchpad/webapp/tales.py (+5/-99)
lib/canonical/launchpad/zcml/launchpad.zcml (+0/-18)
lib/canonical/widgets/location.py (+1/-1)
lib/lp/app/browser/configure.zcml (+6/-0)
lib/lp/app/templates/base-layout-macros.pt (+1/-2)
lib/lp/registry/browser/productrelease.py (+1/-1)
lib/lp/registry/browser/team.py (+1/-1)
lib/lp/registry/templates/object-timeline-graph.pt (+3/-3)
lib/lp/services/openid/browser/configure.zcml (+1/-0)
lib/lp/services/openid/browser/openidrpconfig.py (+18/-0)
lib/lp/services/openid/templates/openidrpconfig-add.pt (+2/-10)
lib/lp/services/openid/templates/openidrpconfig-edit.pt (+2/-10)
lib/lp/services/openid/templates/openidrpconfigset-index.pt (+1/-3)
To merge this branch: bzr merge lp:~sinzui/launchpad/remove-main-template
Reviewer Review Type Date Requested Status
Aaron Bentley (community) Approve
Review via email: mp+15165@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Curtis Hovey (sinzui) wrote :
Download full text (4.6 KiB)

This is my branch to remove main-template and main-template-macros.

    lp:~sinzui/launchpad/remove-main-template
    Diff size: 940 (450 lines are removed files)
    Launchpad bug: https://bugs.launchpad.net/bugs/69726
    Test command: ./bin/test -vvt "tales-macro|zcmldirectives"
                  then test the whole suite. (/me did)
    Pre-implementation: no one
    Target release: 3.1.11

= Remove main-template and main-template-macros =

main-template and main-template-macros are obsolete and launchpad still
has code and tests to support them. They should be removed.

== Rules ==

    * Remove main-template and main-template-macros from zcml and templates
    * Update page macros, remove obsolete behaviour

ADDENDUM
ec2 test discovered pages that were still on 2.0 UI.

    * Shipit and signon both use @@+main-template-macros/notifications
      Registering that name on base-template-macros will continue support
    * OpenIDRPConfig is still using main-template, updated them to 3.0
    * forgottenpassword is still using main-template, update it to 3.0
    * The timeline is still using main-template-macros, update it to 3.0

== QA ==

    * Visit a project
    * Verify that the timeline displays
    * Visit +rpconfig
    * Verify the page displays
    * Verify the add and edit pages have cancel buttons
    * Visit forgottenpassword, verify the page displays.

== Lint ==

Linting changed files:
  lib/canonical/launchpad/pagetitles.py
  lib/canonical/launchpad/doc/tales-macro.txt
  lib/canonical/launchpad/doc/zcmldirectives.txt
  lib/canonical/launchpad/icing/style.css
  lib/canonical/launchpad/templates/launchpad-forgottenpassword.pt
  lib/canonical/launchpad/webapp/login.py
  lib/canonical/launchpad/webapp/tales.py
  lib/canonical/launchpad/zcml/launchpad.zcml
  lib/canonical/widgets/location.py
  lib/lp/app/browser/configure.zcml
  lib/lp/app/templates/base-layout-macros.pt
  lib/lp/registry/browser/productrelease.py
  lib/lp/registry/browser/team.py
  lib/lp/registry/templates/object-timeline-graph.pt
  lib/lp/services/openid/browser/configure.zcml
  lib/lp/services/openid/browser/openidrpconfig.py
  lib/lp/services/openid/templates/openidrpconfig-add.pt
  lib/lp/services/openid/templates/openidrpconfig-edit.pt
  lib/lp/services/openid/templates/openidrpconfigset-index.pt

== Test ==

    * lib/canonical/launchpad/doc/tales-macro.txt
      * Removed unsupported features.
      * Updated test to use a real page layout.
    * lib/canonical/launchpad/doc/zcmldirectives.txt
      * Updated test to use a modern example.

== Implementation ==

    * lib/canonical/launchpad/pagetitles.py
      * Removed the unused page title.
    * lib/canonical/launchpad/icing/style.css
      * Removed the comment about main template.
    * lib/canonical/launchpad/templates/launchpad-forgottenpassword.pt
      * Updated page to 3.0
    * lib/canonical/launchpad/webapp/login.py
      * Moved the page title tot he view.
    * lib/canonical/launchpad/webapp/tales.py
      * Updated the documentation examples for page layouts.
      * Removed master (main-template) and the code that switched between
        main and base.
      * Removed the old layout co...

Read more...

Revision history for this message
Aaron Bentley (abentley) wrote :

Looks good, thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/canonical/launchpad/doc/tales-macro.txt'
--- lib/canonical/launchpad/doc/tales-macro.txt 2009-10-21 18:42:52 +0000
+++ lib/canonical/launchpad/doc/tales-macro.txt 2009-11-23 17:20:28 +0000
@@ -12,20 +12,20 @@
12layout it's using. The following METAL fragment illustrates the way it's12layout it's using. The following METAL fragment illustrates the way it's
13usually done:13usually done:
1414
15 <html metal:use-macro="view/macro:page/default" />15 <html metal:use-macro="view/macro:page/main_side" />
1616
1717
18 >>> from canonical.launchpad.ftests import test_tales18 >>> from canonical.launchpad.ftests import test_tales
19 >>> view = FakeView()19 >>> view = FakeView()
2020
21 # Return value is the compiled macro expression.21 # Return value is the compiled macro expression.
22 >>> test_tales('view/macro:page/default', view=view)22 >>> test_tales('view/macro:page/main_side', view=view)
23 [('version', ...]23 [('version', ...]
2424
25The pagetype is registered in the __pagetype__ attribute.25The pagetype is registered in the __pagetype__ attribute.
2626
27 >>> view.__pagetype__27 >>> view.__pagetype__
28 'default'28 'main_side'
2929
30If the pagetype isn't defined, a LocationError is raised.30If the pagetype isn't defined, a LocationError is raised.
3131
@@ -43,35 +43,6 @@
43 >>> test_tales('view/macro:pagehas/portlets', view=view)43 >>> test_tales('view/macro:pagehas/portlets', view=view)
44 True44 True
4545
46 >>> test_tales('view/macro:pagehas/actionsmenu', view=view)
47 True
48
49 >>> test_tales('view/macro:pagehas/heading', view=view)
50 False
51
52
53The actions menu is deprecated. Some of the links are moved inline,
54others are shown as navigation tabs. The navigationtabs page feature
55controls that aspect. Two layouts show these, default2.0 and onecolumn.
56
57 >>> from canonical.launchpad.webapp.tales import PageMacroDispatcher
58 >>> for layout in sorted(PageMacroDispatcher._pagetypes):
59 ... view = FakeView()
60 ... macro = test_tales('view/macro:page/%s' % layout, view=view)
61 ... if test_tales('view/macro:pagehas/navigationtabs', view=view):
62 ... print layout
63 default2.0
64 onecolumn
65
66These two layouts have the actionsmenu turned off.
67
68 >>> macro = test_tales('view/macro:page/default2.0', view=view)
69 >>> test_tales('view/macro:pagehas/actionsmenu', view=view)
70 False
71
72 >>> macro = test_tales('view/macro:page/onecolumn', view=view)
73 >>> test_tales('view/macro:pagehas/actionsmenu', view=view)
74 False
7546
76The 'macro:isbetauser' can be used to safely try to determine if the47The 'macro:isbetauser' can be used to safely try to determine if the
77current user is a beta user. It works for views that provide48current user is a beta user. It works for views that provide
7849
=== modified file 'lib/canonical/launchpad/doc/zcmldirectives.txt'
--- lib/canonical/launchpad/doc/zcmldirectives.txt 2009-10-21 19:35:40 +0000
+++ lib/canonical/launchpad/doc/zcmldirectives.txt 2009-11-23 17:20:28 +0000
@@ -151,7 +151,7 @@
151 ... for="canonical.launchpad.ftests.IFoo"151 ... for="canonical.launchpad.ftests.IFoo"
152 ... name="+mandrill"152 ... name="+mandrill"
153 ... permission="zope.Public"153 ... permission="zope.Public"
154 ... template="templates/main-template.pt"154 ... template="../../lp/app/templates/base-layout.pt"
155 ... facet="another-mister-lizard"155 ... facet="another-mister-lizard"
156 ... layer="canonical.launchpad.ftests.IFooLayer"156 ... layer="canonical.launchpad.ftests.IFooLayer"
157 ... />157 ... />
@@ -169,7 +169,7 @@
169 ... (fooobject, request), name='+mandrill')169 ... (fooobject, request), name='+mandrill')
170170
171 >>> print mandrill_view.__class__.__name__171 >>> print mandrill_view.__class__.__name__
172 SimpleViewClass from ...main-template.pt172 SimpleViewClass from ...base-layout.pt
173 >>> print mandrill_view.__launchpad_facetname__173 >>> print mandrill_view.__launchpad_facetname__
174 another-mister-lizard174 another-mister-lizard
175175
176176
=== modified file 'lib/canonical/launchpad/icing/style.css'
--- lib/canonical/launchpad/icing/style.css 2009-11-15 23:14:57 +0000
+++ lib/canonical/launchpad/icing/style.css 2009-11-23 17:20:28 +0000
@@ -607,7 +607,6 @@
607 float: left;607 float: left;
608 width: 16.16%; /* = (100% / 6) - 0.5% left over */608 width: 16.16%; /* = (100% / 6) - 0.5% left over */
609 margin: 0 0.25%; /* = the leftover 0.5%, half each on the left and right */609 margin: 0 0.25%; /* = the leftover 0.5%, half each on the left and right */
610 /* This is overridden in main-template.pt for Internet Explorer */
611 padding: 0;610 padding: 0;
612 text-align: center;611 text-align: center;
613 color: #333;612 color: #333;
614613
=== modified file 'lib/canonical/launchpad/pagetitles.py'
--- lib/canonical/launchpad/pagetitles.py 2009-11-18 11:52:25 +0000
+++ lib/canonical/launchpad/pagetitles.py 2009-11-23 17:20:28 +0000
@@ -394,8 +394,6 @@
394394
395launchpad_forbidden = 'Forbidden'395launchpad_forbidden = 'Forbidden'
396396
397launchpad_forgottenpassword = 'Need a new Launchpad password?'
398
399# launchpad_css is a css file397# launchpad_css is a css file
400398
401# launchpad_js is standard javascript399# launchpad_js is standard javascript
@@ -516,13 +514,6 @@
516 """Return the page title to the invalid identity page."""514 """Return the page title to the invalid identity page."""
517 return 'Invalid OpenID identity %s' % view.openid_request.identity515 return 'Invalid OpenID identity %s' % view.openid_request.identity
518516
519openidrpconfig_add = 'Add an OpenID Relying Party Configuration'
520
521openidrpconfig_edit = ContextDisplayName(
522 'Edit Relying Party Configuration for %s')
523
524openidrpconfigset_index = 'OpenID Relying Party Configurations'
525
526def package_bugs(context, view):517def package_bugs(context, view):
527 """Return the page title bug in a package."""518 """Return the page title bug in a package."""
528 return 'Bugs in %s' % context.name519 return 'Bugs in %s' % context.name
529520
=== modified file 'lib/canonical/launchpad/templates/launchpad-forgottenpassword.pt'
--- lib/canonical/launchpad/templates/launchpad-forgottenpassword.pt 2009-10-20 11:29:26 +0000
+++ lib/canonical/launchpad/templates/launchpad-forgottenpassword.pt 2009-11-23 17:20:28 +0000
@@ -5,8 +5,7 @@
5 omit-tag="">5 omit-tag="">
6<tal:do-this-first tal:content="view/process_form" />6<tal:do-this-first tal:content="view/process_form" />
7<html7<html
8 metal:use-macro="context/@@main_template/master"8 metal:use-macro="view/macro:page/main_only">
9>
10 <head metal:fill-slot="head_epilogue">9 <head metal:fill-slot="head_epilogue">
11 <meta name="robots" content="noindex" />10 <meta name="robots" content="noindex" />
12 </head>11 </head>
1312
=== removed file 'lib/canonical/launchpad/templates/main-template-macros.pt'
--- lib/canonical/launchpad/templates/main-template-macros.pt 2009-07-17 17:59:07 +0000
+++ lib/canonical/launchpad/templates/main-template-macros.pt 1970-01-01 00:00:00 +0000
@@ -1,33 +0,0 @@
1<macros
2 xmlns="http://www.w3.org/1999/xhtml"
3 xmlns:tal="http://xml.zope.org/namespaces/tal"
4 xmlns:metal="http://xml.zope.org/namespaces/metal"
5 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
6 i18n:domain="launchpad"
7 tal:omit-tag=""
8>
9 <metal:notifications define-macro="notifications">
10 <metal:base-notifications
11 use-macro="context/@@+base-layout-macros/notifications" />
12 </metal:notifications>
13
14 <metal:load-javascript define-macro="load-javascript">
15 <metal:base-load-javascript
16 use-macro="context/@@+base-layout-macros/load-javascript" />
17 </metal:load-javascript>
18
19 <metal:page-javascript define-macro="page-javascript">
20 <metal:base-page-javascript
21 use-macro="context/@@+base-layout-macros/page-javascript" />
22 </metal:page-javascript>
23
24 <metal:launchpad-stylesheet define-macro="launchpad-stylesheet">
25 <metal:base-launchpad-stylesheet
26 use-macro="context/@@+base-layout-macros/launchpad-stylesheet" />
27 </metal:launchpad-stylesheet>
28
29 <metal:lp-client-cache define-macro="lp-client-cache">
30 <metal:base-lp-client-cache
31 use-macro="context/@@+base-layout-macros/lp-client-cache" />
32 </metal:lp-client-cache>
33</macros>
340
=== removed file 'lib/canonical/launchpad/templates/main-template.pt'
--- lib/canonical/launchpad/templates/main-template.pt 2009-09-15 17:30:59 +0000
+++ lib/canonical/launchpad/templates/main-template.pt 1970-01-01 00:00:00 +0000
@@ -1,308 +0,0 @@
1<metal:page
2 xmlns:metal="http://xml.zope.org/namespaces/metal"
3 xmlns:tal="http://xml.zope.org/namespaces/tal"
4 define-macro="master"
5 tal:define="
6 revno modules/canonical.launchpad.versioninfo/revno | string:unknown;
7 version string:Launchpad 2.2.6 (r${revno});
8 "
9><metal:doctype define-slot="doctype"><tal:doctype tal:replace="structure string:&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;" /></metal:doctype>
10<metal:block define-slot="top_slot" />
11<html
12 xmlns="http://www.w3.org/1999/xhtml"
13 xmlns:tal="http://xml.zope.org/namespaces/tal"
14 xmlns:metal="http://xml.zope.org/namespaces/metal"
15 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
16 xml:lang="en"
17 lang="en"
18 dir="ltr"
19 tal:attributes="lang view/lang|default_language|default;
20 xml:lang view/lang|default_language|default;
21 dir view/dir|string:ltr"
22 tal:define="
23 rooturl modules/canonical.launchpad.webapp.vhosts/allvhosts/configs/mainsite/rooturl;
24 icingroot string:${rooturl}+icing/rev${revno};
25 icingroot_contrib string:${rooturl}+icing-contrib/rev${revno};
26 devmode modules/canonical.config/config/devmode;
27 is_demo modules/canonical.config/config/launchpad/is_demo;
28 is_edge modules/canonical.config/config/launchpad/is_edge;
29 is_lpnet modules/canonical.config/config/launchpad/is_lpnet;
30 site_message modules/canonical.config/config/launchpad/site_message;
31 CONTEXTS python:{'template':template, 'context': context, 'view':view};
32 "
33>
34 <head tal:define="yui string:${icingroot}/yui/3.0.0pr2/build;
35 lazr_js string:${icingroot}/lazr/build;
36 lp_js string:${icingroot}/build"
37 >
38 <title tal:content="CONTEXTS/fmt:pagetitle" i18n:translate="">Launchpad</title>
39 <tal:atomfeeds condition="view/feed_links | nothing">
40 <tal:loop repeat="link view/feed_links">
41 <link rel="alternate" type="application/atom+xml" href="" title=""
42 tal:attributes="title link/title;
43 href link/href"/>
44 </tal:loop>
45 </tal:atomfeeds>
46
47 <!-- Launchpad style sheet -->
48 <metal:launchpad-stylesheet
49 use-macro="context/@@+main-template-macros/launchpad-stylesheet" />
50
51 <style tal:condition="is_demo" type="text/css"
52 >html, body {background-image: url(/@@/demo) !important;}</style>
53 <tal:comment condition="nothing">
54 Internet Explorer apparently doubles the horizontal margins of the
55 application tabs, which causes the 'Answers' tab to wrap onto a second
56 row. To work around this, we give IE some speshul CSS:
57 </tal:comment>
58 <!--[if lte IE 7]>
59 <style type="text/css">#lp-apps span {margin: 0 0.125%;}</style>
60 <![endif]-->
61 <tal:comment condition="nothing">
62 This CSS collapses the contents of collapsible fieldsets,
63 without the flashing that would result from doing it in JavaScript.
64 activateCollapsibles() removes the class="collapsed" from fieldsets, to
65 re-show their divs, once the children themselves have been collapsed.
66 </tal:comment>
67 <style type="text/css">
68 fieldset.collapsed div, fieldset div.collapsed {display: none;}
69 </style>
70 <noscript>
71 <style type="text/css">
72 fieldset.collapsible div, fieldset div.collapsed {display: block;}
73 </style>
74 </noscript>
75
76 <metal:page-javascript
77 use-macro="context/@@+main-template-macros/page-javascript" />
78
79 <link rel="shortcut icon" href="/@@/launchpad.png" />
80 <metal:block define-slot="head_epilogue"></metal:block>
81 </head>
82 <body
83 id="document"
84 tal:attributes="class string:tab-${view/menu:selectedfacetname} ${view/macro:pagetype} yui-skin-sam"
85 >
86 <div id="locationbar">
87 <tal:login replace="structure context/@@login_status" />
88 <form
89 tal:condition="view/macro:pagehas/globalsearch"
90 id="globalsearch"
91 action=""
92 xml:lang="en" lang="en" dir="ltr"
93 method="get"
94 accept-charset="UTF-8"
95 tal:attributes="action string:${rooturl}+search"
96 class="sprite search-icon"
97 >
98 <input type="search" id="search-text" name="field.text" />
99 </form>
100 <tal:hierarchy replace="structure context/@@+hierarchy" />
101 <div
102 tal:condition="view/macro:pagehas/applicationtabs"
103 tal:define="facetmenu view/menu:facet"
104 id="lp-apps"
105 class="clearfix"
106 >
107 <tal:XXX replace="nothing">
108 # XXX mpt 2008-07-02 bug=229931: The HTML comment works.
109 </tal:XXX>
110 <!-- :-) --><tal:facet repeat="link facetmenu">
111 <span
112 tal:condition="python: link.enabled and link.selected"
113 tal:attributes="title link/summary; class string:${link/name} active"
114 ><strong
115 tal:condition="not:link/linked"
116 tal:content="structure link/escapedtext"
117 /><a
118 tal:condition="link/linked"
119 tal:attributes="href link/url"
120 tal:content="structure link/escapedtext"
121 /></span><span
122 tal:condition="python: link.enabled and not link.selected"
123 tal:attributes="title link/summary; class link/name"
124 ><a
125 tal:condition="link/enabled"
126 tal:attributes="href link/url"
127 tal:content="structure link/escapedtext"
128 /></span><span
129 tal:condition="not:link/enabled"
130 tal:attributes="class string:${link/name} disabled-tab"
131 ><strong
132 tal:content="structure link/escapedtext"
133 /></span><small tal:condition="not:repeat/link/end"
134 > / </small></tal:facet>
135 </div>
136
137 </div><!--id="locationbar"-->
138
139 <tal:maintenance replace="structure context/@@+maintenancemessage" />
140 <h1 metal:define-slot="heading"
141 tal:condition="view/macro:pagehas/applicationbuttons" />
142 <div tal:condition="view/macro:pagehas/applicationborder" id="mainarea">
143 <div id="container">
144 <!--[if IE 7]>&nbsp;<![endif]-->
145 <tal:XXX condition="nothing">
146 # XXX mpt 2008-07-16 bug=249032: This conditional comment should
147 # not be necessary.
148 </tal:XXX>
149
150 <tal:noportlets
151 condition="not: view/macro:pagehas/portlets"
152 >
153 <tal:notifications
154 define="notifications request/notifications"
155 condition="notifications"
156 >
157 <metal:notifications
158 use-macro=
159 "context/@@+main-template-macros/notifications"
160 />
161 </tal:notifications>
162 </tal:noportlets>
163 <metal:block define-slot="before_nav_menu"/>
164 <div id="navigation-tabs"
165 tal:condition="view/macro:pagehas/navigationtabs">
166 <div id="context-navigation-tabs"
167 tal:condition="context/menu:navigation">
168 <tal:menu
169 replace="structure context/@@+navigationmenutabs"
170 />
171 </div>
172 <div id="view-navigation-tabs"
173 tal:condition="view/menu:navigation">
174 <tal:menu
175 replace="structure view/@@+navigationmenutabs"
176 />
177 </div>
178 </div>
179 <tal:noportlets condition="not: view/macro:pagehas/portlets">
180 <metal:block define-slot="main" />
181 </tal:noportlets>
182 <div
183 id="maincontent"
184 tal:condition="view/macro:pagehas/portlets"
185 >
186 <div id="nonportlets">
187
188 <div class="pageheading"
189 tal:condition="view/macro:pagehas/pageheading">
190 <metal:block define-slot="pageheading">
191 <tal:XXX condition="nothing">
192 # XXX Mark Shuttleworth 2007-04-30: Obsolete
193 </tal:XXX>
194 </metal:block>
195 </div>
196 <tal:notifications
197 define="notifications request/notifications"
198 condition="notifications"
199 ><metal:notifications
200 use-macro="context/@@+main-template-macros/notifications" />
201 </tal:notifications>
202 <metal:block define-slot="main" />
203
204 </div>
205 </div>
206 <div
207 id="portlets" xml:lang="en" lang="en" dir="ltr"
208 tal:condition="view/macro:pagehas/portlets"
209 >
210 <tal:menu condition="view/macro:pagehas/actionsmenu"
211 replace="structure view/@@+menubox" />
212 <metal:portlets define-slot="portlets" />
213 <metal:portlets define-slot="portlets_two" />
214 <metal:portlets define-slot="portlets_one" />
215 </div>
216 <div class="clear"></div>
217
218 </div><!--id="container"-->
219 </div><!--id="mainarea"-->
220 <tal:noborder condition="not:view/macro:pagehas/applicationborder">
221 <tal:notifications
222 define="notifications request/notifications"
223 condition="notifications"
224 ><metal:notifications
225 use-macro="context/@@+main-template-macros/notifications" />
226 </tal:notifications>
227 <metal:block define-slot="main" />
228 </tal:noborder>
229 <div id="globalfooter" class="clearfix" xml:lang="en" lang="en" dir="ltr">
230 <div id="colophon">
231 <a tal:condition="not:request/lp:person" href="/+tour"
232 >What is Launchpad?</a>
233 <a tal:condition="request/lp:person" href="/feedback"
234 >Contact us</a> | <a href="https://help.launchpad.net/">Get help with Launchpad</a>
235 </div>
236
237 <metal:site-message
238 use-macro="context/@@+base-layout-macros/site-message"/>
239
240 <div id="lp-arcana">
241 &copy;&nbsp;2004-2009&nbsp;<a
242 href="http://canonical.com/">Canonical&nbsp;Ltd.</a>
243 |
244 <a href="/legal">Terms of use</a>
245 <span tal:condition="not:is_lpnet" id="lp-version">
246 |
247 <a
248 href="https://help.launchpad.net/LaunchpadReleases"
249 tal:content="version"
250 />
251 <tal:devmode condition="devmode">devmode</tal:devmode>
252 <tal:demo condition="is_demo">demo site</tal:demo>
253 <tal:edge condition="is_edge">beta site</tal:edge>
254 </span>
255 </div>
256 <ul style="clear: both; margin-top:20px;" tal:condition="nothing">
257 <li>Facet name:
258 <tal:block tal:replace="view/menu:selectedfacetname" />
259 </li>
260 <li>Page type:
261 <tal:pagetype replace="view/macro:pagetype" />
262 </li>
263 <li>Has portlet column:
264 <span tal:replace="view/macro:pagehas/portlets" />
265 </li>
266 <li>Has application tabs:
267 <span tal:replace="view/macro:pagehas/applicationtabs" />
268 </li>
269 <li>Has application border:
270 <span tal:replace="view/macro:pagehas/applicationborder" />
271 </li>
272 <li>Has application buttons:
273 <span tal:replace="view/macro:pagehas/applicationbuttons" />
274 </li>
275 <li>Has heading:
276 <span tal:replace="view/macro:pagehas/heading" />
277 </li>
278 </ul>
279 </div><!--id="globalfooter"-->
280
281 <div id="help-pane" class="invisible">
282 <div id="help-body">
283 <tal:XXX condition="nothing">
284 # XXX mars 2008-11-07 bug=295254:
285 # We use this ugly src="" hack to get rid of an IE6 security
286 # warning. See bug #295234.
287 </tal:XXX>
288 <iframe
289 id="help-pane-content"
290 class="invisible"
291 src="javascript:void(0);"></iframe>
292 </div>
293 <div id="help-footer">
294 <span id="help-close"></span>
295 </div>
296 </div>
297
298 <metal:lp-client-cache
299 use-macro="context/@@+main-template-macros/lp-client-cache" />
300
301 </body>
302</html>
303<tal:requestlog
304 define="log modules/canonical.launchpad.webapp.adapter/summarize_requests"
305 replace="structure string:&lt;!-- at least ${log} --&gt;" />
306<tal:version replace="structure string:&lt;!-- ${version} -->" />
307</metal:page>
308<!-- 1-0 inprogress portlets wrong in IE/Mac -->
3090
=== modified file 'lib/canonical/launchpad/webapp/login.py'
--- lib/canonical/launchpad/webapp/login.py 2009-10-29 18:38:51 +0000
+++ lib/canonical/launchpad/webapp/login.py 2009-11-23 17:20:28 +0000
@@ -550,6 +550,7 @@
550 submitted = False550 submitted = False
551 captcha_submission = 'captcha_submission'551 captcha_submission = 'captcha_submission'
552 captcha_hash = 'captcha_hash'552 captcha_hash = 'captcha_hash'
553 page_title = 'Need a new Launchpad password?'
553554
554 def process_form(self):555 def process_form(self):
555 request = self.request556 request = self.request
556557
=== modified file 'lib/canonical/launchpad/webapp/tales.py'
--- lib/canonical/launchpad/webapp/tales.py 2009-11-14 22:44:07 +0000
+++ lib/canonical/launchpad/webapp/tales.py 2009-11-23 17:20:28 +0000
@@ -2998,17 +2998,13 @@
2998 """Selects a macro, while storing information about page layout.2998 """Selects a macro, while storing information about page layout.
29992999
3000 view/macro:page3000 view/macro:page
3001 view/macro:page/onecolumn3001 view/macro:page/main_side
3002 view/macro:page/applicationhome3002 view/macro:page/main_only
3003 view/macro:page/pillarindex3003 view/macro:page/searchless
3004 view/macro:page/freeform3004 view/macro:page/locationless
30053005
3006 view/macro:pagehas/applicationtabs3006 view/macro:pagehas/applicationtabs
3007 view/macro:pagehas/applicationborder
3008 view/macro:pagehas/applicationbuttons
3009 view/macro:pagehas/globalsearch3007 view/macro:pagehas/globalsearch
3010 view/macro:pagehas/heading
3011 view/macro:pagehas/pageheading
3012 view/macro:pagehas/portlets3008 view/macro:pagehas/portlets
30133009
3014 view/macro:pagetype3010 view/macro:pagetype
@@ -3017,7 +3013,6 @@
30173013
3018 implements(ITraversable)3014 implements(ITraversable)
30193015
3020 master = ViewPageTemplateFile('../templates/main-template.pt')
3021 base = ViewPageTemplateFile('../../../lp/app/templates/base-layout.pt')3016 base = ViewPageTemplateFile('../../../lp/app/templates/base-layout.pt')
30223017
3023 def __init__(self, context):3018 def __init__(self, context):
@@ -3054,7 +3049,7 @@
3054 if pagetype not in self._pagetypes:3049 if pagetype not in self._pagetypes:
3055 raise TraversalError('unknown pagetype: %s' % pagetype)3050 raise TraversalError('unknown pagetype: %s' % pagetype)
3056 self.context.__pagetype__ = pagetype3051 self.context.__pagetype__ = pagetype
3057 return self._template.macros['master']3052 return self.base.macros['master']
30583053
3059 def haspage(self, layoutelement):3054 def haspage(self, layoutelement):
3060 pagetype = getattr(self.context, '__pagetype__', None)3055 pagetype = getattr(self.context, '__pagetype__', None)
@@ -3069,15 +3064,9 @@
30693064
3070 def __init__(self,3065 def __init__(self,
3071 applicationtabs=False,3066 applicationtabs=False,
3072 applicationborder=False,
3073 applicationbuttons=False,
3074 globalsearch=False,3067 globalsearch=False,
3075 heading=False,
3076 pageheading=True,
3077 portlets=False,3068 portlets=False,
3078 pagetypewasset=True,3069 pagetypewasset=True,
3079 actionsmenu=True,
3080 navigationtabs=False
3081 ):3070 ):
3082 self.elements = vars()3071 self.elements = vars()
30833072
@@ -3085,108 +3074,25 @@
3085 return self.elements[name]3074 return self.elements[name]
30863075
3087 _pagetypes = {3076 _pagetypes = {
3088 'unset':
3089 LayoutElements(
3090 applicationborder=True,
3091 applicationtabs=True,
3092 globalsearch=True,
3093 portlets=True,
3094 pagetypewasset=False),
3095 'default':
3096 LayoutElements(
3097 applicationborder=True,
3098 applicationtabs=True,
3099 globalsearch=True,
3100 portlets=True),
3101 'default2.0':
3102 LayoutElements(
3103 actionsmenu=False,
3104 applicationborder=True,
3105 applicationtabs=True,
3106 globalsearch=True,
3107 portlets=True,
3108 navigationtabs=True),
3109 'onecolumn':
3110 LayoutElements(
3111 actionsmenu=False,
3112 applicationborder=True,
3113 applicationtabs=True,
3114 globalsearch=True,
3115 navigationtabs=True,
3116 portlets=False),
3117 'applicationhome':
3118 LayoutElements(
3119 applicationborder=True,
3120 applicationbuttons=True,
3121 applicationtabs=True,
3122 globalsearch=True,
3123 pageheading=False,
3124 heading=True),
3125 'pillarindex':
3126 LayoutElements(
3127 applicationborder=True,
3128 applicationbuttons=True,
3129 globalsearch=True,
3130 heading=True,
3131 pageheading=False,
3132 portlets=True),
3133 'search':
3134 LayoutElements(
3135 actionsmenu=False,
3136 applicationborder=True,
3137 applicationtabs=True,
3138 globalsearch=False,
3139 heading=False,
3140 pageheading=False,
3141 portlets=False),
3142 'freeform':
3143 LayoutElements(),
3144 'main_side':3077 'main_side':
3145 LayoutElements(3078 LayoutElements(
3146 actionsmenu=False,
3147 applicationborder=False,
3148 applicationtabs=True,3079 applicationtabs=True,
3149 globalsearch=True,3080 globalsearch=True,
3150 heading=False,
3151 pageheading=False,
3152 portlets=True),3081 portlets=True),
3153 'main_only':3082 'main_only':
3154 LayoutElements(3083 LayoutElements(
3155 actionsmenu=False,
3156 applicationborder=False,
3157 applicationtabs=True,3084 applicationtabs=True,
3158 globalsearch=True,3085 globalsearch=True,
3159 heading=False,
3160 pageheading=False,
3161 portlets=False),3086 portlets=False),
3162 'searchless':3087 'searchless':
3163 LayoutElements(3088 LayoutElements(
3164 actionsmenu=False,
3165 applicationborder=False,
3166 applicationtabs=True,3089 applicationtabs=True,
3167 globalsearch=False,3090 globalsearch=False,
3168 heading=False,
3169 pageheading=False,
3170 portlets=False),3091 portlets=False),
3171 'locationless':3092 'locationless':
3172 LayoutElements(),3093 LayoutElements(),
3173 }3094 }
31743095
3175 _3_0_pagetypes = [
3176 'main_side',
3177 'main_only',
3178 'searchless',
3179 'locationless',
3180 ]
3181
3182 @property
3183 def _template(self):
3184 """Return the ViewPageTemplateFile used by layout."""
3185 if self.context.__pagetype__ in self._3_0_pagetypes:
3186 return self.base
3187 else:
3188 return self.master
3189
31903096
3191class TranslationGroupFormatterAPI(ObjectFormatterAPI):3097class TranslationGroupFormatterAPI(ObjectFormatterAPI):
3192 """Adapter for `ITranslationGroup` objects to a formatted string."""3098 """Adapter for `ITranslationGroup` objects to a formatted string."""
31933099
=== modified file 'lib/canonical/launchpad/zcml/launchpad.zcml'
--- lib/canonical/launchpad/zcml/launchpad.zcml 2009-09-18 13:24:29 +0000
+++ lib/canonical/launchpad/zcml/launchpad.zcml 2009-11-23 17:20:28 +0000
@@ -9,17 +9,6 @@
9 xmlns:xmlrpc="http://namespaces.zope.org/xmlrpc"9 xmlns:xmlrpc="http://namespaces.zope.org/xmlrpc"
10 i18n_domain="canonical.launchpad">10 i18n_domain="canonical.launchpad">
1111
12 <!-- XXX: Steve Alexander 2004-11-24:
13 yuck... registering a main template as a view for everything.
14 This should be a non-published resource.
15 -->
16 <browser:page
17 name="main_template"
18 for="*"
19 permission="zope.Public"
20 template="../templates/main-template.pt"
21 />
22
23 <!-- Error pages -->12 <!-- Error pages -->
24 <!-- System Errors -->13 <!-- System Errors -->
25 <browser:page14 <browser:page
@@ -168,13 +157,6 @@
168 permission="zope.Public"157 permission="zope.Public"
169 />158 />
170159
171 <browser:page
172 for="*"
173 name="+main-template-macros"
174 template="../templates/main-template-macros.pt"
175 permission="zope.Public"
176 />
177
178 <!-- Macros for the forbidden pages; used by launchpad-forbidden.pt and160 <!-- Macros for the forbidden pages; used by launchpad-forbidden.pt and
179 shipit-forbidden.pt, initially. -->161 shipit-forbidden.pt, initially. -->
180 <browser:page162 <browser:page
181163
=== modified file 'lib/canonical/widgets/location.py'
--- lib/canonical/widgets/location.py 2009-06-25 05:30:52 +0000
+++ lib/canonical/widgets/location.py 2009-11-23 17:20:28 +0000
@@ -57,7 +57,7 @@
57 def __init__(self, context, request):57 def __init__(self, context, request):
58 # This widget makes use of javascript for googlemaps and58 # This widget makes use of javascript for googlemaps and
59 # json-handling, so we flag that in the request so that our59 # json-handling, so we flag that in the request so that our
60 # main-template includes the necessary javascript files.60 # base-layout includes the necessary javascript files.
61 request.needs_json = True61 request.needs_json = True
62 request.needs_gmap2 = True62 request.needs_gmap2 = True
63 super(LocationWidget, self).__init__(context, request)63 super(LocationWidget, self).__init__(context, request)
6464
=== modified file 'lib/lp/app/browser/configure.zcml'
--- lib/lp/app/browser/configure.zcml 2009-09-08 22:42:42 +0000
+++ lib/lp/app/browser/configure.zcml 2009-11-23 17:20:28 +0000
@@ -16,6 +16,12 @@
16 />16 />
17 <browser:page17 <browser:page
18 for="*"18 for="*"
19 name="+main-template-macros"
20 template="../templates/base-layout-macros.pt"
21 permission="zope.Public"
22 />
23 <browser:page
24 for="*"
19 name="+related-pages"25 name="+related-pages"
20 class="canonical.launchpad.browser.launchpad.NavigationMenuTabs"26 class="canonical.launchpad.browser.launchpad.NavigationMenuTabs"
21 template="../templates/navigationmenu-related-pages.pt"27 template="../templates/navigationmenu-related-pages.pt"
2228
=== modified file 'lib/lp/app/templates/base-layout-macros.pt'
--- lib/lp/app/templates/base-layout-macros.pt 2009-11-10 21:49:38 +0000
+++ lib/lp/app/templates/base-layout-macros.pt 2009-11-23 17:20:28 +0000
@@ -271,8 +271,7 @@
271 devmode modules/canonical.config/config/devmode">271 devmode modules/canonical.config/config/devmode">
272 <tal:comment replace="nothing">272 <tal:comment replace="nothing">
273 This macro loads the old stylesheet, then the YUI CSS, and finally273 This macro loads the old stylesheet, then the YUI CSS, and finally
274 the new stylesheet. When no pages use main-template, this can be274 the new stylesheet.
275 refactored.
276 </tal:comment>275 </tal:comment>
277 <metal:old-style-sheet use-macro="context/@@+base-layout-macros/launchpad-stylesheet" />276 <metal:old-style-sheet use-macro="context/@@+base-layout-macros/launchpad-stylesheet" />
278 <link rel="stylesheet" type="text/css"277 <link rel="stylesheet" type="text/css"
279278
=== modified file 'lib/lp/registry/browser/productrelease.py'
--- lib/lp/registry/browser/productrelease.py 2009-09-11 16:11:43 +0000
+++ lib/lp/registry/browser/productrelease.py 2009-11-23 17:20:28 +0000
@@ -185,7 +185,7 @@
185185
186 def initialize(self):186 def initialize(self):
187 # The dynamically loaded milestone form needs this javascript187 # The dynamically loaded milestone form needs this javascript
188 # enabled in the main-template.pt.188 # enabled in the base-layout.
189 self.request.needs_datepicker_iframe = True189 self.request.needs_datepicker_iframe = True
190 super(ProductReleaseFromSeriesAddView, self).initialize()190 super(ProductReleaseFromSeriesAddView, self).initialize()
191191
192192
=== modified file 'lib/lp/registry/browser/team.py'
--- lib/lp/registry/browser/team.py 2009-10-22 18:37:29 +0000
+++ lib/lp/registry/browser/team.py 2009-11-23 17:20:28 +0000
@@ -1013,7 +1013,7 @@
1013 limit = None1013 limit = None
10141014
1015 def initialize(self):1015 def initialize(self):
1016 # Tell our main-template to include Google's gmap2 javascript so that1016 # Tell our base-layout to include Google's gmap2 javascript so that
1017 # we can render the map.1017 # we can render the map.
1018 if self.mapped_participants_count > 0:1018 if self.mapped_participants_count > 0:
1019 self.request.needs_gmap2 = True1019 self.request.needs_gmap2 = True
10201020
=== modified file 'lib/lp/registry/templates/object-timeline-graph.pt'
--- lib/lp/registry/templates/object-timeline-graph.pt 2009-09-28 20:48:08 +0000
+++ lib/lp/registry/templates/object-timeline-graph.pt 2009-11-23 17:20:28 +0000
@@ -10,11 +10,11 @@
10>10>
11<head>11<head>
12 <metal:launchpad-stylesheet12 <metal:launchpad-stylesheet
13 use-macro="context/@@+main-template-macros/launchpad-stylesheet" />13 use-macro="context/@@+base-layout-macros/launchpad-stylesheet" />
14 <metal:load-javascript14 <metal:load-javascript
15 use-macro="context/@@+main-template-macros/load-javascript" />15 use-macro="context/@@+base-layout-macros/load-javascript" />
16 <metal:lp-client-cache16 <metal:lp-client-cache
17 use-macro="context/@@+main-template-macros/lp-client-cache" />17 use-macro="context/@@+base-layout-macros/lp-client-cache" />
18</head>18</head>
1919
20<body style="margin: 0; padding: 0">20<body style="margin: 0; padding: 0">
2121
=== modified file 'lib/lp/services/openid/browser/configure.zcml'
--- lib/lp/services/openid/browser/configure.zcml 2009-07-17 02:25:09 +0000
+++ lib/lp/services/openid/browser/configure.zcml 2009-11-23 17:20:28 +0000
@@ -48,6 +48,7 @@
48 <browser:page48 <browser:page
49 for="..interfaces.openidrpconfig.IOpenIDRPConfigSet"49 for="..interfaces.openidrpconfig.IOpenIDRPConfigSet"
50 name="+index"50 name="+index"
51 class=".openidrpconfig.OpenIDRPConfigSetView"
51 permission="launchpad.Admin"52 permission="launchpad.Admin"
52 template="../templates/openidrpconfigset-index.pt"53 template="../templates/openidrpconfigset-index.pt"
53 />54 />
5455
=== modified file 'lib/lp/services/openid/browser/openidrpconfig.py'
--- lib/lp/services/openid/browser/openidrpconfig.py 2009-07-17 02:25:09 +0000
+++ lib/lp/services/openid/browser/openidrpconfig.py 2009-11-23 17:20:28 +0000
@@ -19,6 +19,7 @@
19from canonical.launchpad.webapp import (19from canonical.launchpad.webapp import (
20 LaunchpadEditFormView, LaunchpadFormView, Navigation, action,20 LaunchpadEditFormView, LaunchpadFormView, Navigation, action,
21 canonical_url, custom_widget)21 canonical_url, custom_widget)
22from canonical.launchpad.webapp.publisher import LaunchpadView
22from canonical.widgets import LabeledMultiCheckBoxWidget23from canonical.widgets import LabeledMultiCheckBoxWidget
23from canonical.widgets.image import ImageChangeWidget24from canonical.widgets.image import ImageChangeWidget
24from lp.registry.interfaces.person import PersonCreationRationale25from lp.registry.interfaces.person import PersonCreationRationale
@@ -38,6 +39,11 @@
38 return getUtility(IOpenIDRPConfigSet).get(config_id)39 return getUtility(IOpenIDRPConfigSet).get(config_id)
3940
4041
42class OpenIDRPConfigSetView(LaunchpadView):
43 page_title = 'OpenID Relying Party Configurations'
44 label = page_title
45
46
41class OpenIDRPConfigAddView(LaunchpadFormView):47class OpenIDRPConfigAddView(LaunchpadFormView):
42 """View class for adding new RP configurations."""48 """View class for adding new RP configurations."""
4349
@@ -47,6 +53,8 @@
47 'auto_authorize']53 'auto_authorize']
48 custom_widget('logo', ImageChangeWidget, ImageChangeWidget.ADD_STYLE)54 custom_widget('logo', ImageChangeWidget, ImageChangeWidget.ADD_STYLE)
49 custom_widget('allowed_sreg', LabeledMultiCheckBoxWidget)55 custom_widget('allowed_sreg', LabeledMultiCheckBoxWidget)
56 label = 'Add an OpenID Relying Party Configuration'
57 page_title = label
5058
51 initial_values = {59 initial_values = {
52 'creation_rationale':60 'creation_rationale':
@@ -73,10 +81,18 @@
73 def next_url(self):81 def next_url(self):
74 return canonical_url(getUtility(IOpenIDRPConfigSet))82 return canonical_url(getUtility(IOpenIDRPConfigSet))
7583
84 cancel_url = next_url
85
7686
77class OpenIDRPConfigEditView(LaunchpadEditFormView):87class OpenIDRPConfigEditView(LaunchpadEditFormView):
78 """View class for editing or removing RP configurations."""88 """View class for editing or removing RP configurations."""
7989
90 @property
91 def label(self):
92 return 'Edit Relying Party Configuration for %s' % (
93 self.context.displayname)
94 page_title = label
95
80 schema = IOpenIDRPConfig96 schema = IOpenIDRPConfig
81 field_names = ['trust_root', 'displayname', 'description', 'logo',97 field_names = ['trust_root', 'displayname', 'description', 'logo',
82 'allowed_sreg', 'creation_rationale', 'can_query_any_team',98 'allowed_sreg', 'creation_rationale', 'can_query_any_team',
@@ -104,3 +120,5 @@
104 @property120 @property
105 def next_url(self):121 def next_url(self):
106 return canonical_url(getUtility(IOpenIDRPConfigSet))122 return canonical_url(getUtility(IOpenIDRPConfigSet))
123
124 cancel_url = next_url
107125
=== modified file 'lib/lp/services/openid/templates/openidrpconfig-add.pt'
--- lib/lp/services/openid/templates/openidrpconfig-add.pt 2009-07-17 17:59:07 +0000
+++ lib/lp/services/openid/templates/openidrpconfig-add.pt 2009-11-23 17:20:28 +0000
@@ -3,21 +3,13 @@
3 xmlns:tal="http://xml.zope.org/namespaces/tal"3 xmlns:tal="http://xml.zope.org/namespaces/tal"
4 xmlns:metal="http://xml.zope.org/namespaces/metal"4 xmlns:metal="http://xml.zope.org/namespaces/metal"
5 xmlns:i18n="http://xml.zope.org/namespaces/i18n"5 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
6 xml:lang="en"6 metal:use-macro="view/macro:page/main_only"
7 lang="en"
8 metal:use-macro="context/@@main_template/master"
9 i18n:domain="launchpad">7 i18n:domain="launchpad">
108
11<body>9<body>
1210
13<div metal:fill-slot="main">11<div metal:fill-slot="main">
1412 <div metal:use-macro="context/@@launchpad_form/form" />
15 <div metal:use-macro="context/@@launchpad_form/form">
16
17 <h1 metal:fill-slot="heading">Add an OpenID Relying Party Configuration</h1>
18
19 </div>
20
21</div>13</div>
2214
23</body>15</body>
2416
=== modified file 'lib/lp/services/openid/templates/openidrpconfig-edit.pt'
--- lib/lp/services/openid/templates/openidrpconfig-edit.pt 2009-07-17 17:59:07 +0000
+++ lib/lp/services/openid/templates/openidrpconfig-edit.pt 2009-11-23 17:20:28 +0000
@@ -3,21 +3,13 @@
3 xmlns:tal="http://xml.zope.org/namespaces/tal"3 xmlns:tal="http://xml.zope.org/namespaces/tal"
4 xmlns:metal="http://xml.zope.org/namespaces/metal"4 xmlns:metal="http://xml.zope.org/namespaces/metal"
5 xmlns:i18n="http://xml.zope.org/namespaces/i18n"5 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
6 xml:lang="en"6 metal:use-macro="view/macro:page/main_only"
7 lang="en"
8 metal:use-macro="context/@@main_template/master"
9 i18n:domain="launchpad">7 i18n:domain="launchpad">
108
11<body>9<body>
1210
13<div metal:fill-slot="main">11<div metal:fill-slot="main">
1412 <div metal:use-macro="context/@@launchpad_form/form" />
15 <div metal:use-macro="context/@@launchpad_form/form">
16
17 <h1 metal:fill-slot="heading">Edit OpenID Relying Party Configuration</h1>
18
19 </div>
20
21</div>13</div>
2214
23</body>15</body>
2416
=== modified file 'lib/lp/services/openid/templates/openidrpconfigset-index.pt'
--- lib/lp/services/openid/templates/openidrpconfigset-index.pt 2009-07-17 17:59:07 +0000
+++ lib/lp/services/openid/templates/openidrpconfigset-index.pt 2009-11-23 17:20:28 +0000
@@ -3,13 +3,11 @@
3 xmlns:tal="http://xml.zope.org/namespaces/tal"3 xmlns:tal="http://xml.zope.org/namespaces/tal"
4 xmlns:metal="http://xml.zope.org/namespaces/metal"4 xmlns:metal="http://xml.zope.org/namespaces/metal"
5 xmlns:i18n="http://xml.zope.org/namespaces/i18n"5 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
6 metal:use-macro="context/@@main_template/master"6 metal:use-macro="view/macro:page/main_only"
7 i18n:domain="launchpad">7 i18n:domain="launchpad">
88
9 <body>9 <body>
10 <div metal:fill-slot="main">10 <div metal:fill-slot="main">
11 <h1>OpenID Relying Party Configurations</h1>
12
13 <table class="listing" tal:condition="context/getAll">11 <table class="listing" tal:condition="context/getAll">
14 <thead>12 <thead>
15 <tr>13 <tr>