Merge lp:~allenap/launchpad/structural-subscriptions-with-filters-6 into lp:launchpad/db-devel

Proposed by Gavin Panella
Status: Merged
Approved by: Māris Fogels
Approved revision: no longer in the source branch.
Merged at revision: 9866
Proposed branch: lp:~allenap/launchpad/structural-subscriptions-with-filters-6
Merge into: lp:launchpad/db-devel
Prerequisite: lp:~allenap/launchpad/structural-subscriptions-with-filters-5
Diff against target: 101 lines (+63/-4)
2 files modified
lib/lp/registry/model/structuralsubscription.py (+15/-4)
lib/lp/registry/tests/test_structuralsubscriptiontarget.py (+48/-0)
To merge this branch: bzr merge lp:~allenap/launchpad/structural-subscriptions-with-filters-6
Reviewer Review Type Date Requested Status
Gavin Panella (community) code Abstain
Māris Fogels (community) Approve
Review via email: mp+37653@code.launchpad.net

Description of the change

getSubscriptionsForBug() now filters by the presence or absence of tags. It can't yet deal with finding specific tags, but I need to get on with some UI work now so this will do until next cycle.

To post a comment you must log in.
Revision history for this message
Māris Fogels (mars) wrote :

Hi Gavin, this code looks good, r=mars.

review: Approve
Revision history for this message
Gavin Panella (allenap) :
review: Abstain (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/registry/model/structuralsubscription.py'
--- lib/lp/registry/model/structuralsubscription.py 2010-10-05 19:27:48 +0000
+++ lib/lp/registry/model/structuralsubscription.py 2010-10-05 19:27:49 +0000
@@ -515,23 +515,34 @@
515 BugSubscriptionFilter.id)),515 BugSubscriptionFilter.id)),
516 ]516 ]
517517
518 if len(bug.tags) == 0:
519 tag_conditions = [
520 BugSubscriptionFilter.include_any_tags == False,
521 ]
522 else:
523 tag_conditions = [
524 BugSubscriptionFilter.exclude_any_tags == False,
525 ]
526
518 conditions = [527 conditions = [
519 StructuralSubscription.bug_notification_level >= level,528 StructuralSubscription.bug_notification_level >= level,
520 Or(529 Or(
521 # There's no filter or ...530 # There's no filter or ...
522 BugSubscriptionFilter.id == None,531 BugSubscriptionFilter.id == None,
523 # there is a filter and ...532 # There is a filter and ...
524 And(533 And(
525 # there's no status filter, or there is a status filter534 # There's no status filter, or there is a status filter
526 # and and it matches.535 # and and it matches.
527 Or(BugSubscriptionFilterStatus.id == None,536 Or(BugSubscriptionFilterStatus.id == None,
528 BugSubscriptionFilterStatus.status.is_in(537 BugSubscriptionFilterStatus.status.is_in(
529 bugtask.status for bugtask in bugtasks)),538 bugtask.status for bugtask in bugtasks)),
530 # there's no importance filter, or there is an importance539 # There's no importance filter, or there is an importance
531 # filter and it matches.540 # filter and it matches.
532 Or(BugSubscriptionFilterImportance.id == None,541 Or(BugSubscriptionFilterImportance.id == None,
533 BugSubscriptionFilterImportance.importance.is_in(542 BugSubscriptionFilterImportance.importance.is_in(
534 bugtask.importance for bugtask in bugtasks)))),543 bugtask.importance for bugtask in bugtasks)),
544 # Any number of conditions relating to tags.
545 *tag_conditions)),
535 ]546 ]
536547
537 return Store.of(self.__helper.pillar).using(*origin).find(548 return Store.of(self.__helper.pillar).using(*origin).find(
538549
=== modified file 'lib/lp/registry/tests/test_structuralsubscriptiontarget.py'
--- lib/lp/registry/tests/test_structuralsubscriptiontarget.py 2010-10-05 19:27:48 +0000
+++ lib/lp/registry/tests/test_structuralsubscriptiontarget.py 2010-10-05 19:27:49 +0000
@@ -271,6 +271,54 @@
271 bugtask.bug, BugNotificationLevel.COMMENTS)271 bugtask.bug, BugNotificationLevel.COMMENTS)
272 self.assertEqual([], list(subscriptions_for_bug))272 self.assertEqual([], list(subscriptions_for_bug))
273273
274 def test_getSubscriptionsForBug_with_filter_include_any_tags(self):
275 # If a subscription filter has include_any_tags, a bug with one or
276 # more tags is matched.
277 bugtask = self.makeBugTask()
278
279 # Create a new subscription on self.target.
280 login_person(self.ordinary_subscriber)
281 subscription = self.target.addSubscription(
282 self.ordinary_subscriber, self.ordinary_subscriber)
283 subscription.bug_notification_level = BugNotificationLevel.COMMENTS
284 subscription_filter = subscription.newBugFilter()
285 subscription_filter.include_any_tags = True
286
287 # Without any tags the subscription is not found.
288 subscriptions_for_bug = self.target.getSubscriptionsForBug(
289 bugtask.bug, BugNotificationLevel.NOTHING)
290 self.assertEqual([], list(subscriptions_for_bug))
291
292 # With any tag the subscription is found.
293 bugtask.bug.tags = ["foo"]
294 subscriptions_for_bug = self.target.getSubscriptionsForBug(
295 bugtask.bug, BugNotificationLevel.NOTHING)
296 self.assertEqual([subscription], list(subscriptions_for_bug))
297
298 def test_getSubscriptionsForBug_with_filter_exclude_any_tags(self):
299 # If a subscription filter has exclude_any_tags, only bugs with no
300 # tags are matched.
301 bugtask = self.makeBugTask()
302
303 # Create a new subscription on self.target.
304 login_person(self.ordinary_subscriber)
305 subscription = self.target.addSubscription(
306 self.ordinary_subscriber, self.ordinary_subscriber)
307 subscription.bug_notification_level = BugNotificationLevel.COMMENTS
308 subscription_filter = subscription.newBugFilter()
309 subscription_filter.exclude_any_tags = True
310
311 # Without any tags the subscription is found.
312 subscriptions_for_bug = self.target.getSubscriptionsForBug(
313 bugtask.bug, BugNotificationLevel.NOTHING)
314 self.assertEqual([subscription], list(subscriptions_for_bug))
315
316 # With any tag the subscription is not found.
317 bugtask.bug.tags = ["foo"]
318 subscriptions_for_bug = self.target.getSubscriptionsForBug(
319 bugtask.bug, BugNotificationLevel.NOTHING)
320 self.assertEqual([], list(subscriptions_for_bug))
321
274 def test_getSubscriptionsForBug_with_multiple_filters(self):322 def test_getSubscriptionsForBug_with_multiple_filters(self):
275 # If multiple filters exist for a subscription, all filters must323 # If multiple filters exist for a subscription, all filters must
276 # match.324 # match.

Subscribers

People subscribed via source and target branches

to status/vote changes: