Merge ~twom/launchpad:questions-about-storm-subscriptions into launchpad:master

Proposed by Tom Wardill
Status: Merged
Approved by: Tom Wardill
Approved revision: 93a138b7f396fc7fc62b9eeaed30216ec32225a9
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~twom/launchpad:questions-about-storm-subscriptions
Merge into: launchpad:master
Diff against target: 134 lines (+29/-23)
2 files modified
lib/lp/answers/model/question.py (+14/-11)
lib/lp/answers/model/questionsubscription.py (+15/-12)
Reviewer Review Type Date Requested Status
Ioana Lasc (community) Approve
Thiago F. Pappacena (community) Approve
Review via email: mp+386031@code.launchpad.net

Commit message

Convert QuestionSubscription to Storm

To post a comment you must log in.
Revision history for this message
Thiago F. Pappacena (pappacena) wrote :

LGTM

review: Approve
Revision history for this message
Ioana Lasc (ilasc) wrote :

looks good

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lib/lp/answers/model/question.py b/lib/lp/answers/model/question.py
index 036aeb6..921a0c6 100644
--- a/lib/lp/answers/model/question.py
+++ b/lib/lp/answers/model/question.py
@@ -31,10 +31,10 @@ from sqlobject import (
31 ForeignKey,31 ForeignKey,
32 SQLMultipleJoin,32 SQLMultipleJoin,
33 SQLObjectNotFound,33 SQLObjectNotFound,
34 SQLRelatedJoin,
35 StringCol,34 StringCol,
36 )35 )
37from storm.expr import LeftJoin36from storm.expr import LeftJoin
37from storm.references import ReferenceSet
38from storm.store import Store38from storm.store import Store
39from zope.component import getUtility39from zope.component import getUtility
40from zope.event import notify40from zope.event import notify
@@ -100,6 +100,7 @@ from lp.services.database.constants import (
100 )100 )
101from lp.services.database.datetimecol import UtcDateTimeCol101from lp.services.database.datetimecol import UtcDateTimeCol
102from lp.services.database.enumcol import EnumCol102from lp.services.database.enumcol import EnumCol
103from lp.services.database.interfaces import IStore
103from lp.services.database.nl_search import nl_phrase_search104from lp.services.database.nl_search import nl_phrase_search
104from lp.services.database.sqlbase import (105from lp.services.database.sqlbase import (
105 cursor,106 cursor,
@@ -206,11 +207,12 @@ class Question(SQLBase, BugLinkTargetMixin):
206 dbName='faq', foreignKey='FAQ', notNull=False, default=None)207 dbName='faq', foreignKey='FAQ', notNull=False, default=None)
207208
208 # useful joins209 # useful joins
209 subscriptions = SQLMultipleJoin('QuestionSubscription',210 subscriptions = ReferenceSet(
210 joinColumn='question', orderBy='id')211 'id', 'QuestionSubscription.question_id',
211 subscribers = SQLRelatedJoin('Person',212 order_by='QuestionSubscription.id')
212 joinColumn='question', otherColumn='person',213 subscribers = ReferenceSet(
213 intermediateTable='QuestionSubscription', orderBy='name')214 'id', 'QuestionSubscription.question_id',
215 'QuestionSubscription.person_id', 'Person.id', order_by='Person.name')
214 messages = SQLMultipleJoin('QuestionMessage', joinColumn='question',216 messages = SQLMultipleJoin('QuestionMessage', joinColumn='question',
215 prejoins=['message'], orderBy=['QuestionMessage.id'])217 prejoins=['message'], orderBy=['QuestionMessage.id'])
216 reopenings = SQLMultipleJoin('QuestionReopening', orderBy='datecreated',218 reopenings = SQLMultipleJoin('QuestionReopening', orderBy='datecreated',
@@ -261,8 +263,11 @@ class Question(SQLBase, BugLinkTargetMixin):
261263
262 def isSubscribed(self, person):264 def isSubscribed(self, person):
263 """See `IQuestion`."""265 """See `IQuestion`."""
264 return bool(266 store = IStore(QuestionSubscription)
265 QuestionSubscription.selectOneBy(question=self, person=person))267 return not store.find(
268 QuestionSubscription,
269 QuestionSubscription.question == self,
270 QuestionSubscription.person == person).is_empty()
266271
267 # Workflow methods272 # Workflow methods
268273
@@ -536,9 +541,7 @@ class Question(SQLBase, BugLinkTargetMixin):
536 '%s does not have permission to unsubscribe %s.' % (541 '%s does not have permission to unsubscribe %s.' % (
537 unsubscribed_by.displayname,542 unsubscribed_by.displayname,
538 person.displayname))543 person.displayname))
539 store = Store.of(sub)544 Store.of(sub).remove(sub)
540 sub.destroySelf()
541 store.flush()
542 return545 return
543546
544 def getDirectSubscribers(self):547 def getDirectSubscribers(self):
diff --git a/lib/lp/answers/model/questionsubscription.py b/lib/lp/answers/model/questionsubscription.py
index c4e2cf7..60b40d2 100644
--- a/lib/lp/answers/model/questionsubscription.py
+++ b/lib/lp/answers/model/questionsubscription.py
@@ -1,17 +1,19 @@
1# Copyright 2009 Canonical Ltd. This software is licensed under the1# Copyright 2009 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""SQLBase implementation of IQuestionSubscription."""4"""StormBase implementation of IQuestionSubscription."""
5
6from __future__ import absolute_import, print_function, unicode_literals
57
6__metaclass__ = type8__metaclass__ = type
79
8__all__ = ['QuestionSubscription']10__all__ = ['QuestionSubscription']
911
10import pytz12import pytz
11from sqlobject import ForeignKey
12from storm.locals import (13from storm.locals import (
13 DateTime,14 DateTime,
14 Int,15 Int,
16 Reference,
15 )17 )
16from zope.interface import implementer18from zope.interface import implementer
1719
@@ -19,29 +21,30 @@ from lp.answers.interfaces.questionsubscription import IQuestionSubscription
19from lp.registry.interfaces.person import validate_public_person21from lp.registry.interfaces.person import validate_public_person
20from lp.registry.interfaces.role import IPersonRoles22from lp.registry.interfaces.role import IPersonRoles
21from lp.services.database.constants import UTC_NOW23from lp.services.database.constants import UTC_NOW
22from lp.services.database.sqlbase import SQLBase24from lp.services.database.stormbase import StormBase
2325
2426
25@implementer(IQuestionSubscription)27@implementer(IQuestionSubscription)
26class QuestionSubscription(SQLBase):28class QuestionSubscription(StormBase):
27 """A subscription for person to a question."""29 """A subscription for person to a question."""
2830
29 _table = 'QuestionSubscription'31 __storm_table__ = 'QuestionSubscription'
3032
31 id = Int(primary=True)33 id = Int(primary=True)
32 question_id = Int("question", allow_none=False)34 question_id = Int(name="question", allow_none=False)
33 question = ForeignKey(35 question = Reference(question_id, 'Question.id')
34 dbName='question', foreignKey='Question', notNull=True)
3536
36 person_id = Int(37 person_id = Int(
37 "person", allow_none=False, validator=validate_public_person)38 name="person", allow_none=False, validator=validate_public_person)
38 person = ForeignKey(39 person = Reference(person_id, 'Person.id')
39 dbName='person', foreignKey='Person',
40 storm_validator=validate_public_person, notNull=True)
4140
42 date_created = DateTime(41 date_created = DateTime(
43 allow_none=False, default=UTC_NOW, tzinfo=pytz.UTC)42 allow_none=False, default=UTC_NOW, tzinfo=pytz.UTC)
4443
44 def __init__(self, question, person):
45 self.question = question
46 self.person = person
47
45 def canBeUnsubscribedByUser(self, user):48 def canBeUnsubscribedByUser(self, user):
46 """See `IQuestionSubscription`."""49 """See `IQuestionSubscription`."""
47 if user is None:50 if user is None:

Subscribers

People subscribed via source and target branches

to status/vote changes: