← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~gary/launchpad/bugstructuralsubscription into lp:launchpad/db-devel

 

Gary Poster has proposed merging lp:~gary/launchpad/bugstructuralsubscription into lp:launchpad/db-devel.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~gary/launchpad/bugstructuralsubscription/+merge/47072

Move structural subscriptions from registry to bugs in preparation for merging bug subscription filters with structural subscriptions.

This is a big patch, but largely a manual one.
-- 
https://code.launchpad.net/~gary/launchpad/bugstructuralsubscription/+merge/47072
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~gary/launchpad/bugstructuralsubscription into lp:launchpad/db-devel.
=== modified file 'lib/canonical/launchpad/interfaces/_schema_circular_imports.py'
--- lib/canonical/launchpad/interfaces/_schema_circular_imports.py	2010-12-22 07:53:52 +0000
+++ lib/canonical/launchpad/interfaces/_schema_circular_imports.py	2011-01-21 19:02:35 +0000
@@ -97,7 +97,7 @@
 from lp.registry.interfaces.product import IProduct
 from lp.registry.interfaces.productseries import IProductSeries
 from lp.registry.interfaces.sourcepackage import ISourcePackage
-from lp.registry.interfaces.structuralsubscription import (
+from lp.bugs.interfaces.structuralsubscription import (
     IStructuralSubscription,
     IStructuralSubscriptionTarget,
     )

=== modified file 'lib/lp/bugs/browser/configure.zcml'
--- lib/lp/bugs/browser/configure.zcml	2011-01-11 23:01:02 +0000
+++ lib/lp/bugs/browser/configure.zcml	2011-01-21 19:02:35 +0000
@@ -1176,6 +1176,31 @@
                 BugWatchSetNavigation"/>
     </facet>
 
+    <!-- Structural subscriptions -->
+    <facet
+        facet="bugs">
+        <browser:page
+            for="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTarget"
+            name="+subscribe"
+            permission="launchpad.AnyPerson"
+            class="lp.bugs.browser.structuralsubscription.StructuralSubscriptionView"
+            template="../templates/structural-subscriptions-manage.pt"/>
+        <browser:page
+            for="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTarget"
+            name="+portlet-structural-subscribers"
+            permission="zope.Public"
+            class="lp.bugs.browser.structuralsubscription.StructuralSubscribersPortletView"
+            template="../templates/structural-subscription-target-portlet-subscribers.pt"/>
+    </facet>
+
+    <browser:url
+        for="lp.bugs.interfaces.structuralsubscription.IStructuralSubscription"
+        path_expression="string:+subscription/${subscriber/name}"
+        attribute_to_parent="target"/>
+    <browser:navigation
+        module="lp.bugs.browser.structuralsubscription"
+        classes="StructuralSubscriptionNavigation"/>
+
     <!-- Bug Subscription Filters -->
     <facet facet="bugs">
       <browser:url
@@ -1196,7 +1221,7 @@
           permission="launchpad.Edit"
           name="+edit" />
       <browser:page
-          for="lp.registry.interfaces.structuralsubscription.IStructuralSubscription"
+          for="lp.bugs.interfaces.structuralsubscription.IStructuralSubscription"
           class=".bugsubscriptionfilter.BugSubscriptionFilterCreateView"
           template="../../app/templates/generic-edit.pt"
           permission="launchpad.View"

=== renamed file 'lib/lp/registry/browser/structuralsubscription.py' => 'lib/lp/bugs/browser/structuralsubscription.py'
--- lib/lp/registry/browser/structuralsubscription.py	2010-12-20 20:16:02 +0000
+++ lib/lp/bugs/browser/structuralsubscription.py	2011-01-21 19:02:35 +0000
@@ -38,17 +38,17 @@
     LaunchpadFormView,
     )
 from lp.bugs.browser.bugsubscription import AdvancedSubscriptionMixin
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscription,
+    IStructuralSubscriptionForm,
+    IStructuralSubscriptionTarget,
+    )
 from lp.registry.enum import BugNotificationLevel
 from lp.registry.interfaces.distributionsourcepackage import (
     IDistributionSourcePackage,
     )
 from lp.registry.interfaces.milestone import IProjectGroupMilestone
 from lp.registry.interfaces.person import IPersonSet
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscription,
-    IStructuralSubscriptionForm,
-    IStructuralSubscriptionTarget,
-    )
 from lp.services.propertycache import cachedproperty
 
 

=== modified file 'lib/lp/bugs/browser/tests/test_bugsubscriptionfilter.py'
--- lib/lp/bugs/browser/tests/test_bugsubscriptionfilter.py	2011-01-14 11:02:44 +0000
+++ lib/lp/bugs/browser/tests/test_bugsubscriptionfilter.py	2011-01-21 19:02:35 +0000
@@ -25,7 +25,7 @@
     BugTaskImportance,
     BugTaskStatus,
     )
-from lp.registry.browser.structuralsubscription import (
+from lp.bugs.browser.structuralsubscription import (
     StructuralSubscriptionNavigation,
     )
 from lp.testing import (

=== renamed file 'lib/lp/registry/browser/tests/test_structuralsubscription.py' => 'lib/lp/bugs/browser/tests/test_structuralsubscription.py'
--- lib/lp/registry/browser/tests/test_structuralsubscription.py	2010-12-21 09:42:47 +0000
+++ lib/lp/bugs/browser/tests/test_structuralsubscription.py	2011-01-21 19:02:35 +0000
@@ -21,6 +21,9 @@
     DatabaseFunctionalLayer,
     LaunchpadFunctionalLayer,
     )
+from lp.bugs.browser.structuralsubscription import (
+    StructuralSubscriptionView,
+    )
 from lp.registry.browser.distribution import DistributionNavigation
 from lp.registry.browser.distributionsourcepackage import (
     DistributionSourcePackageNavigation,
@@ -30,9 +33,6 @@
 from lp.registry.browser.product import ProductNavigation
 from lp.registry.browser.productseries import ProductSeriesNavigation
 from lp.registry.browser.project import ProjectNavigation
-from lp.registry.browser.structuralsubscription import (
-    StructuralSubscriptionView,
-    )
 from lp.registry.enum import BugNotificationLevel
 from lp.testing import (
     feature_flags,

=== modified file 'lib/lp/bugs/configure.zcml'
--- lib/lp/bugs/configure.zcml	2011-01-18 20:49:35 +0000
+++ lib/lp/bugs/configure.zcml	2011-01-21 19:02:35 +0000
@@ -1055,6 +1055,41 @@
         recipient"/>
   </class>
 
+    <!-- StructuralSubscription -->
+
+    <class
+        class="lp.bugs.model.structuralsubscription.StructuralSubscription">
+        <allow
+            interface=".interfaces.structuralsubscription.IStructuralSubscriptionPublic" />
+        <require
+            set_schema=".interfaces.structuralsubscription.IStructuralSubscriptionPublic"
+            permission="zope.Public" />
+        <require
+            interface=".interfaces.structuralsubscription.IStructuralSubscriptionRestricted"
+            permission="launchpad.Edit" />
+    </class>
+    <adapter
+        factory=".model.structuralsubscription.DistroSeriesTargetHelper"
+        permission="zope.Public"/>
+    <adapter
+        factory=".model.structuralsubscription.ProjectGroupTargetHelper"
+        permission="zope.Public"/>
+    <adapter
+        factory=".model.structuralsubscription.DistributionSourcePackageTargetHelper"
+        permission="zope.Public"/>
+    <adapter
+        factory=".model.structuralsubscription.MilestoneTargetHelper"
+        permission="zope.Public"/>
+    <adapter
+        factory=".model.structuralsubscription.ProductTargetHelper"
+        permission="zope.Public"/>
+    <adapter
+        factory=".model.structuralsubscription.ProductSeriesTargetHelper"
+        permission="zope.Public"/>
+    <adapter
+        factory=".model.structuralsubscription.DistributionTargetHelper"
+        permission="zope.Public"/>
+
   <webservice:register module="lp.bugs.interfaces.webservice" />
 
 </configure>

=== renamed file 'lib/lp/registry/doc/structural-subscriptions.txt' => 'lib/lp/bugs/doc/structural-subscriptions.txt'
--- lib/lp/registry/doc/structural-subscriptions.txt	2011-01-18 21:20:48 +0000
+++ lib/lp/bugs/doc/structural-subscriptions.txt	2011-01-21 19:02:35 +0000
@@ -11,7 +11,7 @@
     >>> from lp.registry.interfaces.person import IPersonSet
     >>> from lp.registry.interfaces.product import IProductSet
     >>> from lp.registry.interfaces.sourcepackagename import ISourcePackageNameSet
-    >>> from lp.registry.model.structuralsubscription import (
+    >>> from lp.bugs.model.structuralsubscription import (
     ...    StructuralSubscription)
 
     >>> person_set = getUtility(IPersonSet)

=== modified file 'lib/lp/bugs/interfaces/bugsubscriptionfilter.py'
--- lib/lp/bugs/interfaces/bugsubscriptionfilter.py	2011-01-11 12:00:44 +0000
+++ lib/lp/bugs/interfaces/bugsubscriptionfilter.py	2011-01-21 19:02:35 +0000
@@ -29,7 +29,7 @@
     BugTaskImportance,
     BugTaskStatus,
     )
-from lp.registry.interfaces.structuralsubscription import (
+from lp.bugs.interfaces.structuralsubscription import (
     IStructuralSubscription,
     )
 from lp.services.fields import SearchTag

=== renamed file 'lib/lp/registry/interfaces/structuralsubscription.py' => 'lib/lp/bugs/interfaces/structuralsubscription.py'
=== modified file 'lib/lp/bugs/interfaces/webservice.py'
--- lib/lp/bugs/interfaces/webservice.py	2010-12-20 20:16:02 +0000
+++ lib/lp/bugs/interfaces/webservice.py	2011-01-21 19:02:35 +0000
@@ -31,6 +31,8 @@
     'ICveSet',
     'IHasBugs',
     'IMaloneApplication',
+    'IStructuralSubscription',
+    'IStructuralSubscriptionTarget',
     'IllegalRelatedBugTasksParams',
     'IllegalTarget',
     'NominationError',
@@ -83,6 +85,10 @@
     ICveSet,
     )
 from lp.bugs.interfaces.malone import IMaloneApplication
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscription,
+    IStructuralSubscriptionTarget,
+    )
 
 
 

=== modified file 'lib/lp/bugs/model/bug.py'
--- lib/lp/bugs/model/bug.py	2011-01-14 11:04:24 +0000
+++ lib/lp/bugs/model/bug.py	2011-01-21 19:02:35 +0000
@@ -147,6 +147,9 @@
 from lp.bugs.interfaces.bugtracker import BugTrackerType
 from lp.bugs.interfaces.bugwatch import IBugWatchSet
 from lp.bugs.interfaces.cve import ICveSet
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    )
 from lp.bugs.mail.bugnotificationrecipients import BugNotificationRecipients
 from lp.bugs.model.bugattachment import BugAttachment
 from lp.bugs.model.bugbranch import BugBranch
@@ -175,9 +178,6 @@
 from lp.registry.interfaces.productseries import IProductSeries
 from lp.registry.interfaces.series import SeriesStatus
 from lp.registry.interfaces.sourcepackage import ISourcePackage
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    )
 from lp.registry.model.person import (
     Person,
     person_sort_key,

=== modified file 'lib/lp/bugs/model/bugtask.py'
--- lib/lp/bugs/model/bugtask.py	2011-01-20 04:50:35 +0000
+++ lib/lp/bugs/model/bugtask.py	2011-01-21 19:02:35 +0000
@@ -125,8 +125,12 @@
     UserCannotEditBugTaskMilestone,
     UserCannotEditBugTaskStatus,
     )
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    )
 from lp.bugs.model.bugnomination import BugNomination
 from lp.bugs.model.bugsubscription import BugSubscription
+from lp.bugs.model.structuralsubscription import StructuralSubscription
 from lp.registry.enum import BugNotificationLevel
 from lp.registry.interfaces.distribution import (
     IDistribution,
@@ -157,12 +161,8 @@
 from lp.registry.interfaces.projectgroup import IProjectGroup
 from lp.registry.interfaces.sourcepackage import ISourcePackage
 from lp.registry.interfaces.sourcepackagename import ISourcePackageNameSet
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    )
 from lp.registry.model.pillar import pillar_sort_key
 from lp.registry.model.sourcepackagename import SourcePackageName
-from lp.registry.model.structuralsubscription import StructuralSubscription
 from lp.services.propertycache import get_property_cache
 from lp.soyuz.enums import PackagePublishingStatus
 from lp.soyuz.model.publishing import SourcePackagePublishingHistory

=== renamed file 'lib/lp/registry/model/structuralsubscription.py' => 'lib/lp/bugs/model/structuralsubscription.py'
--- lib/lp/registry/model/structuralsubscription.py	2011-01-20 20:11:53 +0000
+++ lib/lp/bugs/model/structuralsubscription.py	2011-01-21 19:02:35 +0000
@@ -69,7 +69,7 @@
 from lp.registry.interfaces.product import IProduct
 from lp.registry.interfaces.productseries import IProductSeries
 from lp.registry.interfaces.projectgroup import IProjectGroup
-from lp.registry.interfaces.structuralsubscription import (
+from lp.bugs.interfaces.structuralsubscription import (
     IStructuralSubscription,
     IStructuralSubscriptionTarget,
     IStructuralSubscriptionTargetHelper,

=== modified file 'lib/lp/bugs/model/tests/test_bug.py'
--- lib/lp/bugs/model/tests/test_bug.py	2010-11-12 18:05:45 +0000
+++ lib/lp/bugs/model/tests/test_bug.py	2011-01-21 19:02:35 +0000
@@ -4,9 +4,9 @@
 __metaclass__ = type
 
 from canonical.testing.layers import DatabaseFunctionalLayer
+from lp.bugs.model.structuralsubscription import StructuralSubscription
 from lp.registry.enum import BugNotificationLevel
 from lp.registry.interfaces.person import PersonVisibility
-from lp.registry.model.structuralsubscription import StructuralSubscription
 from lp.testing import (
     login_person,
     person_logged_in,

=== modified file 'lib/lp/bugs/security.py'
--- lib/lp/bugs/security.py	2010-10-04 11:16:57 +0000
+++ lib/lp/bugs/security.py	2011-01-21 19:02:35 +0000
@@ -20,7 +20,7 @@
 from lp.bugs.interfaces.bugsubscriptionfilter import IBugSubscriptionFilter
 from lp.bugs.interfaces.bugtracker import IBugTracker
 from lp.bugs.interfaces.bugwatch import IBugWatch
-
+from lp.bugs.interfaces.structuralsubscription import IStructuralSubscription
 
 class EditBugNominationStatus(AuthorizationBase):
     permission = 'launchpad.Driver'
@@ -174,6 +174,16 @@
             user.in_launchpad_developers)
 
 
+class EditStructuralSubscription(AuthorizationBase):
+    """Edit permissions for `IStructuralSubscription`."""
+    permission = "launchpad.Edit"
+    usedfor = IStructuralSubscription
+
+    def checkAuthenticated(self, user):
+        """Subscribers can edit their own structural subscriptions."""
+        return user.inTeam(self.obj.subscriber)
+
+
 class EditBugSubscriptionFilter(AuthorizationBase):
     """Bug subscription filters may only be modified by the subscriber."""
     permission = 'launchpad.Edit'

=== renamed file 'lib/lp/registry/templates/structural-subscription-target-portlet-subscribers.pt' => 'lib/lp/bugs/templates/structural-subscription-target-portlet-subscribers.pt'
=== renamed file 'lib/lp/registry/templates/structural-subscriptions-manage.pt' => 'lib/lp/bugs/templates/structural-subscriptions-manage.pt'
=== renamed file 'lib/lp/registry/tests/structural-subscription-target.txt' => 'lib/lp/bugs/tests/structural-subscription-target.txt'
=== modified file 'lib/lp/bugs/tests/test_bugcontact.py'
--- lib/lp/bugs/tests/test_bugcontact.py	2010-10-04 19:50:45 +0000
+++ lib/lp/bugs/tests/test_bugcontact.py	2011-01-21 19:02:35 +0000
@@ -12,7 +12,7 @@
     tearDown,
     )
 from canonical.testing.layers import DatabaseFunctionalLayer
-from lp.registry.tests.test_structuralsubscriptiontarget import (
+from lp.bugs.tests.test_structuralsubscriptiontarget import (
     distributionSetUp,
     productSetUp,
     )

=== renamed file 'lib/lp/registry/tests/test_structuralsubscription.py' => 'lib/lp/bugs/tests/test_structuralsubscription.py'
=== renamed file 'lib/lp/registry/tests/test_structuralsubscriptiontarget.py' => 'lib/lp/bugs/tests/test_structuralsubscriptiontarget.py'
--- lib/lp/registry/tests/test_structuralsubscriptiontarget.py	2010-11-26 17:08:03 +0000
+++ lib/lp/bugs/tests/test_structuralsubscriptiontarget.py	2011-01-21 19:02:35 +0000
@@ -32,6 +32,11 @@
     BugTaskImportance,
     BugTaskStatus,
     )
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    IStructuralSubscriptionTargetHelper,
+    )
+from lp.bugs.model.structuralsubscription import StructuralSubscription
 from lp.bugs.tests.test_bugtarget import bugtarget_filebug
 from lp.registry.enum import BugNotificationLevel
 from lp.registry.errors import (
@@ -41,11 +46,6 @@
 from lp.registry.interfaces.distribution import IDistributionSet
 from lp.registry.interfaces.product import IProductSet
 from lp.registry.interfaces.sourcepackagename import ISourcePackageNameSet
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    IStructuralSubscriptionTargetHelper,
-    )
-from lp.registry.model.structuralsubscription import StructuralSubscription
 from lp.testing import (
     ANONYMOUS,
     login,

=== modified file 'lib/lp/registry/browser/configure.zcml'
--- lib/lp/registry/browser/configure.zcml	2011-01-19 22:53:32 +0000
+++ lib/lp/registry/browser/configure.zcml	2011-01-21 19:02:35 +0000
@@ -2280,29 +2280,6 @@
         template="../templates/sourcepackage-remove-packaging.pt"
         />
 
-    <browser:page
-        for="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTarget"
-        name="+subscribe"
-        permission="launchpad.AnyPerson"
-        facet="bugs"
-        class="lp.registry.browser.structuralsubscription.StructuralSubscriptionView"
-        template="../templates/structural-subscriptions-manage.pt"/>
-    <browser:page
-        for="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTarget"
-        name="+portlet-structural-subscribers"
-        facet="bugs"
-        permission="zope.Public"
-        class="lp.registry.browser.structuralsubscription.StructuralSubscribersPortletView"
-        template="../templates/structural-subscription-target-portlet-subscribers.pt"/>
-
-    <browser:url
-        for="lp.registry.interfaces.structuralsubscription.IStructuralSubscription"
-        path_expression="string:+subscription/${subscriber/name}"
-        attribute_to_parent="target"/>
-    <browser:navigation
-        module="lp.registry.browser.structuralsubscription"
-        classes="StructuralSubscriptionNavigation"/>
-
     <browser:url
         for="lp.registry.interfaces.personproduct.IPersonProduct"
         path_expression="product/name"

=== modified file 'lib/lp/registry/browser/distribution.py'
--- lib/lp/registry/browser/distribution.py	2011-01-18 21:44:21 +0000
+++ lib/lp/registry/browser/distribution.py	2011-01-21 19:02:35 +0000
@@ -81,6 +81,9 @@
     HasSpecificationsMenuMixin,
     )
 from lp.bugs.browser.bugtask import BugTargetTraversalMixin
+from lp.bugs.browser.structuralsubscription import (
+    StructuralSubscriptionTargetTraversalMixin,
+    )
 from lp.registry.browser import RegistryEditFormView
 from lp.registry.browser.announcement import HasAnnouncementsView
 from lp.registry.browser.menu import (
@@ -88,9 +91,6 @@
     RegistryCollectionActionMenuBase,
     )
 from lp.registry.browser.pillar import PillarBugsMenu
-from lp.registry.browser.structuralsubscription import (
-    StructuralSubscriptionTargetTraversalMixin,
-    )
 from lp.registry.interfaces.distribution import (
     IDerivativeDistribution,
     IDistribution,

=== modified file 'lib/lp/registry/browser/distributionsourcepackage.py'
--- lib/lp/registry/browser/distributionsourcepackage.py	2010-12-02 16:14:30 +0000
+++ lib/lp/registry/browser/distributionsourcepackage.py	2011-01-21 19:02:35 +0000
@@ -59,11 +59,11 @@
 from lp.app.browser.tales import CustomizableFormatter
 from lp.app.interfaces.launchpad import IServiceUsage
 from lp.bugs.browser.bugtask import BugTargetTraversalMixin
+from lp.bugs.browser.structuralsubscription import (
+    StructuralSubscriptionTargetTraversalMixin,
+    )
 from lp.bugs.interfaces.bug import IBugSet
 from lp.registry.browser.pillar import PillarBugsMenu
-from lp.registry.browser.structuralsubscription import (
-    StructuralSubscriptionTargetTraversalMixin,
-    )
 from lp.registry.interfaces.distributionsourcepackage import (
     IDistributionSourcePackage,
     )

=== modified file 'lib/lp/registry/browser/distroseries.py'
--- lib/lp/registry/browser/distroseries.py	2010-11-23 23:22:27 +0000
+++ lib/lp/registry/browser/distroseries.py	2011-01-21 19:02:35 +0000
@@ -70,11 +70,11 @@
     HasSpecificationsMenuMixin,
     )
 from lp.bugs.browser.bugtask import BugTargetTraversalMixin
-from lp.registry.browser import MilestoneOverlayMixin
-from lp.registry.browser.structuralsubscription import (
+from lp.bugs.browser.structuralsubscription import (
     StructuralSubscriptionMenuMixin,
     StructuralSubscriptionTargetTraversalMixin,
     )
+from lp.registry.browser import MilestoneOverlayMixin
 from lp.registry.interfaces.distroseries import IDistroSeries
 from lp.registry.interfaces.distroseriesdifference import (
     IDistroSeriesDifferenceSource,

=== modified file 'lib/lp/registry/browser/milestone.py'
--- lib/lp/registry/browser/milestone.py	2011-01-19 21:43:54 +0000
+++ lib/lp/registry/browser/milestone.py	2011-01-21 19:02:35 +0000
@@ -55,16 +55,16 @@
     LaunchpadFormView,
     )
 from lp.bugs.browser.bugtask import BugTaskListingItem
+from lp.bugs.browser.structuralsubscription import (
+    StructuralSubscriptionMenuMixin,
+    StructuralSubscriptionTargetTraversalMixin,
+    )
 from lp.bugs.interfaces.bugtask import IBugTaskSet
 from lp.registry.browser import (
     get_status_counts,
     RegistryDeleteViewMixin,
     )
 from lp.registry.browser.product import ProductDownloadFileMixin
-from lp.registry.browser.structuralsubscription import (
-    StructuralSubscriptionMenuMixin,
-    StructuralSubscriptionTargetTraversalMixin,
-    )
 from lp.registry.interfaces.distroseries import IDistroSeries
 from lp.registry.interfaces.milestone import (
     IMilestone,

=== modified file 'lib/lp/registry/browser/pillar.py'
--- lib/lp/registry/browser/pillar.py	2010-10-07 13:26:53 +0000
+++ lib/lp/registry/browser/pillar.py	2011-01-21 19:02:35 +0000
@@ -35,7 +35,7 @@
     ServiceUsage,
     )
 from lp.app.interfaces.launchpad import IServiceUsage
-from lp.registry.browser.structuralsubscription import (
+from lp.bugs.browser.structuralsubscription import (
     StructuralSubscriptionMenuMixin,
     )
 from lp.registry.interfaces.distributionsourcepackage import (

=== modified file 'lib/lp/registry/browser/product.py'
--- lib/lp/registry/browser/product.py	2011-01-13 20:57:45 +0000
+++ lib/lp/registry/browser/product.py	2011-01-21 19:02:35 +0000
@@ -169,7 +169,7 @@
     PillarView,
     )
 from lp.registry.browser.productseries import get_series_branch_error
-from lp.registry.browser.structuralsubscription import (
+from lp.bugs.browser.structuralsubscription import (
     StructuralSubscriptionMenuMixin,
     StructuralSubscriptionTargetTraversalMixin,
     )

=== modified file 'lib/lp/registry/browser/productseries.py'
--- lib/lp/registry/browser/productseries.py	2010-11-26 02:49:16 +0000
+++ lib/lp/registry/browser/productseries.py	2011-01-21 19:02:35 +0000
@@ -127,7 +127,7 @@
     InvolvedMenu,
     PillarView,
     )
-from lp.registry.browser.structuralsubscription import (
+from lp.bugs.browser.structuralsubscription import (
     StructuralSubscriptionMenuMixin,
     StructuralSubscriptionTargetTraversalMixin,
     )

=== modified file 'lib/lp/registry/browser/project.py'
--- lib/lp/registry/browser/project.py	2011-01-15 00:42:50 +0000
+++ lib/lp/registry/browser/project.py	2011-01-21 19:02:35 +0000
@@ -87,7 +87,7 @@
     ProjectAddStepOne,
     ProjectAddStepTwo,
     )
-from lp.registry.browser.structuralsubscription import (
+from lp.bugs.browser.structuralsubscription import (
     StructuralSubscriptionTargetTraversalMixin,
     )
 from lp.registry.interfaces.product import IProductSet

=== modified file 'lib/lp/registry/configure.zcml'
--- lib/lp/registry/configure.zcml	2011-01-13 15:12:36 +0000
+++ lib/lp/registry/configure.zcml	2011-01-21 19:02:35 +0000
@@ -10,7 +10,6 @@
     xmlns:lp="http://namespaces.canonical.com/lp";
     xmlns:webservice="http://namespaces.canonical.com/webservice";
     i18n_domain="launchpad">
-    <authorizations module=".security" />
     <include
         file="vocabularies.zcml"/>
     <include
@@ -213,10 +212,10 @@
         <!-- IStructuralSubscriptionTarget -->
 
         <allow
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
         <require
             permission="launchpad.AnyPerson"
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
 
     </class>
     <securedutility
@@ -235,9 +234,6 @@
         for="lp.registry.interfaces.distroseries.IDistroSeries"
         factory="lp.registry.browser.distroseries.DistroSeriesBreadcrumb"
         permission="zope.Public"/>
-    <adapter
-        factory=".model.structuralsubscription.DistroSeriesTargetHelper"
-        permission="zope.Public"/>
 
     <facet
         facet="overview">
@@ -351,10 +347,10 @@
         <!-- IStructuralSubscriptionTarget -->
 
         <allow
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
         <require
             permission="launchpad.AnyPerson"
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
 
         <require
             permission="launchpad.Admin"
@@ -391,9 +387,6 @@
         for="lp.registry.interfaces.projectgroup.IProjectGroupSet"
         factory="lp.registry.browser.project.ProjectSetBreadcrumb"
         permission="zope.Public"/>
-    <adapter
-        factory=".model.structuralsubscription.ProjectGroupTargetHelper"
-        permission="zope.Public"/>
 
     <facet
         facet="answers"/>
@@ -485,10 +478,10 @@
         <!-- IStructuralSubscriptionTarget -->
 
         <allow
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
         <require
             permission="launchpad.AnyPerson"
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
 
         <!-- IQuestionTarget -->
 
@@ -525,9 +518,6 @@
     <adapter
         factory="lp.registry.browser.distributionsourcepackage.distribution_from_distributionsourcepackage"/>
     <adapter
-        factory=".model.structuralsubscription.DistributionSourcePackageTargetHelper"
-        permission="zope.Public"/>
-    <adapter
         factory="lp.registry.browser.distributionsourcepackage.DistributionSourcePackageBreadcrumb"/>
 
     <!-- CommercialSubscription -->
@@ -987,15 +977,12 @@
         <!-- IStructuralSubscriptionTarget -->
 
         <allow
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
         <require
             permission="launchpad.AnyPerson"
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
 
     </class>
-    <adapter
-        factory=".model.structuralsubscription.MilestoneTargetHelper"
-        permission="zope.Public"/>
 
     <!-- IMilestoneSet -->
 
@@ -1274,10 +1261,10 @@
         <!-- IStructuralSubscriptionTarget -->
 
         <allow
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
         <require
             permission="launchpad.AnyPerson"
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
 
         <!-- IHasBugSupervisor -->
 
@@ -1289,9 +1276,6 @@
             attributes="
                 setBugSupervisor"/>
     </class>
-    <adapter
-        factory=".model.structuralsubscription.ProductTargetHelper"
-        permission="zope.Public"/>
 
     <!-- ProductWithLicenses
                                 This is a decorator for IProduct that eliminates an additional query
@@ -1416,10 +1400,10 @@
         <!-- IStructuralSubscriptionTarget -->
 
         <allow
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
         <require
             permission="launchpad.AnyPerson"
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
 
     </class>
     <adapter
@@ -1437,9 +1421,6 @@
         for="lp.registry.interfaces.productseries.IProductSeries"
         factory="lp.registry.browser.productseries.ProductSeriesBreadcrumb"
         permission="zope.Public"/>
-    <adapter
-        factory=".model.structuralsubscription.ProductSeriesTargetHelper"
-        permission="zope.Public"/>
 
     <!-- This is class TimelineProductSeries -->
 
@@ -1560,10 +1541,10 @@
         <!-- IStructuralSubscriptionTarget -->
 
         <allow
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetRead" />
         <require
             permission="launchpad.AnyPerson"
-            interface="lp.registry.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
+            interface="lp.bugs.interfaces.structuralsubscription.IStructuralSubscriptionTargetWrite" />
 
         <!-- IHasBugSupervisor -->
 
@@ -1589,9 +1570,6 @@
         for="lp.registry.interfaces.distribution.IDistributionSet"
         factory="lp.registry.browser.distribution.DistributionSetBreadcrumb"
         permission="zope.Public"/>
-    <adapter
-        factory=".model.structuralsubscription.DistributionTargetHelper"
-        permission="zope.Public"/>
 
     <!-- DistributionSet -->
 
@@ -1858,20 +1836,6 @@
             interface="lp.registry.interfaces.packaging.IPackagingUtil"/>
     </securedutility>
 
-    <!-- StructuralSubscription -->
-
-    <class
-        class="lp.registry.model.structuralsubscription.StructuralSubscription">
-        <allow
-            interface=".interfaces.structuralsubscription.IStructuralSubscriptionPublic" />
-        <require
-            set_schema=".interfaces.structuralsubscription.IStructuralSubscriptionPublic"
-            permission="zope.Public" />
-        <require
-            interface=".interfaces.structuralsubscription.IStructuralSubscriptionRestricted"
-            permission="launchpad.Edit" />
-    </class>
-
     <!-- PersonNotification -->
 
     <class

=== modified file 'lib/lp/registry/interfaces/distribution.py'
--- lib/lp/registry/interfaces/distribution.py	2011-01-18 03:15:37 +0000
+++ lib/lp/registry/interfaces/distribution.py	2011-01-21 19:02:35 +0000
@@ -73,6 +73,9 @@
     IOfficialBugTagTargetRestricted,
     )
 from lp.bugs.interfaces.securitycontact import IHasSecurityContact
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    )
 from lp.registry.interfaces.announcement import IMakesAnnouncements
 from lp.registry.interfaces.distributionmirror import IDistributionMirror
 from lp.registry.interfaces.karma import IKarmaContext
@@ -82,9 +85,6 @@
     )
 from lp.registry.interfaces.pillar import IPillar
 from lp.registry.interfaces.role import IHasOwner
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    )
 from lp.services.fields import (
     Description,
     IconImageUpload,

=== modified file 'lib/lp/registry/interfaces/distributionsourcepackage.py'
--- lib/lp/registry/interfaces/distributionsourcepackage.py	2010-10-24 21:00:11 +0000
+++ lib/lp/registry/interfaces/distributionsourcepackage.py	2011-01-21 19:02:35 +0000
@@ -36,14 +36,14 @@
     IHasOfficialBugTags,
     )
 from lp.bugs.interfaces.bugtask import IBugTask
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    )
 from lp.code.interfaces.hasbranches import (
     IHasBranches,
     IHasMergeProposals,
     )
 from lp.registry.interfaces.distribution import IDistribution
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    )
 from lp.soyuz.enums import ArchivePurpose
 
 

=== modified file 'lib/lp/registry/interfaces/distroseries.py'
--- lib/lp/registry/interfaces/distroseries.py	2010-12-21 00:26:41 +0000
+++ lib/lp/registry/interfaces/distroseries.py	2011-01-21 19:02:35 +0000
@@ -63,6 +63,9 @@
     IHasBugs,
     IHasOfficialBugTags,
     )
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    )
 from lp.registry.errors import NoSuchDistroSeries
 from lp.registry.interfaces.milestone import (
     IHasMilestones,
@@ -75,9 +78,6 @@
     SeriesStatus,
     )
 from lp.registry.interfaces.sourcepackage import ISourcePackage
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    )
 from lp.services.fields import (
     ContentNameField,
     Description,

=== modified file 'lib/lp/registry/interfaces/milestone.py'
--- lib/lp/registry/interfaces/milestone.py	2011-01-11 23:43:04 +0000
+++ lib/lp/registry/interfaces/milestone.py	2011-01-21 19:02:35 +0000
@@ -54,10 +54,10 @@
     IHasOfficialBugTags,
     )
 from lp.bugs.interfaces.bugtask import IBugTask
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    )
 from lp.registry.interfaces.productrelease import IProductRelease
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    )
 from lp.services.fields import (
     ContentNameField,
     FormattableDate,

=== modified file 'lib/lp/registry/interfaces/product.py'
--- lib/lp/registry/interfaces/product.py	2011-01-13 06:07:03 +0000
+++ lib/lp/registry/interfaces/product.py	2011-01-21 19:02:35 +0000
@@ -94,6 +94,9 @@
     IOfficialBugTagTargetRestricted,
     )
 from lp.bugs.interfaces.securitycontact import IHasSecurityContact
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    )
 from lp.code.interfaces.branchvisibilitypolicy import (
     IHasBranchVisibilityPolicy,
     )
@@ -117,9 +120,6 @@
 from lp.registry.interfaces.productseries import IProductSeries
 from lp.registry.interfaces.projectgroup import IProjectGroup
 from lp.registry.interfaces.role import IHasOwner
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    )
 from lp.services.fields import (
     Description,
     IconImageUpload,

=== modified file 'lib/lp/registry/interfaces/productseries.py'
--- lib/lp/registry/interfaces/productseries.py	2011-01-11 22:53:57 +0000
+++ lib/lp/registry/interfaces/productseries.py	2011-01-21 19:02:35 +0000
@@ -68,7 +68,7 @@
     ISeriesMixin,
     SeriesStatus,
     )
-from lp.registry.interfaces.structuralsubscription import (
+from lp.bugs.interfaces.structuralsubscription import (
     IStructuralSubscriptionTarget,
     )
 from lp.services.fields import (

=== modified file 'lib/lp/registry/interfaces/projectgroup.py'
--- lib/lp/registry/interfaces/projectgroup.py	2010-12-15 19:32:47 +0000
+++ lib/lp/registry/interfaces/projectgroup.py	2011-01-21 19:02:35 +0000
@@ -59,6 +59,9 @@
     IHasOfficialBugTags,
     )
 from lp.bugs.interfaces.bugtracker import IBugTracker
+from lp.bugs.interfaces.structuralsubscription import (
+    IStructuralSubscriptionTarget,
+    )
 from lp.code.interfaces.branchvisibilitypolicy import (
     IHasBranchVisibilityPolicy,
     )
@@ -74,9 +77,6 @@
     )
 from lp.registry.interfaces.pillar import IPillar
 from lp.registry.interfaces.role import IHasOwner
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscriptionTarget,
-    )
 from lp.services.fields import (
     IconImageUpload,
     LogoImageUpload,

=== modified file 'lib/lp/registry/interfaces/webservice.py'
--- lib/lp/registry/interfaces/webservice.py	2010-11-19 18:58:28 +0000
+++ lib/lp/registry/interfaces/webservice.py	2011-01-21 19:02:35 +0000
@@ -32,8 +32,6 @@
     'ISSHKey',
     'ISourcePackage',
     'ISourcePackageName',
-    'IStructuralSubscription',
-    'IStructuralSubscriptionTarget',
     'ITeam',
     'ITeamMembership',
     'ITimelineProductSeries',
@@ -96,10 +94,6 @@
 from lp.registry.interfaces.sourcepackage import ISourcePackage
 from lp.registry.interfaces.sourcepackagename import ISourcePackageName
 from lp.registry.interfaces.ssh import ISSHKey
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscription,
-    IStructuralSubscriptionTarget,
-    )
 from lp.registry.interfaces.teammembership import ITeamMembership
 from lp.registry.interfaces.wikiname import IWikiName
 # XXX: JonathanLange 2010-11-09 bug=673083: Legacy work-around for circular

=== modified file 'lib/lp/registry/model/distribution.py'
--- lib/lp/registry/model/distribution.py	2011-01-18 14:37:41 +0000
+++ lib/lp/registry/model/distribution.py	2011-01-21 19:02:35 +0000
@@ -114,6 +114,9 @@
     OfficialBugTagTargetMixin,
     )
 from lp.bugs.model.bugtask import BugTask
+from lp.bugs.model.structuralsubscription import (
+    StructuralSubscriptionTargetMixin,
+    )
 from lp.registry.errors import NoSuchDistroSeries
 from lp.registry.interfaces.distribution import (
     IBaseDistribution,
@@ -149,9 +152,6 @@
 from lp.registry.model.pillar import HasAliasMixin
 from lp.registry.model.hasdrivers import HasDriversMixin
 from lp.registry.model.sourcepackagename import SourcePackageName
-from lp.registry.model.structuralsubscription import (
-    StructuralSubscriptionTargetMixin,
-    )
 from lp.services.propertycache import (
     cachedproperty,
     get_property_cache,

=== modified file 'lib/lp/registry/model/distributionsourcepackage.py'
--- lib/lp/registry/model/distributionsourcepackage.py	2010-11-30 15:01:41 +0000
+++ lib/lp/registry/model/distributionsourcepackage.py	2011-01-21 19:02:35 +0000
@@ -51,6 +51,9 @@
     HasBugHeatMixin,
     )
 from lp.bugs.model.bugtask import BugTask
+from lp.bugs.model.structuralsubscription import (
+    StructuralSubscriptionTargetMixin,
+    )
 from lp.code.model.hasbranches import (
     HasBranchesMixin,
     HasMergeProposalsMixin,
@@ -67,9 +70,6 @@
     SourcePackage,
     SourcePackageQuestionTargetMixin,
     )
-from lp.registry.model.structuralsubscription import (
-    StructuralSubscriptionTargetMixin,
-    )
 from lp.soyuz.enums import (
     ArchivePurpose,
     PackagePublishingStatus,

=== modified file 'lib/lp/registry/model/distroseries.py'
--- lib/lp/registry/model/distroseries.py	2011-01-13 08:09:16 +0000
+++ lib/lp/registry/model/distroseries.py	2011-01-21 19:02:35 +0000
@@ -91,6 +91,9 @@
     HasBugHeatMixin,
     )
 from lp.bugs.model.bugtask import BugTask
+from lp.bugs.model.structuralsubscription import (
+    StructuralSubscriptionTargetMixin,
+    )
 from lp.registry.interfaces.distroseries import (
     DerivationError,
     IDistroSeries,
@@ -119,9 +122,6 @@
 from lp.registry.model.series import SeriesMixin
 from lp.registry.model.sourcepackage import SourcePackage
 from lp.registry.model.sourcepackagename import SourcePackageName
-from lp.registry.model.structuralsubscription import (
-    StructuralSubscriptionTargetMixin,
-    )
 from lp.services.propertycache import (
     cachedproperty,
     get_property_cache,

=== modified file 'lib/lp/registry/model/milestone.py'
--- lib/lp/registry/model/milestone.py	2010-12-01 21:30:55 +0000
+++ lib/lp/registry/model/milestone.py	2011-01-21 19:02:35 +0000
@@ -47,6 +47,9 @@
     IBugTaskSet,
     )
 from lp.bugs.model.bugtarget import HasBugsBase
+from lp.bugs.model.structuralsubscription import (
+    StructuralSubscriptionTargetMixin,
+    )
 from lp.registry.interfaces.milestone import (
     IHasMilestones,
     IMilestone,
@@ -54,9 +57,6 @@
     IProjectGroupMilestone,
     )
 from lp.registry.model.productrelease import ProductRelease
-from lp.registry.model.structuralsubscription import (
-    StructuralSubscriptionTargetMixin,
-    )
 
 
 FUTURE_NONE = datetime.date(datetime.MAXYEAR, 1, 1)

=== modified file 'lib/lp/registry/model/person.py'
--- lib/lp/registry/model/person.py	2011-01-20 20:11:53 +0000
+++ lib/lp/registry/model/person.py	2011-01-21 19:02:35 +0000
@@ -181,6 +181,7 @@
     )
 from lp.bugs.model.bugtarget import HasBugsBase
 from lp.bugs.model.bugtask import get_related_bugtasks_search_params
+from lp.bugs.model.structuralsubscription import StructuralSubscription
 from lp.code.model.hasbranches import (
     HasBranchesMixin,
     HasMergeProposalsMixin,
@@ -253,7 +254,6 @@
     )
 from lp.registry.model.personlocation import PersonLocation
 from lp.registry.model.pillar import PillarName
-from lp.registry.model.structuralsubscription import StructuralSubscription
 from lp.registry.model.teammembership import (
     TeamMembership,
     TeamMembershipSet,

=== modified file 'lib/lp/registry/model/product.py'
--- lib/lp/registry/model/product.py	2011-01-13 21:03:14 +0000
+++ lib/lp/registry/model/product.py	2011-01-21 19:02:35 +0000
@@ -122,6 +122,9 @@
 from lp.bugs.model.bugtask import BugTask
 from lp.bugs.model.bugtracker import BugTracker
 from lp.bugs.model.bugwatch import BugWatch
+from lp.bugs.model.structuralsubscription import (
+    StructuralSubscriptionTargetMixin,
+    )
 from lp.code.enums import BranchType
 from lp.code.interfaces.branch import DEFAULT_BRANCH_STATUS_IN_LISTING
 from lp.code.model.branchvisibilitypolicy import BranchVisibilityPolicyMixin
@@ -162,9 +165,6 @@
 from lp.registry.model.productseries import ProductSeries
 from lp.registry.model.series import ACTIVE_STATUSES
 from lp.registry.model.sourcepackagename import SourcePackageName
-from lp.registry.model.structuralsubscription import (
-    StructuralSubscriptionTargetMixin,
-    )
 from lp.services.propertycache import (
     cachedproperty,
     get_property_cache,

=== modified file 'lib/lp/registry/model/productseries.py'
--- lib/lp/registry/model/productseries.py	2010-11-30 21:39:25 +0000
+++ lib/lp/registry/model/productseries.py	2011-01-21 19:02:35 +0000
@@ -69,6 +69,9 @@
     HasBugHeatMixin,
     )
 from lp.bugs.model.bugtask import BugTask
+from lp.bugs.model.structuralsubscription import (
+    StructuralSubscriptionTargetMixin,
+    )
 from lp.registry.interfaces.packaging import PackagingType
 from lp.registry.interfaces.person import validate_person
 from lp.registry.interfaces.productseries import (
@@ -84,9 +87,6 @@
 from lp.registry.model.packaging import Packaging
 from lp.registry.model.productrelease import ProductRelease
 from lp.registry.model.series import SeriesMixin
-from lp.registry.model.structuralsubscription import (
-    StructuralSubscriptionTargetMixin,
-    )
 from lp.services.worlddata.model.language import Language
 from lp.translations.interfaces.translations import (
     TranslationsBranchImportMode,

=== modified file 'lib/lp/registry/model/projectgroup.py'
--- lib/lp/registry/model/projectgroup.py	2011-01-19 21:06:27 +0000
+++ lib/lp/registry/model/projectgroup.py	2011-01-21 19:02:35 +0000
@@ -77,6 +77,9 @@
     OfficialBugTag,
     )
 from lp.bugs.model.bugtask import BugTask
+from lp.bugs.model.structuralsubscription import (
+    StructuralSubscriptionTargetMixin,
+    )
 from lp.code.model.branchvisibilitypolicy import BranchVisibilityPolicyMixin
 from lp.code.model.hasbranches import (
     HasBranchesMixin,
@@ -101,9 +104,6 @@
 from lp.registry.model.pillar import HasAliasMixin
 from lp.registry.model.product import Product
 from lp.registry.model.productseries import ProductSeries
-from lp.registry.model.structuralsubscription import (
-    StructuralSubscriptionTargetMixin,
-    )
 from lp.services.worlddata.model.language import Language
 from lp.translations.enums import TranslationPermission
 from lp.translations.model.potemplate import POTemplate

=== removed file 'lib/lp/registry/security.py'
--- lib/lp/registry/security.py	2011-01-13 15:12:36 +0000
+++ lib/lp/registry/security.py	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-# Copyright 2011 Canonical Ltd.  This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-"""Security adapters for Registry."""
-
-__metaclass__ = type
-__all__ = []
-
-from canonical.launchpad.security import AuthorizationBase
-from lp.registry.interfaces.structuralsubscription import (
-    IStructuralSubscription,
-    )
-
-
-class EditStructuralSubscription(AuthorizationBase):
-    """Edit permissions for `IStructuralSubscription`."""
-
-    usedfor = IStructuralSubscription
-    permission = "launchpad.Edit"
-
-    def checkAuthenticated(self, user):
-        """Subscribers can edit their own structural subscriptions."""
-        return user.inTeam(self.obj.subscriber)

=== modified file 'lib/lp/registry/tests/test_person.py'
--- lib/lp/registry/tests/test_person.py	2011-01-19 04:18:50 +0000
+++ lib/lp/registry/tests/test_person.py	2011-01-21 19:02:35 +0000
@@ -42,6 +42,7 @@
     )
 from lp.answers.model.answercontact import AnswerContact
 from lp.blueprints.model.specification import Specification
+from lp.bugs.model.structuralsubscription import StructuralSubscription
 from lp.bugs.interfaces.bugtask import IllegalRelatedBugTasksParams
 from lp.bugs.model.bug import Bug
 from lp.bugs.model.bugtask import get_related_bugtasks_search_params
@@ -64,7 +65,6 @@
     KarmaTotalCache,
     )
 from lp.registry.model.person import Person
-from lp.registry.model.structuralsubscription import StructuralSubscription
 from lp.services.openid.model.openididentifier import OpenIdIdentifier
 from lp.soyuz.enums import ArchivePurpose
 from lp.testing import (