← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~abentley/launchpad/remove-hot-bugs into lp:launchpad

 

Aaron Bentley has proposed merging lp:~abentley/launchpad/remove-hot-bugs into lp:launchpad.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~abentley/launchpad/remove-hot-bugs/+merge/84503

= Summary =
Fix bug #887587: hot bugs view does not show the new bug listing

== Proposed fix ==
Default to +bugs view and port nicer aspecects of +bugs-index view to +bugs.
Screenshot: http://people.canonical.com/~abentley/bugs-as-home.png

== Pre-implementation notes ==
Discussed with mrevell

== Implementation details ==
Added "Add Question" to +bugs.
Changed the bug supervisor and security contact style to the style from +bugs-index.

Moved "Configure Bugtracker" link to the same box as the bug supervisor and security contact.

Moved the configuration of default pages to lib/lp/bugs/browser/configure.zcml and changed the default to +bugs.

Changed +bugs-index tests to use the +bugs-index url.

== Tests ==
bin/test -t xx-bugtarget-bugs-page.txt -t xx-distribution-bugs-page.txt -t xx-distrorelease-bugs-page.txt -t xx-front-page-info.txt -t xx-product-bugs-page.txt

== Demo and Q/A ==
Go to https://bugs.qastaging.launchpad.net/nova.  It should be the same as https://bugs.qastaging.launchpad.net/nova/+bugs and the portlets should look like the screenshot.


= Launchpad lint =

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt
  lib/lp/registry/browser/configure.zcml
  lib/lp/bugs/stories/bugs/xx-bugtarget-bugs-page.txt
  lib/lp/bugs/stories/bugs/xx-front-page-info.txt
  lib/lp/bugs/stories/bugs/xx-distribution-bugs-page.txt
  lib/lp/bugs/browser/configure.zcml
  lib/lp/bugs/templates/buglisting-default.pt
  lib/lp/bugs/browser/bugtask.py
  lib/lp/bugs/stories/bugs/xx-product-bugs-page.txt

./lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt
       1: narrative uses a moin header.
       7: source exceeds 78 characters.
      30: narrative uses a moin header.
      50: narrative uses a moin header.
./lib/lp/bugs/stories/bugs/xx-bugtarget-bugs-page.txt
       1: narrative uses a moin header.
-- 
https://code.launchpad.net/~abentley/launchpad/remove-hot-bugs/+merge/84503
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~abentley/launchpad/remove-hot-bugs into lp:launchpad.
=== modified file 'lib/lp/bugs/browser/bugtask.py'
--- lib/lp/bugs/browser/bugtask.py	2011-12-04 23:02:05 +0000
+++ lib/lp/bugs/browser/bugtask.py	2011-12-05 17:14:39 +0000
@@ -2460,8 +2460,6 @@
         bug_target = self.context.context
         if IDistribution.providedBy(bug_target):
             return (
-                'bugsupervisor',
-                'securitycontact',
                 'cve',
                 )
         elif IDistroSeries.providedBy(bug_target):
@@ -2471,8 +2469,6 @@
                 )
         elif IProduct.providedBy(bug_target):
             return (
-                'bugsupervisor',
-                'securitycontact',
                 'cve',
                 )
         elif IProductSeries.providedBy(bug_target):
@@ -2676,6 +2672,14 @@
             cache.objects.update(_getBatchInfo(batch_navigator.batch))
 
     @property
+    def show_config_portlet(self):
+        if (IDistribution.providedBy(self.context) or
+            IProduct.providedBy(self.context)):
+            return True
+        else:
+            return False
+
+    @property
     def columns_to_show(self):
         """Returns a sequence of column names to be shown in the listing."""
         upstream_context = self._upstreamContext()

=== modified file 'lib/lp/bugs/browser/configure.zcml'
--- lib/lp/bugs/browser/configure.zcml	2011-12-03 16:42:51 +0000
+++ lib/lp/bugs/browser/configure.zcml	2011-12-05 17:14:39 +0000
@@ -1198,4 +1198,36 @@
         permission="zope.Public" />
 
     </facet>
+    <browser:defaultView
+        for="lp.registry.interfaces.distribution.IDistribution"
+        layer="lp.bugs.publisher.BugsLayer"
+        name="+bugs"/>
+    <browser:defaultView
+        for="lp.registry.interfaces.distroseries.IDistroSeries"
+        layer="lp.bugs.publisher.BugsLayer"
+        name="+bugs"/>
+    <browser:defaultView
+        for="lp.registry.interfaces.distributionsourcepackage.IDistributionSourcePackage"
+        layer="lp.bugs.publisher.BugsLayer"
+        name="+bugs"/>
+    <browser:defaultView
+        for="lp.registry.interfaces.person.IPerson"
+        layer="lp.bugs.publisher.BugsLayer"
+        name="+bugs"/>
+    <browser:defaultView
+        for="lp.registry.interfaces.product.IProduct"
+        layer="lp.bugs.publisher.BugsLayer"
+        name="+bugs"/>
+    <browser:defaultView
+        for="lp.registry.interfaces.productseries.IProductSeries"
+        layer="lp.bugs.publisher.BugsLayer"
+        name="+bugs"/>
+    <browser:defaultView
+        for="lp.registry.interfaces.projectgroup.IProjectGroup"
+        name="+bugs"
+        layer="lp.bugs.publisher.BugsLayer"/>
+    <browser:defaultView
+        for="lp.registry.interfaces.sourcepackage.ISourcePackage"
+        layer="lp.bugs.publisher.BugsLayer"
+        name="+bugs"/>
 </configure>

=== modified file 'lib/lp/bugs/stories/bugs/xx-bugtarget-bugs-page.txt'
--- lib/lp/bugs/stories/bugs/xx-bugtarget-bugs-page.txt	2010-07-08 15:55:05 +0000
+++ lib/lp/bugs/stories/bugs/xx-bugtarget-bugs-page.txt	2011-12-05 17:14:39 +0000
@@ -4,7 +4,7 @@
 page to embed all its action links in the main content area, rather
 than in an 'Actions' portlet.
 
-    >>> browser.open('http://bugs.launchpad.dev/ubuntu')
+    >>> browser.open('http://bugs.launchpad.dev/ubuntu/+bugs-index')
     >>> print find_portlet(browser.contents, 'Actions')
     None
 

=== modified file 'lib/lp/bugs/stories/bugs/xx-distribution-bugs-page.txt'
--- lib/lp/bugs/stories/bugs/xx-distribution-bugs-page.txt	2011-11-25 16:51:29 +0000
+++ lib/lp/bugs/stories/bugs/xx-distribution-bugs-page.txt	2011-12-05 17:14:39 +0000
@@ -4,7 +4,7 @@
 The front page for a distribution on the bugs domain presents some basic
 information the bugs in it. It doesn't display the list of bugs.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu')
+    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu/+bugs-index')
     >>> anon_browser.title
     'Bugs : Ubuntu'
     >>> find_tag_by_id(anon_browser.contents, 'buglisting') is None
@@ -20,7 +20,7 @@
 
 It also has a link to subscribe to bug mail.
 
-    >>> user_browser.open('http://bugs.launchpad.dev/ubuntu')
+    >>> user_browser.open('http://bugs.launchpad.dev/ubuntu/+bugs-index')
     >>> user_browser.getLink('Subscribe to bug mail').click()
     >>> print user_browser.url
     http://bugs.launchpad.dev/ubuntu/+subscribe
@@ -32,7 +32,7 @@
 The Bugs frontpage for a distribution includes the number of bugs that are
 fixed in some other context.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu')
+    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu/+bugs-index')
     >>> fixed_elsewhere_link = anon_browser.getLink('Bugs fixed elsewhere')
 
 The link takes you to the list of the bugs fixed elsewhere.
@@ -52,7 +52,7 @@
 
 It also displays the number of open bugs associated with a CVE.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu')
+    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu/+bugs-index')
     >>> cve_bugs_link = anon_browser.getLink('Open CVE bugs')
 
 The link takes you to the list of bugs with CVEs linked to them.
@@ -76,7 +76,7 @@
 The bugs page displays the number of Incomplete, unattended bugs that
 can expire when the project has enabled bug expiration.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu')
+    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu/+bugs-index')
     >>> expirable_bugs_link = anon_browser.getLink(
     ...     'Incomplete bugs')
 
@@ -90,7 +90,7 @@
 Debian does not use Launchpad to track bugs; the anonymous user cannot
 see any link reporting that bugs can expire.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/debian')
+    >>> anon_browser.open('http://bugs.launchpad.dev/debian/+bugs-index')
     >>> expirable_bugs_link = anon_browser.getLink('Incomplete bugs')
     Traceback (most recent call last):
     ...

=== modified file 'lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt'
--- lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt	2011-11-25 16:51:29 +0000
+++ lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt	2011-12-05 17:14:39 +0000
@@ -1,10 +1,10 @@
 == The Distribution Release Bugs Page ==
 
-The front page for a distribution release on the bugs domain presents
+The +bugs-index page for a distribution release on the bugs domain presents
 some basic information the bugs in it. It doesn't display the list of
 bugs.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu/warty')
+    >>> anon_browser.open('http://bugs.launchpad.dev/ubuntu/warty/+bugs-index')
     >>> anon_browser.title
     'Bugs : Warty'
 

=== modified file 'lib/lp/bugs/stories/bugs/xx-front-page-info.txt'
--- lib/lp/bugs/stories/bugs/xx-front-page-info.txt	2011-03-23 16:28:51 +0000
+++ lib/lp/bugs/stories/bugs/xx-front-page-info.txt	2011-12-05 17:14:39 +0000
@@ -1,4 +1,4 @@
-A bugs home page for a project shows different information, depending
+A +bugs-index page for a project shows different information, depending
 on whether or not the project uses malone for bug tracking.
 
 By default, projects are created without using any bugtracker, malone
@@ -13,10 +13,11 @@
     ...     name='test-project', title='Simple Test Project', owner=foobar)
     >>> logout()
 
-The bugs home page for the project states that the project does
+The +bugs-index page for the project states that the project does
 not use Launchpad for bug tracking.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/test-project')
+    >>> anon_browser.open(
+    ...     'http://bugs.launchpad.dev/test-project/+bugs-index')
     >>> uses_malone_p = find_tag_by_id(anon_browser.contents, 'no-malone')
     >>> print extract_text(uses_malone_p)
     Test-project must be configured in order for Launchpad to forward bugs to
@@ -28,13 +29,14 @@
     >>> find_tag_by_id(anon_browser.contents, 'no-malone-edit') is None
     True
 
-    >>> admin_browser.open('http://bugs.launchpad.dev/test-project')
+    >>> admin_browser.open(
+    ...   'http://bugs.launchpad.dev/test-project/+bugs-index')
     >>> enable_tracker = find_tag_by_id(
     ...     admin_browser.contents, 'no-malone-edit')
     >>> print extract_text(enable_tracker)
     Configure bug tracker
 
-The bugs home page for a project using Launchpad for bug tracking
+The +bugs-index page for a project using Launchpad for bug tracking
 shows controls for setting bug supervisor and states that no
 bugs have been filed.
 
@@ -44,7 +46,7 @@
     ...     official_malone=True)
     >>> logout()
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/uses-malone')
+    >>> anon_browser.open('http://bugs.launchpad.dev/uses-malone/+bugs-index')
     >>> bug_supervisor = find_tag_by_id(
     ...     anon_browser.contents, 'bug-supervisor')
     >>> print extract_text(bug_supervisor)
@@ -68,7 +70,7 @@
     >>> login('foo.bar@xxxxxxxxxxxxx')
     >>> bug = factory.makeBug(product=uses_malone)
     >>> logout()
-    >>> anon_browser.open('http://bugs.launchpad.dev/uses-malone')
+    >>> anon_browser.open('http://bugs.launchpad.dev/uses-malone/+bugs-index')
     >>> content = find_main_content(anon_browser.contents)
     >>> print extract_text(find_tag_by_id(content, 'simple-bug-search'))
     by importance
@@ -94,7 +96,7 @@
     ...     BugTaskStatus.FIXRELEASED, user=bug.owner)
     >>> logout()
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/uses-malone')
+    >>> anon_browser.open('http://bugs.launchpad.dev/uses-malone/+bugs-index')
     >>> content = find_main_content(anon_browser.contents)
     >>> print find_tag_by_id(content, 'hot-bugs')
     None
@@ -112,14 +114,15 @@
     Advanced search
 
 Projects that use an external bug tracker will list the tracker on a
-bugs home page.
++bugs-index page.
 
     >>> login('foo.bar@xxxxxxxxxxxxx')
     >>> some_tracker = factory.makeBugTracker(
     ...     base_url='http://tracker.example.com/')
     >>> test_project.bugtracker = some_tracker
     >>> logout()
-    >>> anon_browser.open('http://bugs.launchpad.dev/test-project')
+    >>> anon_browser.open(
+    ...   'http://bugs.launchpad.dev/test-project/+bugs-index')
     >>> tracker_text = find_tag_by_id(anon_browser.contents, 'bugtracker')
     >>> print extract_text(tracker_text)
     Bugs are tracked in tracker.example.com/.
@@ -134,7 +137,8 @@
     ...     sourcepackagename='test-project-package',
     ...     in_ubuntu=True)
     >>> logout()
-    >>> anon_browser.open('http://bugs.launchpad.dev/test-project')
+    >>> anon_browser.open(
+    ...   'http://bugs.launchpad.dev/test-project/+bugs-index')
     >>> print extract_text(
     ...     find_tag_by_id(anon_browser.contents, 'also-in-ubuntu'))
     Ubuntu also tracks bugs for packages derived from this project:

=== modified file 'lib/lp/bugs/stories/bugs/xx-product-bugs-page.txt'
--- lib/lp/bugs/stories/bugs/xx-product-bugs-page.txt	2011-11-24 23:22:16 +0000
+++ lib/lp/bugs/stories/bugs/xx-product-bugs-page.txt	2011-12-05 17:14:39 +0000
@@ -1,10 +1,10 @@
 The Product Bugs Page
 ---------------------
 
-The front page for a product on the bugs domain presents some basic
+The +bugs-index page for a product on the bugs domain presents some basic
 information the bugs in it. It doesn't display the list of bugs.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/firefox')
+    >>> anon_browser.open('http://bugs.launchpad.dev/firefox/+bugs-index')
     >>> anon_browser.title
     'Bugs : Mozilla Firefox'
     >>> find_tag_by_id(anon_browser.contents, 'buglisting') is None
@@ -21,7 +21,7 @@
 It also has a link to subscribe to bug mail (which is implemented in
 JavaScript so it doesn't actually go anywhere).
 
-    >>> user_browser.open('http://bugs.launchpad.dev/firefox')
+    >>> user_browser.open('http://bugs.launchpad.dev/firefox/+bugs-index')
     >>> user_browser.getLink('Subscribe to bug mail').click()
     >>> user_browser.url
     'http://bugs.launchpad.dev/firefox/+subscribe'
@@ -31,10 +31,10 @@
 
 It also displays the number of open bugs associated with a CVE.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/evolution')
+    >>> anon_browser.open('http://bugs.launchpad.dev/evolution/+bugs-index')
     >>> cve_bugs_link = anon_browser.getLink('Open CVE bugs')
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/firefox')
+    >>> anon_browser.open('http://bugs.launchpad.dev/firefox/+bugs-index')
     >>> cve_bugs_link = anon_browser.getLink('Open CVE bugs')
 
 The link takes you to the list of bugs with CVEs linked to them.
@@ -163,7 +163,7 @@
 For each bug we have the number, title, status, importance and the time
 since the last update.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/firefox')
+    >>> anon_browser.open('http://bugs.launchpad.dev/firefox/+bugs-index')
     >>> print extract_text(
     ...     find_tag_by_id(anon_browser.contents, 'hot-bugs'))
         Summary                   Status   Importance    Last changed
@@ -213,6 +213,6 @@
 Jokosher does not have more than 10 bugs and does not have a link
 to more hot bugs.
 
-    >>> anon_browser.open('http://bugs.launchpad.dev/jokosher')
+    >>> anon_browser.open('http://bugs.launchpad.dev/jokosher/+bugs-index')
     >>> find_tag_by_id(anon_browser.contents, 'more-hot-bugs') is None
     True

=== modified file 'lib/lp/bugs/templates/buglisting-default.pt'
--- lib/lp/bugs/templates/buglisting-default.pt	2011-12-01 14:36:35 +0000
+++ lib/lp/bugs/templates/buglisting-default.pt	2011-12-05 17:14:39 +0000
@@ -100,14 +100,69 @@
 
   <tal:side metal:fill-slot="side">
     <div id="bug-portlets" tal:condition="view/should_show_bug_information">
-      <div id="involvement" class="portlet involvement">
-        <ul>
+      <div id="involvement" class="portlet">
+        <ul class="involvement">
           <li style="border: 0">
             <a href="+filebug" class="menu-link-filebug sprite bugs">
               Report a bug
             </a>
           </li>
+          <li tal:define="addquestion_url view/addquestion_url"
+              tal:condition="addquestion_url">
+            <a tal:attributes="href view/addquestion_url"
+               class="menu-link-filebug sprite answers">
+              Ask a question
+            </a>
+          </li>
         </ul>
+
+      </div>
+      <div class="portlet" tal:condition="view/show_config_portlet">
+        <tal:bugtracker
+           define="link context/menu:bugs/configure_bugtracker|nothing"
+           condition="link">
+          <ul tal:condition="link/enabled"
+              style="padding-top: 1em">
+            <li>
+              <a tal:replace="structure link/fmt:link" />
+            </li>
+          </ul>
+        </tal:bugtracker>
+        <dl tal:define="bug_supervisor context/bug_supervisor"
+            id="bug-supervisor">
+          <dt>Bug supervisor:</dt>
+          <dd>
+            <tal:none condition="not:bug_supervisor">None set</tal:none>
+            <a tal:condition="bug_supervisor"
+               tal:replace="structure bug_supervisor/fmt:link">Bob Johnson</a>
+            <tal:edit-bug-supervisor
+                condition="context/menu:bugs/bugsupervisor|nothing">
+              <a tal:define="link context/menu:bugs/bugsupervisor"
+                 tal:condition="link/enabled"
+                 tal:attributes="href link/url; title link/text">
+                <img tal:attributes="alt link/text" src="/@@/edit" />
+              </a>
+            </tal:edit-bug-supervisor>
+          </dd>
+        </dl>
+        <dl tal:define="securitycontact context/security_contact">
+          <dt id="bug-security">Security contact:</dt>
+          <dd>
+            <tal:none condition="not:securitycontact">None set</tal:none>
+            <a tal:condition="securitycontact"
+               tal:replace="structure securitycontact/fmt:link">
+              Billy Anderson
+            </a>
+            <tal:edit-securitycontact
+                condition="context/menu:bugs/securitycontact|nothing">
+              <a tal:define="link context/menu:bugs/securitycontact"
+                 tal:condition="link/enabled"
+                 tal:attributes="href link/url; title link/text">
+                <img tal:attributes="alt link/text" src="/@@/edit" />
+              </a>
+            </tal:edit-securitycontact>
+          </dd>
+        </dl>
       </div>
       <tal:menu replace="structure view/@@+related-pages" />
       <tal:do_not_show_portlets_advanced_form

=== modified file 'lib/lp/registry/browser/configure.zcml'
--- lib/lp/registry/browser/configure.zcml	2011-11-27 01:31:13 +0000
+++ lib/lp/registry/browser/configure.zcml	2011-12-05 17:14:39 +0000
@@ -71,10 +71,6 @@
     <browser:defaultView
         for="lp.registry.interfaces.distroseries.IDistroSeries"
         name="+index"/>
-    <browser:defaultView
-        for="lp.registry.interfaces.distroseries.IDistroSeries"
-        layer="lp.bugs.publisher.BugsLayer"
-        name="+bugs-index"/>
     <browser:page
         for="lp.registry.interfaces.distroseries.IDistroSeries"
         name="+macros"
@@ -329,10 +325,6 @@
         name="+index"/>
     <browser:defaultView
         for="lp.registry.interfaces.projectgroup.IProjectGroup"
-        name="+bugs"
-        layer="lp.bugs.publisher.BugsLayer"/>
-    <browser:defaultView
-        for="lp.registry.interfaces.projectgroup.IProjectGroup"
         name="+specs"
         layer="lp.blueprints.publisher.BlueprintsLayer"/>
     <browser:defaultView
@@ -456,10 +448,6 @@
         for="lp.registry.interfaces.distributionsourcepackage.IDistributionSourcePackage"
         layer="lp.answers.publisher.AnswersLayer"
         name="+questions"/>
-    <browser:defaultView
-        for="lp.registry.interfaces.distributionsourcepackage.IDistributionSourcePackage"
-        layer="lp.bugs.publisher.BugsLayer"
-        name="+bugs"/>
     <browser:url
         for="lp.registry.interfaces.distributionsourcepackage.IDistributionSourcePackage"
         path_expression="string:+source/${name}"
@@ -787,10 +775,6 @@
             for="lp.registry.interfaces.person.IPerson"
             layer="lp.blueprints.publisher.BlueprintsLayer"
             name="+specs"/>
-        <browser:defaultView
-            for="lp.registry.interfaces.person.IPerson"
-            layer="lp.bugs.publisher.BugsLayer"
-            name="+bugs"/>
         <adapter
           factory="lp.registry.browser.person.PersonXHTMLRepresentation"
           name="lazr.restful.EntryResource" />
@@ -1377,10 +1361,6 @@
         for="lp.registry.interfaces.product.IProduct"
         layer="lp.answers.publisher.AnswersLayer"
         name="+questions"/>
-    <browser:defaultView
-        for="lp.registry.interfaces.product.IProduct"
-        layer="lp.bugs.publisher.BugsLayer"
-        name="+bugs-index"/>
     <browser:navigation
         module="lp.registry.browser.product"
         classes="
@@ -1646,10 +1626,6 @@
         for="lp.registry.interfaces.productseries.IProductSeries"
         name="+specs"
         layer="lp.blueprints.publisher.BlueprintsLayer"/>
-    <browser:defaultView
-        for="lp.registry.interfaces.productseries.IProductSeries"
-        layer="lp.bugs.publisher.BugsLayer"
-        name="+bugs-index"/>
     <browser:page
         name="+get-involved"
         for="lp.registry.interfaces.productseries.IProductSeries"
@@ -1784,10 +1760,6 @@
         layer="lp.blueprints.publisher.BlueprintsLayer"/>
     <browser:defaultView
         for="lp.registry.interfaces.distribution.IDistribution"
-        layer="lp.bugs.publisher.BugsLayer"
-        name="+bugs-index"/>
-    <browser:defaultView
-        for="lp.registry.interfaces.distribution.IDistribution"
         layer="lp.answers.publisher.AnswersLayer"
         name="+questions"/>
     <browser:navigation
@@ -1993,10 +1965,6 @@
     <browser:defaultView
         for="lp.registry.interfaces.sourcepackage.ISourcePackage"
         name="+index"/>
-    <browser:defaultView
-        for="lp.registry.interfaces.sourcepackage.ISourcePackage"
-        layer="lp.bugs.publisher.BugsLayer"
-        name="+bugs"/>
     <browser:navigation
         module="lp.registry.browser.sourcepackage"
         classes="