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
1diff --git a/lib/lp/answers/model/question.py b/lib/lp/answers/model/question.py
2index 036aeb6..921a0c6 100644
3--- a/lib/lp/answers/model/question.py
4+++ b/lib/lp/answers/model/question.py
5@@ -31,10 +31,10 @@ from sqlobject import (
6 ForeignKey,
7 SQLMultipleJoin,
8 SQLObjectNotFound,
9- SQLRelatedJoin,
10 StringCol,
11 )
12 from storm.expr import LeftJoin
13+from storm.references import ReferenceSet
14 from storm.store import Store
15 from zope.component import getUtility
16 from zope.event import notify
17@@ -100,6 +100,7 @@ from lp.services.database.constants import (
18 )
19 from lp.services.database.datetimecol import UtcDateTimeCol
20 from lp.services.database.enumcol import EnumCol
21+from lp.services.database.interfaces import IStore
22 from lp.services.database.nl_search import nl_phrase_search
23 from lp.services.database.sqlbase import (
24 cursor,
25@@ -206,11 +207,12 @@ class Question(SQLBase, BugLinkTargetMixin):
26 dbName='faq', foreignKey='FAQ', notNull=False, default=None)
27
28 # useful joins
29- subscriptions = SQLMultipleJoin('QuestionSubscription',
30- joinColumn='question', orderBy='id')
31- subscribers = SQLRelatedJoin('Person',
32- joinColumn='question', otherColumn='person',
33- intermediateTable='QuestionSubscription', orderBy='name')
34+ subscriptions = ReferenceSet(
35+ 'id', 'QuestionSubscription.question_id',
36+ order_by='QuestionSubscription.id')
37+ subscribers = ReferenceSet(
38+ 'id', 'QuestionSubscription.question_id',
39+ 'QuestionSubscription.person_id', 'Person.id', order_by='Person.name')
40 messages = SQLMultipleJoin('QuestionMessage', joinColumn='question',
41 prejoins=['message'], orderBy=['QuestionMessage.id'])
42 reopenings = SQLMultipleJoin('QuestionReopening', orderBy='datecreated',
43@@ -261,8 +263,11 @@ class Question(SQLBase, BugLinkTargetMixin):
44
45 def isSubscribed(self, person):
46 """See `IQuestion`."""
47- return bool(
48- QuestionSubscription.selectOneBy(question=self, person=person))
49+ store = IStore(QuestionSubscription)
50+ return not store.find(
51+ QuestionSubscription,
52+ QuestionSubscription.question == self,
53+ QuestionSubscription.person == person).is_empty()
54
55 # Workflow methods
56
57@@ -536,9 +541,7 @@ class Question(SQLBase, BugLinkTargetMixin):
58 '%s does not have permission to unsubscribe %s.' % (
59 unsubscribed_by.displayname,
60 person.displayname))
61- store = Store.of(sub)
62- sub.destroySelf()
63- store.flush()
64+ Store.of(sub).remove(sub)
65 return
66
67 def getDirectSubscribers(self):
68diff --git a/lib/lp/answers/model/questionsubscription.py b/lib/lp/answers/model/questionsubscription.py
69index c4e2cf7..60b40d2 100644
70--- a/lib/lp/answers/model/questionsubscription.py
71+++ b/lib/lp/answers/model/questionsubscription.py
72@@ -1,17 +1,19 @@
73 # Copyright 2009 Canonical Ltd. This software is licensed under the
74 # GNU Affero General Public License version 3 (see the file LICENSE).
75
76-"""SQLBase implementation of IQuestionSubscription."""
77+"""StormBase implementation of IQuestionSubscription."""
78+
79+from __future__ import absolute_import, print_function, unicode_literals
80
81 __metaclass__ = type
82
83 __all__ = ['QuestionSubscription']
84
85 import pytz
86-from sqlobject import ForeignKey
87 from storm.locals import (
88 DateTime,
89 Int,
90+ Reference,
91 )
92 from zope.interface import implementer
93
94@@ -19,29 +21,30 @@ from lp.answers.interfaces.questionsubscription import IQuestionSubscription
95 from lp.registry.interfaces.person import validate_public_person
96 from lp.registry.interfaces.role import IPersonRoles
97 from lp.services.database.constants import UTC_NOW
98-from lp.services.database.sqlbase import SQLBase
99+from lp.services.database.stormbase import StormBase
100
101
102 @implementer(IQuestionSubscription)
103-class QuestionSubscription(SQLBase):
104+class QuestionSubscription(StormBase):
105 """A subscription for person to a question."""
106
107- _table = 'QuestionSubscription'
108+ __storm_table__ = 'QuestionSubscription'
109
110 id = Int(primary=True)
111- question_id = Int("question", allow_none=False)
112- question = ForeignKey(
113- dbName='question', foreignKey='Question', notNull=True)
114+ question_id = Int(name="question", allow_none=False)
115+ question = Reference(question_id, 'Question.id')
116
117 person_id = Int(
118- "person", allow_none=False, validator=validate_public_person)
119- person = ForeignKey(
120- dbName='person', foreignKey='Person',
121- storm_validator=validate_public_person, notNull=True)
122+ name="person", allow_none=False, validator=validate_public_person)
123+ person = Reference(person_id, 'Person.id')
124
125 date_created = DateTime(
126 allow_none=False, default=UTC_NOW, tzinfo=pytz.UTC)
127
128+ def __init__(self, question, person):
129+ self.question = question
130+ self.person = person
131+
132 def canBeUnsubscribedByUser(self, user):
133 """See `IQuestionSubscription`."""
134 if user is None:

Subscribers

People subscribed via source and target branches

to status/vote changes: