Merge lp:~thomir/launchpad/devel-fix-import-violations-specificationworkitem into lp:launchpad

Proposed by Thomi Richards on 2015-03-01
Status: Merged
Merged at revision: 17370
Proposed branch: lp:~thomir/launchpad/devel-fix-import-violations-specificationworkitem
Merge into: lp:launchpad
Diff against target: 133 lines (+49/-4)
5 files modified
lib/lp/blueprints/configure.zcml (+8/-0)
lib/lp/blueprints/interfaces/specificationworkitem.py (+8/-0)
lib/lp/blueprints/model/specificationworkitem.py (+12/-0)
lib/lp/blueprints/model/tests/test_specification.py (+19/-0)
lib/lp/registry/browser/__init__.py (+2/-4)
To merge this branch: bzr merge lp:~thomir/launchpad/devel-fix-import-violations-specificationworkitem
Reviewer Review Type Date Requested Status
William Grant code 2015-03-01 Approve on 2015-03-02
Review via email: mp+251395@code.launchpad.net

Commit Message

Fix import policy violation so lp.blueprints.model.specificationworkitem is no longer imported into lp.registry.browser.

Description of the Change

Fix this reported import policy violation:

You should not import lp.blueprints.model.specificationworkitem into lp.registry.browser

By creating an ISpecificationWorkItemSet interface, an implementation of that interface, and change lp.registry.browser implementation to use the new interface.

To post a comment you must log in.
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/blueprints/configure.zcml'
2--- lib/lp/blueprints/configure.zcml 2014-11-23 21:37:40 +0000
3+++ lib/lp/blueprints/configure.zcml 2015-03-02 00:40:42 +0000
4@@ -87,6 +87,14 @@
5 interface="lp.blueprints.interfaces.specificationworkitem.ISpecificationWorkItem"/>
6 </class>
7
8+ <!-- SpecificationWorkItemSet -->
9+
10+ <securedutility
11+ class="lp.blueprints.model.specificationworkitem.SpecificationWorkItemSet"
12+ provides="lp.blueprints.interfaces.specificationworkitem.ISpecificationWorkItemSet">
13+ <allow interface="lp.blueprints.interfaces.specificationworkitem.ISpecificationWorkItemSet"/>
14+ </securedutility>
15+
16 <!-- SpecificationDependency -->
17
18 <class class="lp.blueprints.model.specificationdependency.SpecificationDependency">
19
20=== modified file 'lib/lp/blueprints/interfaces/specificationworkitem.py'
21--- lib/lp/blueprints/interfaces/specificationworkitem.py 2012-04-05 13:05:04 +0000
22+++ lib/lp/blueprints/interfaces/specificationworkitem.py 2015-03-02 00:40:42 +0000
23@@ -7,6 +7,7 @@
24
25 __all__ = [
26 'ISpecificationWorkItem',
27+ 'ISpecificationWorkItemSet',
28 ]
29
30
31@@ -80,3 +81,10 @@
32 description=_(
33 "True or False depending on whether or not there is more "
34 "work required on this work item."))
35+
36+
37+class ISpecificationWorkItemSet(Interface):
38+ """SpecificationWorkItemSet's public attributes and methods."""
39+
40+ def unlinkMilestone(milestone):
41+ """Unlink the given milestone from all SpecificationWorkItems."""
42
43=== modified file 'lib/lp/blueprints/model/specificationworkitem.py'
44--- lib/lp/blueprints/model/specificationworkitem.py 2012-11-16 20:13:32 +0000
45+++ lib/lp/blueprints/model/specificationworkitem.py 2015-03-02 00:40:42 +0000
46@@ -12,11 +12,13 @@
47 Reference,
48 Unicode,
49 )
50+from storm.store import Store
51 from zope.interface import implements
52
53 from lp.blueprints.enums import SpecificationWorkItemStatus
54 from lp.blueprints.interfaces.specificationworkitem import (
55 ISpecificationWorkItem,
56+ ISpecificationWorkItemSet,
57 )
58 from lp.registry.interfaces.person import validate_public_person
59 from lp.services.database.constants import DEFAULT
60@@ -65,3 +67,13 @@
61 def is_complete(self):
62 """See `ISpecificationWorkItem`."""
63 return self.status == SpecificationWorkItemStatus.DONE
64+
65+
66+class SpecificationWorkItemSet:
67+ implements(ISpecificationWorkItemSet)
68+
69+ def unlinkMilestone(self, milestone):
70+ """See `ISpecificationWorkItemSet`."""
71+ Store.of(milestone).find(
72+ SpecificationWorkItem, milestone_id=milestone.id).set(
73+ milestone_id=None)
74
75=== modified file 'lib/lp/blueprints/model/tests/test_specification.py'
76--- lib/lp/blueprints/model/tests/test_specification.py 2014-06-19 10:04:55 +0000
77+++ lib/lp/blueprints/model/tests/test_specification.py 2015-03-02 00:40:42 +0000
78@@ -24,6 +24,7 @@
79 from lp.app.validators import LaunchpadValidationError
80 from lp.blueprints.interfaces.specification import ISpecification
81 from lp.blueprints.interfaces.specificationworkitem import (
82+ ISpecificationWorkItemSet,
83 SpecificationWorkItemStatus,
84 )
85 from lp.blueprints.model.specificationworkitem import SpecificationWorkItem
86@@ -659,6 +660,24 @@
87 title=wi.title, status=wi.status, assignee=wi.assignee,
88 milestone=wi.milestone, sequence=sequence)
89
90+ def test_workitemspecificationset_can_unlink_milestones(self):
91+ milestone_a = self.factory.makeMilestone()
92+ milestone_b = self.factory.makeMilestone()
93+ work_item_1 = self.factory.makeSpecificationWorkItem(milestone=milestone_a)
94+ work_item_2 = self.factory.makeSpecificationWorkItem(milestone=milestone_a)
95+ work_item_3 = self.factory.makeSpecificationWorkItem(milestone=milestone_b)
96+
97+
98+ self.assertEqual(milestone_a, work_item_1.milestone)
99+ self.assertEqual(milestone_a, work_item_2.milestone)
100+ self.assertEqual(milestone_b, work_item_3.milestone)
101+
102+ getUtility(ISpecificationWorkItemSet).unlinkMilestone(milestone_a)
103+
104+ self.assertIs(None, work_item_1.milestone)
105+ self.assertIs(None, work_item_2.milestone)
106+ self.assertEqual(milestone_b, work_item_3.milestone)
107+
108
109 class TestSpecificationInformationType(TestCaseWithFactory):
110
111
112=== modified file 'lib/lp/registry/browser/__init__.py'
113--- lib/lp/registry/browser/__init__.py 2014-01-30 15:04:06 +0000
114+++ lib/lp/registry/browser/__init__.py 2015-03-02 00:40:42 +0000
115@@ -30,7 +30,7 @@
116 LaunchpadEditFormView,
117 )
118 from lp.app.interfaces.launchpad import ILaunchpadCelebrities
119-from lp.blueprints.model.specificationworkitem import SpecificationWorkItem
120+from lp.blueprints.interfaces.specificationworkitem import ISpecificationWorkItemSet
121 from lp.bugs.interfaces.bugtask import IBugTaskSet
122 from lp.bugs.interfaces.bugtasksearch import BugTaskSearchParams
123 from lp.registry.interfaces.productseries import IProductSeries
124@@ -241,9 +241,7 @@
125 else:
126 nb.milestone = None
127 removeSecurityProxy(milestone.all_specifications).set(milestoneID=None)
128- Store.of(milestone).find(
129- SpecificationWorkItem, milestone_id=milestone.id).set(
130- milestone_id=None)
131+ getUtility(ISpecificationWorkItemSet).unlinkMilestone(milestone)
132 self._deleteRelease(milestone.product_release)
133 milestone.destroySelf()
134