Merge ~cjwatson/launchpad:stormify-translationgroup into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: b0fedd04dd0044c7950efbe1db3e1292b84a5fcc
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:stormify-translationgroup
Merge into: launchpad:master
Diff against target: 306 lines (+68/-61)
7 files modified
lib/lp/registry/model/distribution.py (+3/-5)
lib/lp/registry/model/product.py (+4/-6)
lib/lp/registry/model/projectgroup.py (+4/-5)
lib/lp/testing/factory.py (+6/-4)
lib/lp/translations/model/translationgroup.py (+44/-34)
lib/lp/translations/model/translationsperson.py (+5/-5)
lib/lp/translations/vocabularies.py (+2/-2)
Reviewer Review Type Date Requested Status
Guruprasad Approve
Review via email: mp+435737@code.launchpad.net

Commit message

Convert TranslationGroup to Storm

To post a comment you must log in.
Revision history for this message
Guruprasad (lgp171188) wrote :

LGTM 👍

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/registry/model/distribution.py b/lib/lp/registry/model/distribution.py
2index 5e0a7ff..af6ce95 100644
3--- a/lib/lp/registry/model/distribution.py
4+++ b/lib/lp/registry/model/distribution.py
5@@ -308,12 +308,10 @@ class Distribution(
6 notNull=False,
7 default=None,
8 )
9- translationgroup = ForeignKey(
10- dbName="translationgroup",
11- foreignKey="TranslationGroup",
12- notNull=False,
13- default=None,
14+ translationgroup_id = Int(
15+ name="translationgroup", allow_none=True, default=None
16 )
17+ translationgroup = Reference(translationgroup_id, "TranslationGroup.id")
18 translationpermission = DBEnum(
19 name="translationpermission",
20 allow_none=False,
21diff --git a/lib/lp/registry/model/product.py b/lib/lp/registry/model/product.py
22index f905576..8a941d8 100644
23--- a/lib/lp/registry/model/product.py
24+++ b/lib/lp/registry/model/product.py
25@@ -32,7 +32,7 @@ from storm.expr import (
26 Or,
27 Select,
28 )
29-from storm.locals import Int, List, Store, Unicode
30+from storm.locals import Int, List, Reference, Store, Unicode
31 from zope.component import getUtility
32 from zope.event import notify
33 from zope.interface import implementer
34@@ -332,12 +332,10 @@ class Product(
35 )
36 downloadurl = StringCol(dbName="downloadurl", notNull=False, default=None)
37 lastdoap = StringCol(dbName="lastdoap", notNull=False, default=None)
38- translationgroup = ForeignKey(
39- dbName="translationgroup",
40- foreignKey="TranslationGroup",
41- notNull=False,
42- default=None,
43+ translationgroup_id = Int(
44+ name="translationgroup", allow_none=True, default=None
45 )
46+ translationgroup = Reference(translationgroup_id, "TranslationGroup.id")
47 translationpermission = DBEnum(
48 name="translationpermission",
49 allow_none=False,
50diff --git a/lib/lp/registry/model/projectgroup.py b/lib/lp/registry/model/projectgroup.py
51index f6f9966..135c433 100644
52--- a/lib/lp/registry/model/projectgroup.py
53+++ b/lib/lp/registry/model/projectgroup.py
54@@ -11,6 +11,7 @@ __all__ = [
55
56 import six
57 from storm.expr import SQL, And, In, Join
58+from storm.locals import Int, Reference
59 from storm.store import Store
60 from zope.component import getUtility
61 from zope.interface import implementer
62@@ -151,12 +152,10 @@ class ProjectGroup(
63 )
64 freshmeatproject = None
65 lastdoap = StringCol(dbName="lastdoap", notNull=False, default=None)
66- translationgroup = ForeignKey(
67- dbName="translationgroup",
68- foreignKey="TranslationGroup",
69- notNull=False,
70- default=None,
71+ translationgroup_id = Int(
72+ name="translationgroup", allow_none=True, default=None
73 )
74+ translationgroup = Reference(translationgroup_id, "TranslationGroup.id")
75 translationpermission = DBEnum(
76 name="translationpermission",
77 allow_none=False,
78diff --git a/lib/lp/testing/factory.py b/lib/lp/testing/factory.py
79index 2e8dae2..9a672aa 100644
80--- a/lib/lp/testing/factory.py
81+++ b/lib/lp/testing/factory.py
82@@ -894,14 +894,16 @@ class LaunchpadObjectFactory(ObjectFactory):
83 if owner is None:
84 owner = self.makePerson()
85 if name is None:
86- name = self.getUniqueString("translationgroup")
87+ name = self.getUniqueUnicode("translationgroup")
88 if title is None:
89- title = self.getUniqueString("title")
90+ title = self.getUniqueUnicode("title")
91 if summary is None:
92- summary = self.getUniqueString("summary")
93- return getUtility(ITranslationGroupSet).new(
94+ summary = self.getUniqueUnicode("summary")
95+ group = getUtility(ITranslationGroupSet).new(
96 name, title, summary, url, owner
97 )
98+ IStore(group).flush()
99+ return group
100
101 def makeTranslator(
102 self,
103diff --git a/lib/lp/translations/model/translationgroup.py b/lib/lp/translations/model/translationgroup.py
104index 8d59714..b0cea94 100644
105--- a/lib/lp/translations/model/translationgroup.py
106+++ b/lib/lp/translations/model/translationgroup.py
107@@ -8,8 +8,10 @@ __all__ = [
108
109 import operator
110
111+import pytz
112 from storm.expr import Desc, Join, LeftJoin
113-from storm.references import ReferenceSet
114+from storm.properties import DateTime, Int, Unicode
115+from storm.references import Reference, ReferenceSet
116 from storm.store import Store
117 from zope.interface import implementer
118
119@@ -19,16 +21,9 @@ from lp.registry.model.person import Person
120 from lp.registry.model.teammembership import TeamParticipation
121 from lp.services.database import bulk
122 from lp.services.database.constants import DEFAULT
123-from lp.services.database.datetimecol import UtcDateTimeCol
124 from lp.services.database.decoratedresultset import DecoratedResultSet
125 from lp.services.database.interfaces import IStandbyStore, IStore
126-from lp.services.database.sqlbase import SQLBase
127-from lp.services.database.sqlobject import (
128- ForeignKey,
129- SQLMultipleJoin,
130- SQLObjectNotFound,
131- StringCol,
132-)
133+from lp.services.database.stormbase import StormBase
134 from lp.services.librarian.model import LibraryFileAlias, LibraryFileContent
135 from lp.services.worlddata.model.language import Language
136 from lp.translations.interfaces.translationgroup import (
137@@ -39,38 +34,51 @@ from lp.translations.model.translator import Translator
138
139
140 @implementer(ITranslationGroup)
141-class TranslationGroup(SQLBase):
142+class TranslationGroup(StormBase):
143 """A TranslationGroup."""
144
145+ __storm_table__ = "TranslationGroup"
146 # default to listing alphabetically
147- _defaultOrder = "name"
148+ __storm_order__ = "name"
149
150 # db field names
151- name = StringCol(unique=True, alternateID=True, notNull=True)
152- title = StringCol(notNull=True)
153- summary = StringCol(notNull=True)
154- datecreated = UtcDateTimeCol(notNull=True, default=DEFAULT)
155- owner = ForeignKey(
156- dbName="owner",
157- foreignKey="Person",
158- storm_validator=validate_public_person,
159- notNull=True,
160+ id = Int(primary=True)
161+ name = Unicode(allow_none=False)
162+ title = Unicode(allow_none=False)
163+ summary = Unicode(allow_none=False)
164+ datecreated = DateTime(allow_none=False, default=DEFAULT, tzinfo=pytz.UTC)
165+ owner_id = Int(
166+ name="owner", validator=validate_public_person, allow_none=False
167 )
168+ owner = Reference(owner_id, "Person.id")
169
170 # useful joins
171- distributions = SQLMultipleJoin(
172- "Distribution", joinColumn="translationgroup"
173- )
174+ distributions = ReferenceSet("id", "Distribution.translationgroup_id")
175 languages = ReferenceSet(
176- "<primary key>",
177+ "id",
178 "Translator.translationgroup_id",
179 "Translator.language_id",
180 "Language.id",
181 )
182- translators = ReferenceSet(
183- "<primary key>", "Translator.translationgroup_id"
184- )
185- translation_guide_url = StringCol(notNull=False, default=None)
186+ translators = ReferenceSet("id", "Translator.translationgroup_id")
187+ translation_guide_url = Unicode(allow_none=True, default=None)
188+
189+ def __init__(
190+ self,
191+ name,
192+ title,
193+ summary,
194+ owner,
195+ datecreated=DEFAULT,
196+ translation_guide_url=None,
197+ ):
198+ super().__init__()
199+ self.name = name
200+ self.title = title
201+ self.summary = summary
202+ self.owner = owner
203+ self.datecreated = datecreated
204+ self.translation_guide_url = translation_guide_url
205
206 def __getitem__(self, language_code):
207 """See `ITranslationGroup`."""
208@@ -205,7 +213,7 @@ class TranslationGroup(SQLBase):
209 IStore(Product)
210 .find(
211 Product,
212- Product.translationgroupID == self.id,
213+ Product.translationgroup == self,
214 Product.active == True,
215 ProductSet.getProductPrivacyFilter(user),
216 )
217@@ -241,7 +249,7 @@ class TranslationGroup(SQLBase):
218 .using(*using)
219 .find(
220 tables,
221- ProjectGroup.translationgroupID == self.id,
222+ ProjectGroup.translationgroup == self,
223 ProjectGroup.active == True,
224 )
225 .order_by(ProjectGroup.display_name)
226@@ -272,7 +280,7 @@ class TranslationGroup(SQLBase):
227 distro_data = (
228 IStandbyStore(Distribution)
229 .using(*using)
230- .find(tables, Distribution.translationgroupID == self.id)
231+ .find(tables, Distribution.translationgroup == self)
232 .order_by(Distribution.display_name)
233 )
234
235@@ -305,10 +313,12 @@ class TranslationGroupSet:
236
237 def getByName(self, name):
238 """See ITranslationGroupSet."""
239- try:
240- return TranslationGroup.byName(name)
241- except SQLObjectNotFound:
242+ group = (
243+ IStore(TranslationGroup).find(TranslationGroup, name=name).one()
244+ )
245+ if group is None:
246 raise NotFoundError(name)
247+ return group
248
249 def _get(self):
250 return IStore(TranslationGroup).find(TranslationGroup)
251diff --git a/lib/lp/translations/model/translationsperson.py b/lib/lp/translations/model/translationsperson.py
252index 693eccb..6126a9f 100644
253--- a/lib/lp/translations/model/translationsperson.py
254+++ b/lib/lp/translations/model/translationsperson.py
255@@ -321,7 +321,7 @@ class TranslationsPerson:
256 Join(
257 SQL("reviewable_groups"),
258 SQL("reviewable_groups.id")
259- == Distribution.translationgroupID,
260+ == Distribution.translationgroup_id,
261 ),
262 ],
263 ),
264@@ -348,7 +348,7 @@ class TranslationsPerson:
265 Join(
266 SQL("reviewable_groups"),
267 SQL("reviewable_groups.id")
268- == Product.translationgroupID,
269+ == Product.translationgroup_id,
270 ),
271 ],
272 ),
273@@ -421,9 +421,9 @@ class TranslationsPerson:
274
275 # Look up translation group.
276 groupjoin_conditions = Or(
277- TranslationGroup.id == Product.translationgroupID,
278- TranslationGroup.id == Distribution.translationgroupID,
279- TranslationGroup.id == ProjectGroup.translationgroupID,
280+ TranslationGroup.id == Product.translationgroup_id,
281+ TranslationGroup.id == Distribution.translationgroup_id,
282+ TranslationGroup.id == ProjectGroup.translationgroup_id,
283 )
284 if expect_reviewer_status:
285 GroupJoin = Join(TranslationGroup, groupjoin_conditions)
286diff --git a/lib/lp/translations/vocabularies.py b/lib/lp/translations/vocabularies.py
287index 3fa4d3b..501f89c 100644
288--- a/lib/lp/translations/vocabularies.py
289+++ b/lib/lp/translations/vocabularies.py
290@@ -19,7 +19,7 @@ from zope.schema.vocabulary import SimpleTerm
291 from lp.registry.interfaces.distroseries import IDistroSeries
292 from lp.services.database.sqlobject import AND
293 from lp.services.webapp.vocabulary import (
294- NamedSQLObjectVocabulary,
295+ NamedStormVocabulary,
296 SQLObjectVocabularyBase,
297 StormVocabularyBase,
298 )
299@@ -75,7 +75,7 @@ class TranslatableLanguageVocabulary(LanguageVocabulary):
300 return term
301
302
303-class TranslationGroupVocabulary(NamedSQLObjectVocabulary):
304+class TranslationGroupVocabulary(NamedStormVocabulary):
305
306 _table = TranslationGroup
307

Subscribers

People subscribed via source and target branches

to status/vote changes: