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
1=== modified file 'lib/lp/registry/model/structuralsubscription.py'
2--- lib/lp/registry/model/structuralsubscription.py 2010-10-05 19:27:48 +0000
3+++ lib/lp/registry/model/structuralsubscription.py 2010-10-05 19:27:49 +0000
4@@ -515,23 +515,34 @@
5 BugSubscriptionFilter.id)),
6 ]
7
8+ if len(bug.tags) == 0:
9+ tag_conditions = [
10+ BugSubscriptionFilter.include_any_tags == False,
11+ ]
12+ else:
13+ tag_conditions = [
14+ BugSubscriptionFilter.exclude_any_tags == False,
15+ ]
16+
17 conditions = [
18 StructuralSubscription.bug_notification_level >= level,
19 Or(
20 # There's no filter or ...
21 BugSubscriptionFilter.id == None,
22- # there is a filter and ...
23+ # There is a filter and ...
24 And(
25- # there's no status filter, or there is a status filter
26+ # There's no status filter, or there is a status filter
27 # and and it matches.
28 Or(BugSubscriptionFilterStatus.id == None,
29 BugSubscriptionFilterStatus.status.is_in(
30 bugtask.status for bugtask in bugtasks)),
31- # there's no importance filter, or there is an importance
32+ # There's no importance filter, or there is an importance
33 # filter and it matches.
34 Or(BugSubscriptionFilterImportance.id == None,
35 BugSubscriptionFilterImportance.importance.is_in(
36- bugtask.importance for bugtask in bugtasks)))),
37+ bugtask.importance for bugtask in bugtasks)),
38+ # Any number of conditions relating to tags.
39+ *tag_conditions)),
40 ]
41
42 return Store.of(self.__helper.pillar).using(*origin).find(
43
44=== modified file 'lib/lp/registry/tests/test_structuralsubscriptiontarget.py'
45--- lib/lp/registry/tests/test_structuralsubscriptiontarget.py 2010-10-05 19:27:48 +0000
46+++ lib/lp/registry/tests/test_structuralsubscriptiontarget.py 2010-10-05 19:27:49 +0000
47@@ -271,6 +271,54 @@
48 bugtask.bug, BugNotificationLevel.COMMENTS)
49 self.assertEqual([], list(subscriptions_for_bug))
50
51+ def test_getSubscriptionsForBug_with_filter_include_any_tags(self):
52+ # If a subscription filter has include_any_tags, a bug with one or
53+ # more tags is matched.
54+ bugtask = self.makeBugTask()
55+
56+ # Create a new subscription on self.target.
57+ login_person(self.ordinary_subscriber)
58+ subscription = self.target.addSubscription(
59+ self.ordinary_subscriber, self.ordinary_subscriber)
60+ subscription.bug_notification_level = BugNotificationLevel.COMMENTS
61+ subscription_filter = subscription.newBugFilter()
62+ subscription_filter.include_any_tags = True
63+
64+ # Without any tags the subscription is not found.
65+ subscriptions_for_bug = self.target.getSubscriptionsForBug(
66+ bugtask.bug, BugNotificationLevel.NOTHING)
67+ self.assertEqual([], list(subscriptions_for_bug))
68+
69+ # With any tag the subscription is found.
70+ bugtask.bug.tags = ["foo"]
71+ subscriptions_for_bug = self.target.getSubscriptionsForBug(
72+ bugtask.bug, BugNotificationLevel.NOTHING)
73+ self.assertEqual([subscription], list(subscriptions_for_bug))
74+
75+ def test_getSubscriptionsForBug_with_filter_exclude_any_tags(self):
76+ # If a subscription filter has exclude_any_tags, only bugs with no
77+ # tags are matched.
78+ bugtask = self.makeBugTask()
79+
80+ # Create a new subscription on self.target.
81+ login_person(self.ordinary_subscriber)
82+ subscription = self.target.addSubscription(
83+ self.ordinary_subscriber, self.ordinary_subscriber)
84+ subscription.bug_notification_level = BugNotificationLevel.COMMENTS
85+ subscription_filter = subscription.newBugFilter()
86+ subscription_filter.exclude_any_tags = True
87+
88+ # Without any tags the subscription is found.
89+ subscriptions_for_bug = self.target.getSubscriptionsForBug(
90+ bugtask.bug, BugNotificationLevel.NOTHING)
91+ self.assertEqual([subscription], list(subscriptions_for_bug))
92+
93+ # With any tag the subscription is not found.
94+ bugtask.bug.tags = ["foo"]
95+ subscriptions_for_bug = self.target.getSubscriptionsForBug(
96+ bugtask.bug, BugNotificationLevel.NOTHING)
97+ self.assertEqual([], list(subscriptions_for_bug))
98+
99 def test_getSubscriptionsForBug_with_multiple_filters(self):
100 # If multiple filters exist for a subscription, all filters must
101 # match.

Subscribers

People subscribed via source and target branches

to status/vote changes: