Merge lp:~barry/launchpad/445713-menus into lp:launchpad

Proposed by Barry Warsaw
Status: Merged
Merged at revision: not available
Proposed branch: lp:~barry/launchpad/445713-menus
Merge into: lp:launchpad
Diff against target: 511 lines
10 files modified
lib/lp/registry/browser/configure.zcml (+3/-4)
lib/lp/registry/browser/product.py (+1/-10)
lib/lp/registry/browser/tests/product-menus.txt (+7/-12)
lib/lp/registry/stories/product/xx-product-driver.txt (+9/-11)
lib/lp/registry/stories/product/xx-product-edit.txt (+12/-10)
lib/lp/registry/templates/product-admin.pt (+0/-17)
lib/lp/registry/templates/product-edit-people.pt (+0/-18)
lib/lp/registry/templates/product-edit.pt (+0/-23)
lib/lp/registry/templates/product-index.pt (+12/-4)
lib/lp/registry/templates/product-review-license.pt (+45/-45)
To merge this branch: bzr merge lp:~barry/launchpad/445713-menus
Reviewer Review Type Date Requested Status
Paul Hummer (community) code ui Approve
Brad Crittenden (community) ui* Approve
Review via email: mp+13093@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Barry Warsaw (barry) wrote :
Download full text (3.4 KiB)

 reviewer rockstar code ui
 reviewer bac ui

= Summary =

Bug 445713 describes an ugliness that slipped through the cracks during the UI
3.0 conversion. A project (nee product) has a +edit page that allows you to
change the details of the project. At the bottom of this page are 4 or 5
links that allow you to

 * Change details
 * Change branding
 * Change people
 * Review project
 * Administer

The problem with these is that this menu is hiding out below the "Change or
Cancel" controls. This menu should be removed and any actions which are not
already exposed, should be added to the project's +index page.

== Proposed fix ==

* Add the "Change branding" link inlined on project/+edit
* Add linked icons to the +edit-people page next to the maintainer and driver
  sections
* Replace product-edit-people.pt, product-edit.pt, and product-admin.pt with
  generic-edit.pt
* Remove all traces of the ProductEditNavigationMenu

== Pre-implementation notes ==

I briefly talked with Curtis about the page redesign.

== Implementation details ==

Along the way, I re-organized the project/+review-license page so that it was
more readable, and more accurately reflected reality. I will request that bac
review the new text.

This was my first experiment with bzr-pipelines. I ran into a few snags but I
think it generally worked well. I tried to segregate the drive-by cleanups
into a separate branch, and it would be great if you could review that too as
a follow up:

    lp:~barry/launchpad/445713-cleanups

== Tests ==

% bin/test -vv -t product-menus -t xx-product-driver -t xx-product-edt

or for a more thorough regression test:

% bin/test -vv -t product

== Demo and Q/A ==

* Visit http://launchpad.dev/firefox
* Observe that the maintainer and driver has an edit icon
* Observe that under the project description, there is a "Change branding" link
* Click on "Change branding"; this takes you to the +branding page
* Observe that there is no navigation menu below the "Change Branding" button
* Go back to http://launchpad.dev/firefox
* Click on the edit icon next to Sample Person (Maintainer)
* Observer that this takes you to the +edit-people page
* Observe that there is no navigation menu
* Enter 'salgado' in the Driver field and click "Save changes"
* Observe that Salgado is now the Driver
* Observer that the icon next to Maintainer Sample Person's name takes you to
  the +edit-people page too.

* Observe that the Change details link is already on the +index page
* Observe that the Administer link is already on the +index page
* Observe that the Review project link is already on the +index page

* Observe that http://launchpad.dev/firefox/+edit page has no navigation menu
* Observe that http://launchpad.dev/firefox/+admin page has no navigation menu
* Observe that http://launchpad.dev/firefox/+review-license page has no
  navigation menu

= Launchpad lint =

Checking for conflicts. and issues in doctests and templates.
Running jslint, xmllint, pyflakes, and pylint.
Using normal rules.

Linting changed files:
  lib/lp/registry/browser/configure.zcml
  lib/lp/registry/templates/product-index.pt
  lib/lp/registry/stories/product/xx-product-driver.txt
  li...

Read more...

Revision history for this message
Brad Crittenden (bac) wrote :

Hi Barry,

You've asked me to do a UI review but I should confess I'm not even a UI reviewer mentat. So this review isn't really worth the paper it's written on.

Despite the shady nature of my credentials I think the changes you've made are great. (Your screenshot was awful, though, as it didn't show the good bits.)

So you get an enthusiastic +0 from me. Don't spend it all in one place.

review: Approve (ui*)
Revision history for this message
Paul Hummer (rockstar) wrote :

Looks good. One thing I'd suggest for next time with a UI review is screenshots. That way, I don't actually have to set the branch up to run and such.

review: Approve (code ui)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/registry/browser/configure.zcml'
2--- lib/lp/registry/browser/configure.zcml 2009-10-05 22:14:18 +0000
3+++ lib/lp/registry/browser/configure.zcml 2009-10-08 21:10:25 +0000
4@@ -1477,7 +1477,7 @@
5 class="lp.registry.browser.product.ProductEditPeopleView">
6 <browser:page
7 name="+edit-people"
8- template="../templates/product-edit-people.pt"/>
9+ template="../../app/templates/generic-edit.pt"/>
10 </browser:pages>
11 <browser:page
12 name="+edit"
13@@ -1485,7 +1485,7 @@
14 facet="overview"
15 class="lp.registry.browser.product.ProductEditView"
16 permission="launchpad.Edit"
17- template="../templates/product-edit.pt"/>
18+ template="../../app/templates/generic-edit.pt"/>
19 <browser:page
20 name="+branding"
21 for="lp.registry.interfaces.product.IProduct"
22@@ -1499,7 +1499,7 @@
23 facet="overview"
24 class="lp.registry.browser.product.ProductAdminView"
25 permission="launchpad.Admin"
26- template="../templates/product-admin.pt"/>
27+ template="../../app/templates/generic-edit.pt"/>
28 <browser:page
29 name="+review-license"
30 for="lp.registry.interfaces.product.IProduct"
31@@ -1567,7 +1567,6 @@
32 classes="
33 ProductActionNavigationMenu
34 ProductBugsMenu
35- ProductEditNavigationMenu
36 ProductFacets
37 ProductNavigationMenu
38 ProductOverviewMenu
39
40=== modified file 'lib/lp/registry/browser/product.py'
41--- lib/lp/registry/browser/product.py 2009-10-01 16:10:42 +0000
42+++ lib/lp/registry/browser/product.py 2009-10-08 21:10:25 +0000
43@@ -15,7 +15,6 @@
44 'ProductDistributionsView',
45 'ProductDownloadFileMixin',
46 'ProductDownloadFilesView',
47- 'ProductEditNavigationMenu',
48 'ProductEditPeopleView',
49 'ProductEditView',
50 'ProductFacets',
51@@ -349,15 +348,6 @@
52 """A marker interface for the 'Change details' navigation menu."""
53
54
55-class ProductEditNavigationMenu(NavigationMenu, ProductEditLinksMixin):
56- """A sub-menu for different aspects of editing a Product's details."""
57-
58- usedfor = IProductEditMenu
59- facet = 'overview'
60- title = 'Change project'
61- links = ('edit', 'branding', 'reassign', 'review_license', 'administer')
62-
63-
64 class IProductActionMenu(Interface):
65 """A marker interface for the global action navigation menu."""
66
67@@ -390,6 +380,7 @@
68 'review_license',
69 'branchvisibility',
70 'rdf',
71+ 'branding',
72 ]
73
74 def top_contributors(self):
75
76=== modified file 'lib/lp/registry/browser/tests/product-menus.txt'
77--- lib/lp/registry/browser/tests/product-menus.txt 2009-08-12 04:27:34 +0000
78+++ lib/lp/registry/browser/tests/product-menus.txt 2009-10-08 21:10:25 +0000
79@@ -1,4 +1,6 @@
80-= The product menu classes =
81+========================
82+The product menu classes
83+========================
84
85 Each link specified by menu classes for products should be accessible.
86 In most cases, the context for links will be the product itself, which
87@@ -7,11 +9,7 @@
88 The check_menu_links() function is defined here to make it simple to
89 test all the product menu classes below.
90
91- >>> import traceback
92- >>> import sys
93- >>> import os
94 >>> from zope.component import getMultiAdapter
95- >>> from canonical.lazr.utils import safe_hasattr
96 >>> from canonical.lazr.testing.menus import make_fake_request
97 >>> from canonical.launchpad.webapp.publisher import canonical_url
98 >>> from lp.registry.interfaces.product import IProductSet
99@@ -34,8 +32,7 @@
100 ... print is_sane_menu
101
102 >>> from lp.registry.browser.product import (
103- ... ProductBugsMenu,
104- ... ProductEditNavigationMenu, ProductNavigationMenu,
105+ ... ProductBugsMenu, ProductNavigationMenu,
106 ... ProductOverviewMenu, ProductSpecificationsMenu)
107 >>> product = getUtility(IProductSet)['firefox']
108
109@@ -51,11 +48,9 @@
110 >>> check_menu_links(ProductNavigationMenu(product))
111 True
112
113- >>> check_menu_links(ProductEditNavigationMenu(product))
114- True
115-
116-
117-== ProductBranchesMenu and ProductTranslationsMenu ==
118+
119+ProductBranchesMenu and ProductTranslationsMenu
120+===============================================
121
122 We are not testing ProductBranchesMenu.code_import because it
123 points to a view (/+code-imports/+new), which is not easily tested.
124
125=== modified file 'lib/lp/registry/stories/product/xx-product-driver.txt'
126--- lib/lp/registry/stories/product/xx-product-driver.txt 2009-09-18 17:38:50 +0000
127+++ lib/lp/registry/stories/product/xx-product-driver.txt 2009-10-08 21:10:25 +0000
128@@ -1,3 +1,4 @@
129+===========================
130 Appointing a Product Driver
131 ===========================
132
133@@ -5,13 +6,9 @@
134
135 >>> browser = setupBrowser(auth='Basic test@canonical.com:test')
136 >>> browser.open('http://launchpad.dev/firefox')
137- >>> browser.getLink('Change details').click()
138- >>> browser.url
139- 'http://launchpad.dev/firefox/+edit'
140-
141- >>> browser.getLink('Change people').click()
142- >>> browser.url
143- 'http://launchpad.dev/firefox/+edit-people'
144+ >>> browser.getLink(url='+edit-people').click()
145+ >>> print browser.url
146+ http://launchpad.dev/firefox/+edit-people
147
148 >>> print browser.title
149 Change the roles of Mozilla Firefox's people...
150@@ -22,15 +19,16 @@
151 After changing the driver, the user is redirected to the overview page
152 where a message inform him of the driver change.
153
154- >>> browser.url
155- 'http://launchpad.dev/firefox'
156+ >>> print browser.url
157+ http://launchpad.dev/firefox
158
159 >>> for tag in find_tags_by_class(browser.contents, 'informational'):
160- ... tag.renderContents()
161- 'Successfully changed the driver to Sample Person'
162+ ... print tag.renderContents()
163+ Successfully changed the driver to Sample Person
164
165 Sample Person is listed as the driver of the product.
166
167 >>> main = find_main_content(browser.contents)
168 >>> print extract_text(main.find(id='driver'))
169 Driver: Sample Person
170+ ...
171
172=== modified file 'lib/lp/registry/stories/product/xx-product-edit.txt'
173--- lib/lp/registry/stories/product/xx-product-edit.txt 2009-09-23 10:17:34 +0000
174+++ lib/lp/registry/stories/product/xx-product-edit.txt 2009-10-08 21:10:25 +0000
175@@ -1,3 +1,4 @@
176+===========================
177 Product Edit and Administer
178 ===========================
179
180@@ -39,7 +40,7 @@
181
182
183 Setting Development Focus
184--------------------------
185+=========================
186
187 The Firefox product's trunk series is set as the development focus:
188
189@@ -72,7 +73,7 @@
190
191
192 Administering Products
193-----------------------
194+======================
195
196 Regular users can't access the 'Administer' link.
197
198@@ -114,7 +115,7 @@
199
200
201 Renaming Products
202------------------
203+=================
204
205 First a user adds a product named newproductname.
206
207@@ -175,7 +176,7 @@
208
209
210 Changing Maintainer and Registrant
211-----------------------------------
212+==================================
213
214 Administrators can change the owner of a project.
215
216@@ -183,6 +184,7 @@
217 ... 'http://launchpad.dev/newproductname3')
218 >>> print extract_text(find_tag_by_id(admin_browser.contents, 'owner'))
219 Maintainer: No Privileges Person
220+ ...
221
222 >>> admin_browser.open(
223 ... 'http://launchpad.dev/newproductname3/+admin')
224@@ -190,6 +192,7 @@
225 >>> admin_browser.getControl(name='field.actions.change').click()
226 >>> print extract_text(find_tag_by_id(admin_browser.contents, 'owner'))
227 Maintainer: Celso Providelo
228+ ...
229
230 And the registrant can also be changed, even though this should rarely
231 happen. The registrant is a read-only field that is set when the product
232@@ -222,7 +225,7 @@
233
234
235 Registry Experts
236-----------------
237+================
238
239 Regular Joes can't edit any old project:
240
241@@ -254,7 +257,7 @@
242
243
244 Display error when trying to remove all licenses
245-------------------------------------------------
246+================================================
247
248 After a product has one or more licenses selected, it can never again
249 have zero licenses.
250@@ -272,7 +275,7 @@
251
252
253 Launchpad developers can use the reviewer whiteboard
254-----------------------------------------------------
255+====================================================
256
257 A member of the Registry Experts team can use the reviewer whiteboard on
258 the +review-license page for storing random notes about a project. At
259@@ -325,7 +328,7 @@
260
261
262 Deactivate a product
263---------------------
264+====================
265
266 The Admins and Registry Experts can deactivate a project.
267
268@@ -379,7 +382,7 @@
269
270
271 Setting the remote project
272---------------------------
273+==========================
274
275 The remote_product field - which stores a Product's ID on the remote bug
276 tracker - can be set from the +edit page, too.
277@@ -391,4 +394,3 @@
278 >>> user_browser.open('http://launchpad.dev/thunderbird/+edit')
279 >>> print user_browser.getControl('Remote project').value
280 Thunderbird
281-
282
283=== removed file 'lib/lp/registry/templates/product-admin.pt'
284--- lib/lp/registry/templates/product-admin.pt 2009-08-03 14:38:55 +0000
285+++ lib/lp/registry/templates/product-admin.pt 1970-01-01 00:00:00 +0000
286@@ -1,17 +0,0 @@
287-<html
288- xmlns="http://www.w3.org/1999/xhtml"
289- xmlns:tal="http://xml.zope.org/namespaces/tal"
290- xmlns:metal="http://xml.zope.org/namespaces/metal"
291- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
292- metal:use-macro="view/macro:page/main_only"
293- i18n:domain="launchpad">
294- <body>
295- <div metal:fill-slot="main">
296- <div class="top-portlet">
297- <div metal:use-macro="context/@@launchpad_form/form" />
298- </div>
299-
300- <tal:menu replace="structure view/@@+related-pages" />
301- </div>
302- </body>
303-</html>
304
305=== removed file 'lib/lp/registry/templates/product-edit-people.pt'
306--- lib/lp/registry/templates/product-edit-people.pt 2009-08-03 14:38:55 +0000
307+++ lib/lp/registry/templates/product-edit-people.pt 1970-01-01 00:00:00 +0000
308@@ -1,18 +0,0 @@
309-<html
310- xmlns="http://www.w3.org/1999/xhtml"
311- xmlns:tal="http://xml.zope.org/namespaces/tal"
312- xmlns:metal="http://xml.zope.org/namespaces/metal"
313- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
314- metal:use-macro="view/macro:page/main_only"
315- i18n:domain="launchpad">
316-<body>
317- <div metal:fill-slot="main">
318- <div class="top-portlet">
319- <div metal:use-macro="context/@@launchpad_form/form" />
320- </div>
321-
322- <tal:menu replace="structure view/@@+related-pages" />
323- </div>
324-</body>
325-</html>
326-
327
328=== removed file 'lib/lp/registry/templates/product-edit.pt'
329--- lib/lp/registry/templates/product-edit.pt 2009-08-03 14:38:55 +0000
330+++ lib/lp/registry/templates/product-edit.pt 1970-01-01 00:00:00 +0000
331@@ -1,23 +0,0 @@
332-<html
333- xmlns="http://www.w3.org/1999/xhtml"
334- xmlns:tal="http://xml.zope.org/namespaces/tal"
335- xmlns:metal="http://xml.zope.org/namespaces/metal"
336- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
337- metal:use-macro="view/macro:page/main_only"
338- i18n:domain="launchpad">
339- <body>
340- <div metal:fill-slot="main">
341- <div class="top-portlet">
342- <div metal:use-macro="context/@@launchpad_form/form">
343- <p metal:fill-slot="extra_info">
344- Your changes to the <span tal:replace="context/displayname">
345- project</span> details below will be visible to other users
346- after you submit them.
347- </p>
348- </div>
349- </div>
350-
351- <tal:menu replace="structure view/@@+related-pages" />
352- </div>
353- </body>
354-</html>
355
356=== modified file 'lib/lp/registry/templates/product-index.pt'
357--- lib/lp/registry/templates/product-index.pt 2009-09-22 17:39:22 +0000
358+++ lib/lp/registry/templates/product-index.pt 2009-10-08 21:10:25 +0000
359@@ -36,6 +36,7 @@
360 detailed information about the open source project in question.
361 </div>
362
363+ <div tal:replace="structure overview_menu/branding/fmt:link" />
364 <ul id="external-links" class="horizontal"
365 tal:condition="view/has_external_links">
366 <li tal:condition="view/should_display_homepage">
367@@ -62,7 +63,10 @@
368
369 <dl id="owner" tal:condition="context/owner">
370 <dt>Maintainer:</dt>
371- <dd><a tal:replace="structure context/owner/fmt:link" /></dd>
372+ <dd>
373+ <a tal:replace="structure context/owner/fmt:link" />
374+ <a tal:replace="structure overview_menu/reassign/fmt:icon" />
375+ </dd>
376 </dl>
377
378 <dl id="aliases" tal:condition="context/aliases">
379@@ -76,9 +80,13 @@
380 <dl id="driver">
381 <dt>Driver:</dt>
382 <dd tal:condition="view/effective_driver">
383- <a tal:replace="structure view/effective_driver/fmt:link" /></dd>
384+ <a tal:replace="structure view/effective_driver/fmt:link" />
385+ <a tal:replace="structure overview_menu/reassign/fmt:icon" />
386+ </dd>
387 <dd tal:condition="not: view/effective_driver">
388- Not yet appointed.</dd>
389+ Not yet appointed.
390+ <a tal:replace="structure overview_menu/reassign/fmt:icon" />
391+ </dd>
392 </dl>
393
394 <dl id="uses" tal:define="uses_launchpad view/uses_launchpad_for">
395@@ -122,7 +130,7 @@
396 </div>
397
398 <p>
399- <a tal:replace="structure overview_menu/rdf/fmt:link" />
400+ <a tal:replace="structure overview_menu/rdf/fmt:link" />
401 </p>
402
403 <div id="project-admin-whiteboard" class="whiteboard"
404
405=== modified file 'lib/lp/registry/templates/product-review-license.pt'
406--- lib/lp/registry/templates/product-review-license.pt 2009-08-01 02:08:09 +0000
407+++ lib/lp/registry/templates/product-review-license.pt 2009-10-08 21:10:25 +0000
408@@ -12,49 +12,51 @@
409 <div metal:fill-slot="main">
410 <div class="top-portlet">
411 <div metal:use-macro="context/@@launchpad_form/form">
412- <div metal:fill-slot="extra_info">
413- <p>
414- Examine the project's overview tab first, then examine if the
415- project is using code, bugs, etc.... Mark the project reviewed now.
416- </p>
417-
418- <p>
419- Does the project appear to be legitimate? Are its licenses simple
420- and clearly open and free? Mark the project approved now.
421- </p>
422-
423- <p>
424- If the project appears legitimate, yet incomplete, that is fine.
425- Approve the project, consider sending a request to ask the owner to
426- update his project with more details because it will help him
427- get contributors.
428- </p>
429-
430- <p>
431- There are a few reasons you may want to withhold approval, and you
432- should contact the project owner if you do.
433- </p>
434-
435- <ul class="bulleted">
436- <li>
437- The project has no license.
438- </li>
439- <li>
440- The project has only Other/Open source selected as a license and
441- the license info field does not contain a URL to a license, or
442- contains the whole license
443- </li>
444- <li>
445- The Other/Open source license appears to discriminate against who
446- or how the project's work is used.
447- </li>
448- <li>
449- The project is too vague to know if it is legitimate.
450- </li>
451- </ul>
452-
453- <p>
454- If the project looks like a test, a prank, or spam, deactivate it.
455+ <div metal:fill-slot="extra_info" class="application-summary" >
456+ <h2>Granting approval</h2>
457+
458+ <ul class="bulleted">
459+ <li>Does the project use any Launchpad services, such as code or
460+ bugs? Mark the <strong>project approved</strong>
461+ and <strong>reviewed</strong> now.
462+ </li>
463+ <li>Are the project's licenses simple and obviously open source
464+ and/or free software? Does the project smell legitimate? Mark
465+ the <strong>project approved</strong>
466+ and <strong>reviewed</strong> now.
467+ </li>
468+ <li>Does the project appear legitimate but incomplete? That's fine,
469+ mark the <strong>project approved</strong>
470+ and <strong>reviewed</strong> now. Consider also sending a
471+ request to the
472+ owner asking them to update the project with more details, so as
473+ to help recruit contributors.
474+ </li>
475+ </ul>
476+
477+ <h2>Withholding approval</h2>
478+ <p>
479+ There are a few reasons you may want to withhold approval. You
480+ should always contact the project owner for clarification if you do
481+ not grant approval.
482+ </p>
483+ <ul class="bulleted">
484+ <li>The project has no license.</li>
485+ <li>The project has only <strong>Other/Open source</strong> selected
486+ as a license and the license info field does not contain a URL
487+ to a license, or contains the whole license.
488+ </li>
489+ <li>The <strong>Other/Open source</strong> license appears to
490+ discriminate against who can use the project, or how the
491+ project's work can be used.
492+ </li>
493+ <li>The project details are too vague to know if it is legitimate.
494+ </li>
495+ </ul>
496+
497+ <p>
498+ <strong>If the project looks like a test, a prank, or spam,
499+ deactivate it.</strong>
500 </p>
501
502 <input type="hidden" name="next_url"
503@@ -85,8 +87,6 @@
504 </div>
505 </div>
506 </div>
507-
508- <tal:menu replace="structure view/@@+related-pages" />
509 </div>
510
511 </body>