Merge lp:~allenap/launchpad/subs-for-bugtask-bug-656194 into lp:launchpad/db-devel
- subs-for-bugtask-bug-656194
- Merge into db-devel
Proposed by
Gavin Panella
Status: | Merged |
---|---|
Approved by: | Gavin Panella |
Approved revision: | no longer in the source branch. |
Merged at revision: | 9888 |
Proposed branch: | lp:~allenap/launchpad/subs-for-bugtask-bug-656194 |
Merge into: | lp:launchpad/db-devel |
Diff against target: |
294 lines (+70/-83) 3 files modified
lib/lp/registry/interfaces/structuralsubscription.py (+2/-2) lib/lp/registry/model/structuralsubscription.py (+5/-19) lib/lp/registry/tests/test_structuralsubscriptiontarget.py (+63/-62) |
To merge this branch: | bzr merge lp:~allenap/launchpad/subs-for-bugtask-bug-656194 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Abel Deuring (community) | code | Approve | |
Review via email: mp+37835@code.launchpad.net |
Commit message
Description of the change
Switch getSusbcription
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'lib/lp/registry/interfaces/structuralsubscription.py' |
2 | --- lib/lp/registry/interfaces/structuralsubscription.py 2010-10-05 09:23:22 +0000 |
3 | +++ lib/lp/registry/interfaces/structuralsubscription.py 2010-10-08 08:17:42 +0000 |
4 | @@ -200,8 +200,8 @@ |
5 | def userHasBugSubscriptions(user): |
6 | """Is `user` subscribed, directly or via a team, to bug mail?""" |
7 | |
8 | - def getSubscriptionsForBug(bug, level): |
9 | - """Return subscriptions for a given `IBug` at `level`.""" |
10 | + def getSubscriptionsForBugTask(bug, level): |
11 | + """Return subscriptions for a given `IBugTask` at `level`.""" |
12 | |
13 | |
14 | class IStructuralSubscriptionTargetWrite(Interface): |
15 | |
16 | === modified file 'lib/lp/registry/model/structuralsubscription.py' |
17 | --- lib/lp/registry/model/structuralsubscription.py 2010-10-05 16:52:02 +0000 |
18 | +++ lib/lp/registry/model/structuralsubscription.py 2010-10-08 08:17:42 +0000 |
19 | @@ -484,21 +484,8 @@ |
20 | return True |
21 | return False |
22 | |
23 | - def getSubscriptionsForBug(self, bug, level): |
24 | + def getSubscriptionsForBugTask(self, bugtask, level): |
25 | """See `IStructuralSubscriptionTarget`.""" |
26 | - if IProjectGroup.providedBy(self): |
27 | - targets = set(self.products) |
28 | - elif IMilestone.providedBy(self): |
29 | - targets = [self.series_target] |
30 | - else: |
31 | - targets = [self] |
32 | - |
33 | - bugtasks = [ |
34 | - bugtask for bugtask in bug.bugtasks |
35 | - if bugtask.target in targets] |
36 | - |
37 | - assert len(bugtasks) != 0, repr(self) |
38 | - |
39 | origin = [ |
40 | StructuralSubscription, |
41 | LeftJoin( |
42 | @@ -515,7 +502,7 @@ |
43 | BugSubscriptionFilter.id)), |
44 | ] |
45 | |
46 | - if len(bug.tags) == 0: |
47 | + if len(bugtask.bug.tags) == 0: |
48 | tag_conditions = [ |
49 | BugSubscriptionFilter.include_any_tags == False, |
50 | ] |
51 | @@ -534,13 +521,12 @@ |
52 | # There's no status filter, or there is a status filter |
53 | # and and it matches. |
54 | Or(BugSubscriptionFilterStatus.id == None, |
55 | - BugSubscriptionFilterStatus.status.is_in( |
56 | - bugtask.status for bugtask in bugtasks)), |
57 | + BugSubscriptionFilterStatus.status == bugtask.status), |
58 | # There's no importance filter, or there is an importance |
59 | # filter and it matches. |
60 | Or(BugSubscriptionFilterImportance.id == None, |
61 | - BugSubscriptionFilterImportance.importance.is_in( |
62 | - bugtask.importance for bugtask in bugtasks)), |
63 | + BugSubscriptionFilterImportance.importance == ( |
64 | + bugtask.importance)), |
65 | # Any number of conditions relating to tags. |
66 | *tag_conditions)), |
67 | ] |
68 | |
69 | === modified file 'lib/lp/registry/tests/test_structuralsubscriptiontarget.py' |
70 | --- lib/lp/registry/tests/test_structuralsubscriptiontarget.py 2010-10-06 18:53:53 +0000 |
71 | +++ lib/lp/registry/tests/test_structuralsubscriptiontarget.py 2010-10-08 08:17:42 +0000 |
72 | @@ -173,19 +173,20 @@ |
73 | def makeBugTask(self): |
74 | return self.factory.makeBugTask(target=self.target) |
75 | |
76 | - def test_getSubscriptionsForBug(self): |
77 | + def test_getSubscriptionsForBugTask(self): |
78 | # If no one has a filtered subscription for the given bug, the result |
79 | - # of getSubscriptionsForBug() is the same as for getSubscriptions(). |
80 | + # of getSubscriptionsForBugTask() is the same as for |
81 | + # getSubscriptions(). |
82 | bugtask = self.makeBugTask() |
83 | subscriptions = self.target.getSubscriptions( |
84 | min_bug_notification_level=BugNotificationLevel.NOTHING) |
85 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
86 | - bugtask.bug, BugNotificationLevel.NOTHING) |
87 | - self.assertEqual(list(subscriptions), list(subscriptions_for_bug)) |
88 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
89 | + bugtask, BugNotificationLevel.NOTHING) |
90 | + self.assertEqual(list(subscriptions), list(subscriptions_for_bugtask)) |
91 | |
92 | - def test_getSubscriptionsForBug_with_filter_on_status(self): |
93 | + def test_getSubscriptionsForBugTask_with_filter_on_status(self): |
94 | # If a status filter exists for a subscription, the result of |
95 | - # getSubscriptionsForBug() may be a subset of getSubscriptions(). |
96 | + # getSubscriptionsForBugTask() may be a subset of getSubscriptions(). |
97 | bugtask = self.makeBugTask() |
98 | |
99 | # Create a new subscription on self.target. |
100 | @@ -195,9 +196,9 @@ |
101 | subscription.bug_notification_level = BugNotificationLevel.COMMENTS |
102 | |
103 | # Without any filters the subscription is found. |
104 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
105 | - bugtask.bug, BugNotificationLevel.NOTHING) |
106 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
107 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
108 | + bugtask, BugNotificationLevel.NOTHING) |
109 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
110 | |
111 | # Filter the subscription to bugs in the CONFIRMED state. |
112 | subscription_filter = BugSubscriptionFilter() |
113 | @@ -205,19 +206,19 @@ |
114 | subscription_filter.statuses = [BugTaskStatus.CONFIRMED] |
115 | |
116 | # With the filter the subscription is not found. |
117 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
118 | - bugtask.bug, BugNotificationLevel.NOTHING) |
119 | - self.assertEqual([], list(subscriptions_for_bug)) |
120 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
121 | + bugtask, BugNotificationLevel.NOTHING) |
122 | + self.assertEqual([], list(subscriptions_for_bugtask)) |
123 | |
124 | # If the filter is adjusted, the subscription is found again. |
125 | subscription_filter.statuses = [bugtask.status] |
126 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
127 | - bugtask.bug, BugNotificationLevel.NOTHING) |
128 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
129 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
130 | + bugtask, BugNotificationLevel.NOTHING) |
131 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
132 | |
133 | - def test_getSubscriptionsForBug_with_filter_on_importance(self): |
134 | + def test_getSubscriptionsForBugTask_with_filter_on_importance(self): |
135 | # If an importance filter exists for a subscription, the result of |
136 | - # getSubscriptionsForBug() may be a subset of getSubscriptions(). |
137 | + # getSubscriptionsForBugTask() may be a subset of getSubscriptions(). |
138 | bugtask = self.makeBugTask() |
139 | |
140 | # Create a new subscription on self.target. |
141 | @@ -227,9 +228,9 @@ |
142 | subscription.bug_notification_level = BugNotificationLevel.COMMENTS |
143 | |
144 | # Without any filters the subscription is found. |
145 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
146 | - bugtask.bug, BugNotificationLevel.NOTHING) |
147 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
148 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
149 | + bugtask, BugNotificationLevel.NOTHING) |
150 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
151 | |
152 | # Filter the subscription to bugs in the CRITICAL state. |
153 | subscription_filter = BugSubscriptionFilter() |
154 | @@ -237,19 +238,19 @@ |
155 | subscription_filter.importances = [BugTaskImportance.CRITICAL] |
156 | |
157 | # With the filter the subscription is not found. |
158 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
159 | - bugtask.bug, BugNotificationLevel.NOTHING) |
160 | - self.assertEqual([], list(subscriptions_for_bug)) |
161 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
162 | + bugtask, BugNotificationLevel.NOTHING) |
163 | + self.assertEqual([], list(subscriptions_for_bugtask)) |
164 | |
165 | # If the filter is adjusted, the subscription is found again. |
166 | subscription_filter.importances = [bugtask.importance] |
167 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
168 | - bugtask.bug, BugNotificationLevel.NOTHING) |
169 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
170 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
171 | + bugtask, BugNotificationLevel.NOTHING) |
172 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
173 | |
174 | - def test_getSubscriptionsForBug_with_filter_on_level(self): |
175 | + def test_getSubscriptionsForBugTask_with_filter_on_level(self): |
176 | # All structural subscriptions have a level for bug notifications |
177 | - # which getSubscriptionsForBug() observes. |
178 | + # which getSubscriptionsForBugTask() observes. |
179 | bugtask = self.makeBugTask() |
180 | |
181 | # Create a new METADATA level subscription on self.target. |
182 | @@ -259,19 +260,19 @@ |
183 | subscription.bug_notification_level = BugNotificationLevel.METADATA |
184 | |
185 | # The subscription is found when looking for NOTHING or above. |
186 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
187 | - bugtask.bug, BugNotificationLevel.NOTHING) |
188 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
189 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
190 | + bugtask, BugNotificationLevel.NOTHING) |
191 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
192 | # The subscription is found when looking for METADATA or above. |
193 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
194 | - bugtask.bug, BugNotificationLevel.METADATA) |
195 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
196 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
197 | + bugtask, BugNotificationLevel.METADATA) |
198 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
199 | # The subscription is not found when looking for COMMENTS or above. |
200 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
201 | - bugtask.bug, BugNotificationLevel.COMMENTS) |
202 | - self.assertEqual([], list(subscriptions_for_bug)) |
203 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
204 | + bugtask, BugNotificationLevel.COMMENTS) |
205 | + self.assertEqual([], list(subscriptions_for_bugtask)) |
206 | |
207 | - def test_getSubscriptionsForBug_with_filter_include_any_tags(self): |
208 | + def test_getSubscriptionsForBugTask_with_filter_include_any_tags(self): |
209 | # If a subscription filter has include_any_tags, a bug with one or |
210 | # more tags is matched. |
211 | bugtask = self.makeBugTask() |
212 | @@ -285,17 +286,17 @@ |
213 | subscription_filter.include_any_tags = True |
214 | |
215 | # Without any tags the subscription is not found. |
216 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
217 | - bugtask.bug, BugNotificationLevel.NOTHING) |
218 | - self.assertEqual([], list(subscriptions_for_bug)) |
219 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
220 | + bugtask, BugNotificationLevel.NOTHING) |
221 | + self.assertEqual([], list(subscriptions_for_bugtask)) |
222 | |
223 | # With any tag the subscription is found. |
224 | bugtask.bug.tags = ["foo"] |
225 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
226 | - bugtask.bug, BugNotificationLevel.NOTHING) |
227 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
228 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
229 | + bugtask, BugNotificationLevel.NOTHING) |
230 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
231 | |
232 | - def test_getSubscriptionsForBug_with_filter_exclude_any_tags(self): |
233 | + def test_getSubscriptionsForBugTask_with_filter_exclude_any_tags(self): |
234 | # If a subscription filter has exclude_any_tags, only bugs with no |
235 | # tags are matched. |
236 | bugtask = self.makeBugTask() |
237 | @@ -309,17 +310,17 @@ |
238 | subscription_filter.exclude_any_tags = True |
239 | |
240 | # Without any tags the subscription is found. |
241 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
242 | - bugtask.bug, BugNotificationLevel.NOTHING) |
243 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
244 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
245 | + bugtask, BugNotificationLevel.NOTHING) |
246 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
247 | |
248 | # With any tag the subscription is not found. |
249 | bugtask.bug.tags = ["foo"] |
250 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
251 | - bugtask.bug, BugNotificationLevel.NOTHING) |
252 | - self.assertEqual([], list(subscriptions_for_bug)) |
253 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
254 | + bugtask, BugNotificationLevel.NOTHING) |
255 | + self.assertEqual([], list(subscriptions_for_bugtask)) |
256 | |
257 | - def test_getSubscriptionsForBug_with_multiple_filters(self): |
258 | + def test_getSubscriptionsForBugTask_with_multiple_filters(self): |
259 | # If multiple filters exist for a subscription, all filters must |
260 | # match. |
261 | bugtask = self.makeBugTask() |
262 | @@ -337,23 +338,23 @@ |
263 | subscription_filter.importances = [BugTaskImportance.CRITICAL] |
264 | |
265 | # With the filter the subscription is not found. |
266 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
267 | - bugtask.bug, BugNotificationLevel.NOTHING) |
268 | - self.assertEqual([], list(subscriptions_for_bug)) |
269 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
270 | + bugtask, BugNotificationLevel.NOTHING) |
271 | + self.assertEqual([], list(subscriptions_for_bugtask)) |
272 | |
273 | # If the filter is adjusted to match status but not importance, the |
274 | # subscription is still not found. |
275 | subscription_filter.statuses = [bugtask.status] |
276 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
277 | - bugtask.bug, BugNotificationLevel.NOTHING) |
278 | - self.assertEqual([], list(subscriptions_for_bug)) |
279 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
280 | + bugtask, BugNotificationLevel.NOTHING) |
281 | + self.assertEqual([], list(subscriptions_for_bugtask)) |
282 | |
283 | # If the filter is adjusted to also match importance, the subscription |
284 | # is found again. |
285 | subscription_filter.importances = [bugtask.importance] |
286 | - subscriptions_for_bug = self.target.getSubscriptionsForBug( |
287 | - bugtask.bug, BugNotificationLevel.NOTHING) |
288 | - self.assertEqual([subscription], list(subscriptions_for_bug)) |
289 | + subscriptions_for_bugtask = self.target.getSubscriptionsForBugTask( |
290 | + bugtask, BugNotificationLevel.NOTHING) |
291 | + self.assertEqual([subscription], list(subscriptions_for_bugtask)) |
292 | |
293 | |
294 | class TestStructuralSubscriptionForDistro( |
(15:46:23) adeuring: allenap: the changes in your branch look good. But what is the reason for the changes? Do you assume that the SQL query for the old method would be too slow?
(15:48:09) allenap: adeuring: It's easier to select the targets elsewhere, and it's makes the resulting code closer to the existing structural subs code, so it's easier to reuse.
(15:48:47) allenap: adeuring: My follow-on branch is now simpler to implement.
(15:49:50) adeuring: allenap: ok. But now you may get a subscription more than once, if somebody is subscribed to two or more bug targets having bug tasks for a given bug
(15:50:27) allenap: adeuring: That turns out to be a problem. So far :)
(15:50:37) allenap: adeuring: That turns out to *not* be a problem. So far :)
(15:52:35) adeuring: allenap: interesting. But anyway, r=me; the possible duplicate results can be treated later