Merge ~cjwatson/launchpad:storm-base into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 7ae04b7ef4708c37737b0556f1fbc8e17b80fb9d
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:storm-base
Merge into: launchpad:master
Diff against target: 1589 lines (+160/-153)
53 files modified
.pre-commit-config.yaml (+1/-0)
lib/lp/archivepublisher/model/publisherconfig.py (+3/-2)
lib/lp/bugs/model/bugsummary.py (+2/-2)
lib/lp/bugs/model/bugtarget.py (+3/-2)
lib/lp/bugs/model/bugtaskflat.py (+3/-2)
lib/lp/bugs/model/structuralsubscription.py (+2/-2)
lib/lp/buildmaster/model/buildfarmjob.py (+3/-2)
lib/lp/charms/model/charmbase.py (+4/-3)
lib/lp/code/model/branchrevision.py (+3/-2)
lib/lp/code/model/diff.py (+4/-3)
lib/lp/code/model/revision.py (+1/-2)
lib/lp/code/model/seriessourcepackagebranch.py (+3/-2)
lib/lp/code/model/sourcepackagerecipe.py (+3/-3)
lib/lp/code/model/sourcepackagerecipebuild.py (+3/-2)
lib/lp/code/model/sourcepackagerecipedata.py (+3/-3)
lib/lp/oci/browser/tests/test_ocirecipe.py (+3/-2)
lib/lp/oci/model/ocipushrule.py (+3/-2)
lib/lp/oci/model/ocirecipe.py (+4/-3)
lib/lp/oci/model/ociregistrycredentials.py (+3/-2)
lib/lp/registry/browser/tests/test_distribution_views.py (+5/-3)
lib/lp/registry/model/distributionsourcepackage.py (+3/-2)
lib/lp/registry/model/distroseriesdifferencecomment.py (+3/-2)
lib/lp/registry/model/distroseriesparent.py (+3/-2)
lib/lp/registry/model/person.py (+1/-2)
lib/lp/scripts/tests/test_garbo.py (+3/-2)
lib/lp/services/apachelogparser/model/parsedapachelog.py (+3/-2)
lib/lp/services/database/sqlbase.py (+3/-2)
lib/lp/services/database/stormbase.py (+2/-2)
lib/lp/services/features/model.py (+4/-3)
lib/lp/services/messages/model/message.py (+2/-2)
lib/lp/services/openid/model/openididentifier.py (+3/-2)
lib/lp/services/session/model.py (+4/-3)
lib/lp/services/webapp/vocabulary.py (+4/-4)
lib/lp/snappy/model/snap.py (+4/-12)
lib/lp/snappy/model/snapbase.py (+4/-12)
lib/lp/snappy/model/snapbuild.py (+3/-3)
lib/lp/snappy/model/snappyseries.py (+4/-12)
lib/lp/soyuz/model/archive.py (+2/-2)
lib/lp/soyuz/model/archiveauthtoken.py (+3/-11)
lib/lp/soyuz/model/archivefile.py (+3/-2)
lib/lp/soyuz/model/archivesubscriber.py (+3/-2)
lib/lp/soyuz/model/binarypackagerelease.py (+3/-2)
lib/lp/soyuz/model/distroarchseriesfilter.py (+3/-2)
lib/lp/soyuz/model/livefs.py (+2/-2)
lib/lp/soyuz/model/livefsbuild.py (+3/-3)
lib/lp/soyuz/model/packagecopyrequest.py (+3/-2)
lib/lp/soyuz/model/packageset.py (+3/-2)
lib/lp/soyuz/model/packagesetgroup.py (+3/-2)
lib/lp/soyuz/model/packagesetsources.py (+4/-2)
lib/lp/soyuz/model/reporting.py (+2/-2)
lib/lp/soyuz/model/sourcepackageformat.py (+3/-2)
lib/lp/translations/model/translationtemplatesbuild.py (+3/-2)
setup.cfg (+5/-0)
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+436687@code.launchpad.net

Commit message

Inherit from StormBase instead of directly from Storm

Description of the change

`lp.services.database.stormbase.StormBase` is described as "A safe version of storm.base.Storm to use in Launchpad", so let's actually use it everywhere. This will eventually give us a common Launchpad-controlled base class for all our ORM models (though there are currently two, until we get rid of `lp.services.database.sqlbase.SQLBase`).

I looked through https://github.com/DmytroLitvinov/awesome-flake8-extensions for plugins that might help in enforcing this, and `flake8-alfred` seemed to be the best match; this saved me a considerable amount of time searching for imports formatted in various ways.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
2index 643d1e6..1a7a1f4 100644
3--- a/.pre-commit-config.yaml
4+++ b/.pre-commit-config.yaml
5@@ -57,6 +57,7 @@ repos:
6 exclude: ^lib/contrib/
7 additional_dependencies:
8 - flake8-absolute-import==1.0.0.1
9+ - flake8-alfred==1.1.1
10 - repo: https://github.com/pre-commit/mirrors-eslint
11 rev: v8.33.0
12 hooks:
13diff --git a/lib/lp/archivepublisher/model/publisherconfig.py b/lib/lp/archivepublisher/model/publisherconfig.py
14index e5cd108..3842a88 100644
15--- a/lib/lp/archivepublisher/model/publisherconfig.py
16+++ b/lib/lp/archivepublisher/model/publisherconfig.py
17@@ -8,7 +8,7 @@ __all__ = [
18 "PublisherConfigSet",
19 ]
20
21-from storm.locals import Int, Reference, Storm, Unicode
22+from storm.locals import Int, Reference, Unicode
23 from zope.interface import implementer
24
25 from lp.archivepublisher.interfaces.publisherconfig import (
26@@ -16,10 +16,11 @@ from lp.archivepublisher.interfaces.publisherconfig import (
27 IPublisherConfigSet,
28 )
29 from lp.services.database.interfaces import IPrimaryStore, IStore
30+from lp.services.database.stormbase import StormBase
31
32
33 @implementer(IPublisherConfig)
34-class PublisherConfig(Storm):
35+class PublisherConfig(StormBase):
36 """See `IArchiveAuthToken`."""
37
38 __storm_table__ = "PublisherConfig"
39diff --git a/lib/lp/bugs/model/bugsummary.py b/lib/lp/bugs/model/bugsummary.py
40index 9084e0e..4b7d24b 100644
41--- a/lib/lp/bugs/model/bugsummary.py
42+++ b/lib/lp/bugs/model/bugsummary.py
43@@ -9,7 +9,6 @@ __all__ = [
44 "get_bugsummary_filter_for_user",
45 ]
46
47-from storm.base import Storm
48 from storm.expr import SQL, And, Or, Select
49 from storm.properties import Bool, Int, Unicode
50 from storm.references import Reference
51@@ -34,11 +33,12 @@ from lp.registry.model.sourcepackagename import SourcePackageName
52 from lp.registry.model.teammembership import TeamParticipation
53 from lp.services.database.enumcol import DBEnum
54 from lp.services.database.interfaces import IStore
55+from lp.services.database.stormbase import StormBase
56 from lp.services.database.stormexpr import WithMaterialized
57
58
59 @implementer(IBugSummary)
60-class BugSummary(Storm):
61+class BugSummary(StormBase):
62 """BugSummary Storm database class."""
63
64 __storm_table__ = "combinedbugsummary"
65diff --git a/lib/lp/bugs/model/bugtarget.py b/lib/lp/bugs/model/bugtarget.py
66index 7c2e0c4..2778def 100644
67--- a/lib/lp/bugs/model/bugtarget.py
68+++ b/lib/lp/bugs/model/bugtarget.py
69@@ -10,7 +10,7 @@ __all__ = [
70 "OfficialBugTagTargetMixin",
71 ]
72
73-from storm.locals import Int, Reference, Storm, Unicode
74+from storm.locals import Int, Reference, Unicode
75 from zope.component import getUtility
76 from zope.interface import implementer
77
78@@ -26,6 +26,7 @@ from lp.bugs.model.bugtask import BugTaskSet
79 from lp.registry.interfaces.distribution import IDistribution
80 from lp.registry.interfaces.product import IProduct
81 from lp.services.database.interfaces import IStore
82+from lp.services.database.stormbase import StormBase
83
84
85 class HasBugsBase:
86@@ -215,7 +216,7 @@ class OfficialBugTagTargetMixin:
87
88
89 @implementer(IOfficialBugTag)
90-class OfficialBugTag(Storm):
91+class OfficialBugTag(StormBase):
92 """See `IOfficialBugTag`."""
93
94 # XXX Abel Deuring, 2009-03-11: The SQL table OfficialBugTag has
95diff --git a/lib/lp/bugs/model/bugtaskflat.py b/lib/lp/bugs/model/bugtaskflat.py
96index b25a440..16ad071 100644
97--- a/lib/lp/bugs/model/bugtaskflat.py
98+++ b/lib/lp/bugs/model/bugtaskflat.py
99@@ -1,7 +1,7 @@
100 # Copyright 2012-2020 Canonical Ltd. This software is licensed under the
101 # GNU Affero General Public License version 3 (see the file LICENSE).
102
103-from storm.locals import Bool, DateTime, Int, List, Reference, Storm
104+from storm.locals import Bool, DateTime, Int, List, Reference
105
106 from lp.app.enums import InformationType
107 from lp.bugs.interfaces.bugtask import (
108@@ -10,9 +10,10 @@ from lp.bugs.interfaces.bugtask import (
109 BugTaskStatusSearch,
110 )
111 from lp.services.database.enumcol import DBEnum
112+from lp.services.database.stormbase import StormBase
113
114
115-class BugTaskFlat(Storm):
116+class BugTaskFlat(StormBase):
117
118 __storm_table__ = "BugTaskFlat"
119
120diff --git a/lib/lp/bugs/model/structuralsubscription.py b/lib/lp/bugs/model/structuralsubscription.py
121index e0409ab..dff0e8f 100644
122--- a/lib/lp/bugs/model/structuralsubscription.py
123+++ b/lib/lp/bugs/model/structuralsubscription.py
124@@ -14,7 +14,6 @@ __all__ = [
125 from collections import defaultdict
126
127 import pytz
128-from storm.base import Storm
129 from storm.expr import (
130 SQL,
131 And,
132@@ -72,6 +71,7 @@ from lp.registry.interfaces.sourcepackage import ISourcePackage
133 from lp.registry.model.teammembership import TeamParticipation
134 from lp.services.database.constants import UTC_NOW
135 from lp.services.database.interfaces import IStore
136+from lp.services.database.stormbase import StormBase
137 from lp.services.database.stormexpr import (
138 Array,
139 ArrayAgg,
140@@ -82,7 +82,7 @@ from lp.services.propertycache import cachedproperty
141
142
143 @implementer(IStructuralSubscription)
144-class StructuralSubscription(Storm):
145+class StructuralSubscription(StormBase):
146 """A subscription to a Launchpad structure."""
147
148 __storm_table__ = "StructuralSubscription"
149diff --git a/lib/lp/buildmaster/model/buildfarmjob.py b/lib/lp/buildmaster/model/buildfarmjob.py
150index a94c134..14303c4 100644
151--- a/lib/lp/buildmaster/model/buildfarmjob.py
152+++ b/lib/lp/buildmaster/model/buildfarmjob.py
153@@ -12,7 +12,7 @@ import datetime
154
155 import pytz
156 from storm.expr import Desc, LeftJoin, Or
157-from storm.locals import DateTime, Int, Reference, Storm
158+from storm.locals import DateTime, Int, Reference
159 from storm.store import Store
160 from zope.component import getUtility
161 from zope.interface import implementer, provider
162@@ -29,6 +29,7 @@ from lp.buildmaster.interfaces.buildfarmjob import (
163 from lp.buildmaster.model.buildqueue import BuildQueue
164 from lp.services.database.enumcol import DBEnum
165 from lp.services.database.interfaces import IPrimaryStore, IStore
166+from lp.services.database.stormbase import StormBase
167 from lp.services.propertycache import cachedproperty, get_property_cache
168 from lp.services.statsd.interfaces.statsd_client import IStatsdClient
169
170@@ -53,7 +54,7 @@ VALID_STATUS_TRANSITIONS = {
171
172 @implementer(IBuildFarmJob, IBuildFarmJobDB)
173 @provider(IBuildFarmJobSource)
174-class BuildFarmJob(Storm):
175+class BuildFarmJob(StormBase):
176 """A base implementation for `IBuildFarmJob` classes."""
177
178 __storm_table__ = "BuildFarmJob"
179diff --git a/lib/lp/charms/model/charmbase.py b/lib/lp/charms/model/charmbase.py
180index 76ef34f..bfff346 100644
181--- a/lib/lp/charms/model/charmbase.py
182+++ b/lib/lp/charms/model/charmbase.py
183@@ -9,7 +9,7 @@ __all__ = [
184
185 import pytz
186 from storm.databases.postgres import JSON
187-from storm.locals import DateTime, Int, Reference, Store, Storm
188+from storm.locals import DateTime, Int, Reference, Store
189 from zope.interface import implementer
190
191 from lp.buildmaster.model.processor import Processor
192@@ -21,10 +21,11 @@ from lp.charms.interfaces.charmbase import (
193 )
194 from lp.services.database.constants import DEFAULT
195 from lp.services.database.interfaces import IPrimaryStore, IStore
196+from lp.services.database.stormbase import StormBase
197
198
199 @implementer(ICharmBase)
200-class CharmBase(Storm):
201+class CharmBase(StormBase):
202 """See `ICharmBase`."""
203
204 __storm_table__ = "CharmBase"
205@@ -91,7 +92,7 @@ class CharmBase(Storm):
206 Store.of(self).remove(self)
207
208
209-class CharmBaseArch(Storm):
210+class CharmBaseArch(StormBase):
211 """Link table to back `CharmBase.processors`."""
212
213 __storm_table__ = "CharmBaseArch"
214diff --git a/lib/lp/code/model/branchrevision.py b/lib/lp/code/model/branchrevision.py
215index 9d0fc80..847f034 100644
216--- a/lib/lp/code/model/branchrevision.py
217+++ b/lib/lp/code/model/branchrevision.py
218@@ -5,14 +5,15 @@ __all__ = [
219 "BranchRevision",
220 ]
221
222-from storm.locals import Int, Reference, Storm
223+from storm.locals import Int, Reference
224 from zope.interface import implementer
225
226 from lp.code.interfaces.branchrevision import IBranchRevision
227+from lp.services.database.stormbase import StormBase
228
229
230 @implementer(IBranchRevision)
231-class BranchRevision(Storm):
232+class BranchRevision(StormBase):
233 """See `IBranchRevision`."""
234
235 __storm_table__ = "BranchRevision"
236diff --git a/lib/lp/code/model/diff.py b/lib/lp/code/model/diff.py
237index 7def5fd..6f11c56 100644
238--- a/lib/lp/code/model/diff.py
239+++ b/lib/lp/code/model/diff.py
240@@ -23,7 +23,7 @@ from breezy.merge import Merge3Merger
241 from breezy.patches import Patch, parse_patches
242 from breezy.plugins.difftacular.generate_diff import diff_ignore_branches
243 from lazr.delegates import delegate_to
244-from storm.locals import Int, Reference, Storm, Unicode
245+from storm.locals import Int, Reference, Unicode
246 from zope.component import getUtility
247 from zope.error.interfaces import IErrorReportingUtility
248 from zope.interface import implementer
249@@ -37,6 +37,7 @@ from lp.services.database.constants import UTC_NOW
250 from lp.services.database.datetimecol import UtcDateTimeCol
251 from lp.services.database.sqlbase import SQLBase
252 from lp.services.database.sqlobject import ForeignKey, IntCol, StringCol
253+from lp.services.database.stormbase import StormBase
254 from lp.services.librarian.interfaces import ILibraryFileAliasSet
255 from lp.services.librarian.interfaces.client import (
256 LIBRARIAN_SERVER_DEFAULT_TIMEOUT,
257@@ -335,7 +336,7 @@ class Diff(SQLBase):
258
259 @implementer(IIncrementalDiff)
260 @delegate_to(IDiff, context="diff")
261-class IncrementalDiff(Storm):
262+class IncrementalDiff(StormBase):
263 """See `IIncrementalDiff."""
264
265 __storm_table__ = "IncrementalDiff"
266@@ -365,7 +366,7 @@ class IncrementalDiff(Storm):
267
268 @implementer(IPreviewDiff)
269 @delegate_to(IDiff, context="diff")
270-class PreviewDiff(Storm):
271+class PreviewDiff(StormBase):
272 """See `IPreviewDiff`."""
273
274 __storm_table__ = "PreviewDiff"
275diff --git a/lib/lp/code/model/revision.py b/lib/lp/code/model/revision.py
276index 9d1a631..96b4320 100644
277--- a/lib/lp/code/model/revision.py
278+++ b/lib/lp/code/model/revision.py
279@@ -24,7 +24,6 @@ from storm.locals import (
280 Min,
281 Reference,
282 ReferenceSet,
283- Storm,
284 Unicode,
285 )
286 from storm.store import Store
287@@ -713,7 +712,7 @@ def revision_time_limit(day_limit):
288 )
289
290
291-class RevisionCache(Storm):
292+class RevisionCache(StormBase):
293 """A cached version of a recent revision."""
294
295 __storm_table__ = "RevisionCache"
296diff --git a/lib/lp/code/model/seriessourcepackagebranch.py b/lib/lp/code/model/seriessourcepackagebranch.py
297index 110df7d..da5327a 100644
298--- a/lib/lp/code/model/seriessourcepackagebranch.py
299+++ b/lib/lp/code/model/seriessourcepackagebranch.py
300@@ -11,7 +11,7 @@ __all__ = [
301 from datetime import datetime
302
303 import pytz
304-from storm.locals import DateTime, Int, Reference, Storm
305+from storm.locals import DateTime, Int, Reference
306 from zope.interface import implementer
307
308 from lp.code.interfaces.seriessourcepackagebranch import (
309@@ -21,10 +21,11 @@ from lp.code.interfaces.seriessourcepackagebranch import (
310 from lp.registry.interfaces.pocket import PackagePublishingPocket
311 from lp.services.database.enumcol import DBEnum
312 from lp.services.database.interfaces import IPrimaryStore, IStore
313+from lp.services.database.stormbase import StormBase
314
315
316 @implementer(ISeriesSourcePackageBranch)
317-class SeriesSourcePackageBranch(Storm):
318+class SeriesSourcePackageBranch(StormBase):
319 """See `ISeriesSourcePackageBranch`."""
320
321 __storm_table__ = "SeriesSourcePackageBranch"
322diff --git a/lib/lp/code/model/sourcepackagerecipe.py b/lib/lp/code/model/sourcepackagerecipe.py
323index 38ea8f6..de53ee2 100644
324--- a/lib/lp/code/model/sourcepackagerecipe.py
325+++ b/lib/lp/code/model/sourcepackagerecipe.py
326@@ -21,7 +21,6 @@ from storm.locals import (
327 Reference,
328 ReferenceSet,
329 Store,
330- Storm,
331 Unicode,
332 )
333 from zope.component import getUtility
334@@ -48,6 +47,7 @@ from lp.services.database.bulk import load_referencing
335 from lp.services.database.constants import DEFAULT, UTC_NOW
336 from lp.services.database.datetimecol import UtcDateTimeCol
337 from lp.services.database.interfaces import IPrimaryStore, IStore
338+from lp.services.database.stormbase import StormBase
339 from lp.services.database.stormexpr import Greatest, NullsLast
340 from lp.services.propertycache import cachedproperty, get_property_cache
341 from lp.soyuz.model.archive import Archive
342@@ -67,7 +67,7 @@ class NonPPABuildRequest(Exception):
343 unsupported."""
344
345
346-class _SourcePackageRecipeDistroSeries(Storm):
347+class _SourcePackageRecipeDistroSeries(StormBase):
348 """Link table for many-to-many relationship."""
349
350 __storm_table__ = "SourcePackageRecipeDistroSeries"
351@@ -83,7 +83,7 @@ class _SourcePackageRecipeDistroSeries(Storm):
352 @implementer(ISourcePackageRecipe)
353 @provider(ISourcePackageRecipeSource)
354 @delegate_to(ISourcePackageRecipeData, context="_recipe_data")
355-class SourcePackageRecipe(Storm):
356+class SourcePackageRecipe(StormBase):
357 """See `ISourcePackageRecipe` and `ISourcePackageRecipeSource`."""
358
359 __storm_table__ = "SourcePackageRecipe"
360diff --git a/lib/lp/code/model/sourcepackagerecipebuild.py b/lib/lp/code/model/sourcepackagerecipebuild.py
361index 11d0658..eb600f6 100644
362--- a/lib/lp/code/model/sourcepackagerecipebuild.py
363+++ b/lib/lp/code/model/sourcepackagerecipebuild.py
364@@ -12,7 +12,7 @@ from datetime import timedelta
365
366 import pytz
367 from psycopg2 import ProgrammingError
368-from storm.locals import Bool, DateTime, Int, Reference, Storm, Unicode
369+from storm.locals import Bool, DateTime, Int, Reference, Unicode
370 from storm.store import EmptyResultSet, Store
371 from zope.component import getUtility
372 from zope.interface import implementer, provider
373@@ -44,6 +44,7 @@ from lp.services.database.constants import UTC_NOW
374 from lp.services.database.decoratedresultset import DecoratedResultSet
375 from lp.services.database.enumcol import DBEnum
376 from lp.services.database.interfaces import IPrimaryStore, IStore
377+from lp.services.database.stormbase import StormBase
378 from lp.services.librarian.browser import ProxiedLibraryFileAlias
379 from lp.soyuz.interfaces.archive import CannotUploadToArchive
380 from lp.soyuz.model.archive import Archive
381@@ -54,7 +55,7 @@ from lp.soyuz.model.sourcepackagerelease import SourcePackageRelease
382 @implementer(ISourcePackageRecipeBuild)
383 @provider(ISourcePackageRecipeBuildSource)
384 class SourcePackageRecipeBuild(
385- SpecificBuildFarmJobSourceMixin, PackageBuildMixin, Storm
386+ SpecificBuildFarmJobSourceMixin, PackageBuildMixin, StormBase
387 ):
388
389 __storm_table__ = "SourcePackageRecipeBuild"
390diff --git a/lib/lp/code/model/sourcepackagerecipedata.py b/lib/lp/code/model/sourcepackagerecipedata.py
391index 9823360..ae00b03 100644
392--- a/lib/lp/code/model/sourcepackagerecipedata.py
393+++ b/lib/lp/code/model/sourcepackagerecipedata.py
394@@ -33,7 +33,6 @@ from storm.locals import (
395 ReferenceSet,
396 Select,
397 Store,
398- Storm,
399 Unicode,
400 )
401 from zope.component import getUtility
402@@ -62,6 +61,7 @@ from lp.code.model.gitrepository import GitRepository
403 from lp.services.database.bulk import load_referencing, load_related
404 from lp.services.database.enumcol import DBEnum
405 from lp.services.database.interfaces import IStore
406+from lp.services.database.stormbase import StormBase
407 from lp.services.propertycache import (
408 cachedproperty,
409 clear_property_cache,
410@@ -97,7 +97,7 @@ class InstructionType(DBEnumeratedType):
411 )
412
413
414-class _SourcePackageRecipeDataInstruction(Storm):
415+class _SourcePackageRecipeDataInstruction(StormBase):
416 """A single line from a recipe."""
417
418 __storm_table__ = "SourcePackageRecipeDataInstruction"
419@@ -192,7 +192,7 @@ MAX_RECIPE_FORMAT = 0.4
420
421 @implementer(ISourcePackageRecipeData)
422 @provider(IRecipeBranchSource, ISourcePackageRecipeDataSource)
423-class SourcePackageRecipeData(Storm):
424+class SourcePackageRecipeData(StormBase):
425 """The database representation of a BaseRecipeBranch from bzr-builder.
426
427 This is referenced from the SourcePackageRecipe table as the 'recipe_data'
428diff --git a/lib/lp/oci/browser/tests/test_ocirecipe.py b/lib/lp/oci/browser/tests/test_ocirecipe.py
429index 56d61f5..19e2bf4 100644
430--- a/lib/lp/oci/browser/tests/test_ocirecipe.py
431+++ b/lib/lp/oci/browser/tests/test_ocirecipe.py
432@@ -2571,17 +2571,18 @@ class TestOCIRecipeEditPushRulesView(
433 registry_credentials=registry_credentials,
434 image_name=image_name,
435 )
436+ push_rule_id = push_rule.id
437 browser = self.getViewBrowser(self.recipe, user=self.person)
438 browser.getLink("Edit push rules").click()
439 with person_logged_in(self.person):
440 browser.getControl(
441- name="field.delete.%d" % push_rule.id
442+ name="field.delete.%d" % push_rule_id
443 ).value = True
444 browser.getControl("Save").click()
445
446 with person_logged_in(self.person):
447 self.assertIsNone(
448- getUtility(IOCIPushRuleSet).getByID(push_rule.id)
449+ getUtility(IOCIPushRuleSet).getByID(push_rule_id)
450 )
451
452 def test_add_oci_push_rules_validations(self):
453diff --git a/lib/lp/oci/model/ocipushrule.py b/lib/lp/oci/model/ocipushrule.py
454index 483946a..2d6ca6a 100644
455--- a/lib/lp/oci/model/ocipushrule.py
456+++ b/lib/lp/oci/model/ocipushrule.py
457@@ -9,7 +9,7 @@ __all__ = [
458 "OCIPushRuleSet",
459 ]
460
461-from storm.locals import Int, Reference, Storm, Unicode
462+from storm.locals import Int, Reference, Unicode
463 from zope.interface import implementer
464
465 from lp.oci.interfaces.ocipushrule import (
466@@ -18,10 +18,11 @@ from lp.oci.interfaces.ocipushrule import (
467 OCIPushRuleAlreadyExists,
468 )
469 from lp.services.database.interfaces import IStore
470+from lp.services.database.stormbase import StormBase
471
472
473 @implementer(IOCIPushRule)
474-class OCIPushRule(Storm):
475+class OCIPushRule(StormBase):
476
477 __storm_table__ = "OCIPushRule"
478
479diff --git a/lib/lp/oci/model/ocirecipe.py b/lib/lp/oci/model/ocirecipe.py
480index ed46c81..23bf584 100644
481--- a/lib/lp/oci/model/ocirecipe.py
482+++ b/lib/lp/oci/model/ocirecipe.py
483@@ -17,7 +17,7 @@ import pytz
484 from lazr.lifecycle.event import ObjectCreatedEvent
485 from storm.databases.postgres import JSON
486 from storm.expr import SQL, And, Coalesce, Desc, Exists, Join, Not, Or, Select
487-from storm.locals import Bool, DateTime, Int, Reference, Store, Storm, Unicode
488+from storm.locals import Bool, DateTime, Int, Reference, Store, Unicode
489 from zope.component import getAdapter, getUtility
490 from zope.event import notify
491 from zope.interface import implementer
492@@ -95,6 +95,7 @@ from lp.services.database.constants import DEFAULT, UTC_NOW
493 from lp.services.database.decoratedresultset import DecoratedResultSet
494 from lp.services.database.enumcol import DBEnum
495 from lp.services.database.interfaces import IPrimaryStore, IStore
496+from lp.services.database.stormbase import StormBase
497 from lp.services.database.stormexpr import (
498 Array,
499 ArrayAgg,
500@@ -121,7 +122,7 @@ def oci_recipe_modified(recipe, event):
501
502
503 @implementer(IOCIRecipe)
504-class OCIRecipe(Storm, WebhookTargetMixin):
505+class OCIRecipe(StormBase, WebhookTargetMixin):
506
507 __storm_table__ = "OCIRecipe"
508
509@@ -866,7 +867,7 @@ class OCIRecipe(Storm, WebhookTargetMixin):
510 return push_rule
511
512
513-class OCIRecipeArch(Storm):
514+class OCIRecipeArch(StormBase):
515 """Link table to back `OCIRecipe.processors`."""
516
517 __storm_table__ = "OCIRecipeArch"
518diff --git a/lib/lp/oci/model/ociregistrycredentials.py b/lib/lp/oci/model/ociregistrycredentials.py
519index 2a6684e..c31e995 100644
520--- a/lib/lp/oci/model/ociregistrycredentials.py
521+++ b/lib/lp/oci/model/ociregistrycredentials.py
522@@ -12,7 +12,7 @@ import base64
523 import json
524
525 from storm.databases.postgres import JSON
526-from storm.locals import Int, Reference, Storm, Unicode
527+from storm.locals import Int, Reference, Unicode
528 from zope.component import getUtility
529 from zope.interface import implementer
530 from zope.schema import ValidationError
531@@ -29,6 +29,7 @@ from lp.services.config import config
532 from lp.services.crypto.interfaces import CryptoError, IEncryptedContainer
533 from lp.services.crypto.model import NaClEncryptedContainerBase
534 from lp.services.database.interfaces import IStore
535+from lp.services.database.stormbase import StormBase
536
537
538 @implementer(IEncryptedContainer)
539@@ -64,7 +65,7 @@ def url_validator(allowed_schemes):
540
541
542 @implementer(IOCIRegistryCredentials)
543-class OCIRegistryCredentials(Storm):
544+class OCIRegistryCredentials(StormBase):
545
546 __storm_table__ = "OCIRegistryCredentials"
547
548diff --git a/lib/lp/registry/browser/tests/test_distribution_views.py b/lib/lp/registry/browser/tests/test_distribution_views.py
549index d73497d..0855c49 100644
550--- a/lib/lp/registry/browser/tests/test_distribution_views.py
551+++ b/lib/lp/registry/browser/tests/test_distribution_views.py
552@@ -522,6 +522,7 @@ class TestDistroEditView(OCIConfigHelperMixin, TestCaseWithFactory):
553 credentials = self.factory.makeOCIRegistryCredentials(
554 registrant=self.distribution.owner, owner=self.distribution.owner
555 )
556+ credentials_id = credentials.id
557 self.distribution.oci_registry_credentials = credentials
558 registry_url = self.factory.getUniqueURL()
559 edit_form["field.oci_registry_credentials.url"] = registry_url
560@@ -543,7 +544,7 @@ class TestDistroEditView(OCIConfigHelperMixin, TestCaseWithFactory):
561 )
562 # This should have created new records
563 self.assertNotEqual(
564- credentials.id, self.distribution.oci_registry_credentials.id
565+ credentials_id, self.distribution.oci_registry_credentials.id
566 )
567
568 def test_oci_create_credentials_change_password(self):
569@@ -551,10 +552,11 @@ class TestDistroEditView(OCIConfigHelperMixin, TestCaseWithFactory):
570 credentials = self.factory.makeOCIRegistryCredentials(
571 registrant=self.distribution.owner, owner=self.distribution.owner
572 )
573+ url = credentials.url
574 self.distribution.oci_registry_credentials = credentials
575 transaction.commit()
576 password = self.factory.getUniqueUnicode()
577- edit_form["field.oci_registry_credentials.url"] = credentials.url
578+ edit_form["field.oci_registry_credentials.url"] = url
579 edit_form[
580 "field.oci_registry_credentials.username"
581 ] = credentials.username
582@@ -574,7 +576,7 @@ class TestDistroEditView(OCIConfigHelperMixin, TestCaseWithFactory):
583 unencrypted_credentials = distro_credentials.getCredentials()
584 self.assertEqual(password, unencrypted_credentials["password"])
585 # This should not have changed
586- self.assertEqual(distro_credentials.url, credentials.url)
587+ self.assertEqual(url, distro_credentials.url)
588
589 def test_oci_delete_credentials(self):
590 edit_form = self.getDefaultEditDict()
591diff --git a/lib/lp/registry/model/distributionsourcepackage.py b/lib/lp/registry/model/distributionsourcepackage.py
592index 76d68db..5daba67 100644
593--- a/lib/lp/registry/model/distributionsourcepackage.py
594+++ b/lib/lp/registry/model/distributionsourcepackage.py
595@@ -16,7 +16,7 @@ import six
596 import transaction
597 from breezy.lru_cache import LRUCache
598 from storm.expr import And, Cast, Desc
599-from storm.locals import SQL, Bool, Int, Not, Reference, Store, Storm, Unicode
600+from storm.locals import SQL, Bool, Int, Not, Reference, Store, Unicode
601 from zope.interface import implementer
602
603 from lp.bugs.interfaces.bugsummary import IBugSummaryDimension
604@@ -44,6 +44,7 @@ from lp.registry.model.sourcepackage import (
605 from lp.services.database.bulk import load
606 from lp.services.database.decoratedresultset import DecoratedResultSet
607 from lp.services.database.interfaces import IStore
608+from lp.services.database.stormbase import StormBase
609 from lp.services.propertycache import cachedproperty
610 from lp.soyuz.enums import ArchivePurpose, PackagePublishingStatus
611 from lp.soyuz.model.archive import Archive
612@@ -576,7 +577,7 @@ class ThreadLocalLRUCache(LRUCache, local):
613 self.clear()
614
615
616-class DistributionSourcePackageInDatabase(Storm):
617+class DistributionSourcePackageInDatabase(StormBase):
618 """Temporary class to allow access to the database."""
619
620 # XXX: allenap 2008-11-13 bug=297736: This is a temporary measure
621diff --git a/lib/lp/registry/model/distroseriesdifferencecomment.py b/lib/lp/registry/model/distroseriesdifferencecomment.py
622index d882fa0..c9c3e69 100644
623--- a/lib/lp/registry/model/distroseriesdifferencecomment.py
624+++ b/lib/lp/registry/model/distroseriesdifferencecomment.py
625@@ -9,7 +9,7 @@ __all__ = [
626
627 from email.utils import make_msgid
628
629-from storm.locals import Desc, Int, Reference, Storm
630+from storm.locals import Desc, Int, Reference
631 from zope.interface import implementer, provider
632
633 from lp.registry.interfaces.distroseriesdifferencecomment import (
634@@ -18,12 +18,13 @@ from lp.registry.interfaces.distroseriesdifferencecomment import (
635 )
636 from lp.registry.model.sourcepackagename import SourcePackageName
637 from lp.services.database.interfaces import IPrimaryStore, IStore
638+from lp.services.database.stormbase import StormBase
639 from lp.services.messages.model.message import Message, MessageChunk
640
641
642 @implementer(IDistroSeriesDifferenceComment)
643 @provider(IDistroSeriesDifferenceCommentSource)
644-class DistroSeriesDifferenceComment(Storm):
645+class DistroSeriesDifferenceComment(StormBase):
646 """See `IDistroSeriesDifferenceComment`."""
647
648 __storm_table__ = "DistroSeriesDifferenceMessage"
649diff --git a/lib/lp/registry/model/distroseriesparent.py b/lib/lp/registry/model/distroseriesparent.py
650index 94adc35..89ed55f 100644
651--- a/lib/lp/registry/model/distroseriesparent.py
652+++ b/lib/lp/registry/model/distroseriesparent.py
653@@ -8,7 +8,7 @@ __all__ = [
654 "DistroSeriesParentSet",
655 ]
656
657-from storm.locals import SQL, Bool, Int, Reference, Storm
658+from storm.locals import SQL, Bool, Int, Reference
659 from zope.interface import implementer
660
661 from lp.registry.interfaces.distroseriesparent import (
662@@ -18,10 +18,11 @@ from lp.registry.interfaces.distroseriesparent import (
663 from lp.registry.interfaces.pocket import PackagePublishingPocket
664 from lp.services.database.enumcol import DBEnum
665 from lp.services.database.interfaces import IPrimaryStore, IStore
666+from lp.services.database.stormbase import StormBase
667
668
669 @implementer(IDistroSeriesParent)
670-class DistroSeriesParent(Storm):
671+class DistroSeriesParent(StormBase):
672 """See `IDistroSeriesParent`."""
673
674 __storm_table__ = "DistroSeriesParent"
675diff --git a/lib/lp/registry/model/person.py b/lib/lp/registry/model/person.py
676index 175ccfc..6f9d7ee 100644
677--- a/lib/lp/registry/model/person.py
678+++ b/lib/lp/registry/model/person.py
679@@ -41,7 +41,6 @@ import transaction
680 from lazr.delegates import delegate_to
681 from lazr.restful.utils import get_current_browser_request, smartquote
682 from requests import PreparedRequest
683-from storm.base import Storm
684 from storm.expr import (
685 SQL,
686 Alias,
687@@ -354,7 +353,7 @@ def person_sort_key(person):
688
689
690 @implementer(IPersonSettings)
691-class PersonSettings(Storm):
692+class PersonSettings(StormBase):
693 "The relatively rarely used settings for person (not a team)."
694
695 __storm_table__ = "PersonSettings"
696diff --git a/lib/lp/scripts/tests/test_garbo.py b/lib/lp/scripts/tests/test_garbo.py
697index 1d22660..dce4882 100644
698--- a/lib/lp/scripts/tests/test_garbo.py
699+++ b/lib/lp/scripts/tests/test_garbo.py
700@@ -20,7 +20,7 @@ from psycopg2 import IntegrityError
701 from pytz import UTC
702 from storm.exceptions import LostObjectError
703 from storm.expr import SQL, In, Min, Not
704-from storm.locals import Int, Storm
705+from storm.locals import Int
706 from storm.store import Store
707 from testtools.content import text_content
708 from testtools.matchers import (
709@@ -95,6 +95,7 @@ from lp.services.database.constants import (
710 UTC_NOW,
711 )
712 from lp.services.database.interfaces import IPrimaryStore
713+from lp.services.database.stormbase import StormBase
714 from lp.services.features.model import FeatureFlag
715 from lp.services.features.testing import FeatureFixture
716 from lp.services.identity.interfaces.account import AccountStatus
717@@ -175,7 +176,7 @@ class TestGarboScript(TestCase):
718 DatabaseLayer.force_dirty_database()
719
720
721-class BulkFoo(Storm):
722+class BulkFoo(StormBase):
723 __storm_table__ = "bulkfoo"
724 id = Int(primary=True)
725
726diff --git a/lib/lp/services/apachelogparser/model/parsedapachelog.py b/lib/lp/services/apachelogparser/model/parsedapachelog.py
727index 0afc4c1..66a4b35 100644
728--- a/lib/lp/services/apachelogparser/model/parsedapachelog.py
729+++ b/lib/lp/services/apachelogparser/model/parsedapachelog.py
730@@ -4,7 +4,7 @@
731 __all__ = ["ParsedApacheLog"]
732
733 import six
734-from storm.locals import Int, Storm, Unicode
735+from storm.locals import Int, Unicode
736 from zope.interface import implementer
737
738 from lp.services.apachelogparser.interfaces.parsedapachelog import (
739@@ -13,10 +13,11 @@ from lp.services.apachelogparser.interfaces.parsedapachelog import (
740 from lp.services.database.constants import UTC_NOW
741 from lp.services.database.datetimecol import UtcDateTimeCol
742 from lp.services.database.interfaces import IStore
743+from lp.services.database.stormbase import StormBase
744
745
746 @implementer(IParsedApacheLog)
747-class ParsedApacheLog(Storm):
748+class ParsedApacheLog(StormBase):
749 """See `IParsedApacheLog`"""
750
751 __storm_table__ = "ParsedApacheLog"
752diff --git a/lib/lp/services/database/sqlbase.py b/lib/lp/services/database/sqlbase.py
753index 419b0c7..ba70a7d 100644
754--- a/lib/lp/services/database/sqlbase.py
755+++ b/lib/lp/services/database/sqlbase.py
756@@ -42,7 +42,8 @@ from psycopg2.extensions import (
757 from storm.databases.postgres import compile as postgres_compile
758 from storm.expr import State
759 from storm.expr import compile as storm_compile
760-from storm.locals import Store, Storm
761+from storm.locals import Storm # noqa: B1
762+from storm.locals import Store
763 from storm.zope.interfaces import IZStorm
764 from twisted.python.util import mergeFunctionMetadata
765 from zope.component import getUtility
766@@ -186,7 +187,7 @@ class SQLBase(storm.sqlobject.SQLObjectBase):
767 # some_person.account = an_account fail?
768 for key, argument in kwargs.items():
769 argument = removeSecurityProxy(argument)
770- if not isinstance(argument, Storm):
771+ if not isinstance(argument, Storm): # noqa: B1
772 continue
773 argument_store = Store.of(argument)
774 if argument_store is not store:
775diff --git a/lib/lp/services/database/stormbase.py b/lib/lp/services/database/stormbase.py
776index 2bd27a3..1268501 100644
777--- a/lib/lp/services/database/stormbase.py
778+++ b/lib/lp/services/database/stormbase.py
779@@ -6,14 +6,14 @@ __all__ = [
780 ]
781
782 from storm.info import get_obj_info
783-from storm.locals import Storm
784+from storm.locals import Storm # noqa: B1
785 from zope.security.proxy import removeSecurityProxy
786
787 from lp.services.database.interfaces import IStore
788 from lp.services.propertycache import clear_property_cache
789
790
791-class StormBase(Storm):
792+class StormBase(Storm): # noqa: B1
793 """A safe version of storm.base.Storm to use in launchpad.
794
795 This class adds storm cache management functions to base.Storm.
796diff --git a/lib/lp/services/features/model.py b/lib/lp/services/features/model.py
797index e7206b7..f869499 100644
798--- a/lib/lp/services/features/model.py
799+++ b/lib/lp/services/features/model.py
800@@ -11,11 +11,12 @@ from datetime import datetime
801
802 import pytz
803 import six
804-from storm.locals import DateTime, Int, Reference, Storm, Unicode
805+from storm.locals import DateTime, Int, Reference, Unicode
806 from zope.interface import implementer
807
808 from lp.services.database.datetimecol import UtcDateTimeCol
809 from lp.services.database.interfaces import IStore
810+from lp.services.database.stormbase import StormBase
811 from lp.services.features.interfaces import IFeatureRules
812
813
814@@ -28,7 +29,7 @@ class FeatureRules:
815 pass
816
817
818-class FeatureFlag(Storm):
819+class FeatureFlag(StormBase):
820 """Database setting of a particular flag in a scope"""
821
822 __storm_table__ = "FeatureFlag"
823@@ -48,7 +49,7 @@ class FeatureFlag(Storm):
824 self.value = value
825
826
827-class FeatureFlagChangelogEntry(Storm):
828+class FeatureFlagChangelogEntry(StormBase):
829 """A record of a change to the whole set of feature flags."""
830
831 __storm_table__ = "FeatureFlagChangelogEntry"
832diff --git a/lib/lp/services/messages/model/message.py b/lib/lp/services/messages/model/message.py
833index cb9e9cf..21f8bc9 100644
834--- a/lib/lp/services/messages/model/message.py
835+++ b/lib/lp/services/messages/model/message.py
836@@ -29,7 +29,6 @@ from storm.locals import (
837 Reference,
838 ReferenceSet,
839 Store,
840- Storm,
841 Unicode,
842 )
843 from zope.component import getUtility
844@@ -54,6 +53,7 @@ from lp.services.database.sqlobject import (
845 SQLRelatedJoin,
846 StringCol,
847 )
848+from lp.services.database.stormbase import StormBase
849 from lp.services.librarian.interfaces import ILibraryFileAliasSet
850 from lp.services.messages.interfaces.message import (
851 IDirectEmailAuthorization,
852@@ -648,7 +648,7 @@ class MessageChunk(SQLBase):
853
854
855 @implementer(IUserToUserEmail)
856-class UserToUserEmail(Storm):
857+class UserToUserEmail(StormBase):
858 """See `IUserToUserEmail`."""
859
860 __storm_table__ = "UserToUserEmail"
861diff --git a/lib/lp/services/openid/model/openididentifier.py b/lib/lp/services/openid/model/openididentifier.py
862index 16d0d63..18ef165 100644
863--- a/lib/lp/services/openid/model/openididentifier.py
864+++ b/lib/lp/services/openid/model/openididentifier.py
865@@ -5,13 +5,14 @@
866
867 __all__ = ["OpenIdIdentifier"]
868
869-from storm.locals import Int, Reference, Storm, Unicode
870+from storm.locals import Int, Reference, Unicode
871
872 from lp.services.database.constants import UTC_NOW
873 from lp.services.database.datetimecol import UtcDateTimeCol
874+from lp.services.database.stormbase import StormBase
875
876
877-class OpenIdIdentifier(Storm):
878+class OpenIdIdentifier(StormBase):
879 """An OpenId Identifier that can be used to log into an Account"""
880
881 __storm_table__ = "openididentifier"
882diff --git a/lib/lp/services/session/model.py b/lib/lp/services/session/model.py
883index 565e1ee..b54d290 100644
884--- a/lib/lp/services/session/model.py
885+++ b/lib/lp/services/session/model.py
886@@ -5,16 +5,17 @@
887
888 __all__ = ["SessionData", "SessionPkgData"]
889
890-from storm.locals import Pickle, Storm, Unicode
891+from storm.locals import Pickle, Unicode
892 from zope.interface import implementer, provider
893
894 from lp.services.database.datetimecol import UtcDateTimeCol
895+from lp.services.database.stormbase import StormBase
896 from lp.services.session.interfaces import IUseSessionStore
897
898
899 @implementer(IUseSessionStore)
900 @provider(IUseSessionStore)
901-class SessionData(Storm):
902+class SessionData(StormBase):
903 """A user's Session."""
904
905 __storm_table__ = "SessionData"
906@@ -25,7 +26,7 @@ class SessionData(Storm):
907
908 @implementer(IUseSessionStore)
909 @provider(IUseSessionStore)
910-class SessionPkgData(Storm):
911+class SessionPkgData(StormBase):
912 """Data storage for a Session."""
913
914 __storm_table__ = "SessionPkgData"
915diff --git a/lib/lp/services/webapp/vocabulary.py b/lib/lp/services/webapp/vocabulary.py
916index 1d965a2..7357739 100644
917--- a/lib/lp/services/webapp/vocabulary.py
918+++ b/lib/lp/services/webapp/vocabulary.py
919@@ -25,7 +25,7 @@ from collections import namedtuple
920 from typing import Optional, Union
921
922 import six
923-from storm.base import Storm
924+from storm.base import Storm # noqa: B1
925 from storm.expr import Expr
926 from storm.store import EmptyResultSet
927 from zope.interface import Attribute, Interface, implementer
928@@ -489,7 +489,7 @@ class StormVocabularyBase(FilteredVocabularyBase):
929 # Sometimes this method is called with a Storm instance, but z3 form
930 # machinery sends through integer ids. This might be due to a bug
931 # somewhere.
932- if zisinstance(obj, Storm):
933+ if zisinstance(obj, Storm): # noqa: B1
934 clauses = [self._table.id == obj.id]
935 if self._clauses:
936 # XXX kiko 2007-01-16: this code is untested.
937@@ -507,7 +507,7 @@ class StormVocabularyBase(FilteredVocabularyBase):
938 def getTerm(self, value):
939 # Short circuit. There is probably a design problem here since we
940 # sometimes get the id and sometimes a Storm instance.
941- if zisinstance(value, Storm):
942+ if zisinstance(value, Storm): # noqa: B1
943 return self.toTerm(value)
944
945 try:
946@@ -584,7 +584,7 @@ class NamedStormVocabulary(StormVocabularyBase):
947 return SimpleTerm(obj, obj.name, obj.title)
948
949 def __contains__(self, obj):
950- if zisinstance(obj, Storm):
951+ if zisinstance(obj, Storm): # noqa: B1
952 found_obj = (
953 IStore(self._table)
954 .find(
955diff --git a/lib/lp/snappy/model/snap.py b/lib/lp/snappy/model/snap.py
956index 6bbcf8f..de5e86e 100644
957--- a/lib/lp/snappy/model/snap.py
958+++ b/lib/lp/snappy/model/snap.py
959@@ -31,16 +31,7 @@ from storm.expr import (
960 Or,
961 Select,
962 )
963-from storm.locals import (
964- JSON,
965- Bool,
966- DateTime,
967- Int,
968- Reference,
969- Store,
970- Storm,
971- Unicode,
972-)
973+from storm.locals import JSON, Bool, DateTime, Int, Reference, Store, Unicode
974 from zope.component import getAdapter, getUtility
975 from zope.event import notify
976 from zope.interface import directlyProvides, implementer
977@@ -124,6 +115,7 @@ from lp.services.database.constants import DEFAULT, UTC_NOW
978 from lp.services.database.decoratedresultset import DecoratedResultSet
979 from lp.services.database.enumcol import DBEnum
980 from lp.services.database.interfaces import IPrimaryStore, IStore
981+from lp.services.database.stormbase import StormBase
982 from lp.services.database.stormexpr import (
983 Array,
984 ArrayAgg,
985@@ -288,7 +280,7 @@ class SnapBuildRequest:
986
987
988 @implementer(ISnap, IHasOwner)
989-class Snap(Storm, WebhookTargetMixin):
990+class Snap(StormBase, WebhookTargetMixin):
991 """See `ISnap`."""
992
993 __storm_table__ = "Snap"
994@@ -1481,7 +1473,7 @@ class Snap(Storm, WebhookTargetMixin):
995 ).remove()
996
997
998-class SnapArch(Storm):
999+class SnapArch(StormBase):
1000 """Link table to back `Snap.processors`."""
1001
1002 __storm_table__ = "SnapArch"
1003diff --git a/lib/lp/snappy/model/snapbase.py b/lib/lp/snappy/model/snapbase.py
1004index c8c200d..779ba4b 100644
1005--- a/lib/lp/snappy/model/snapbase.py
1006+++ b/lib/lp/snappy/model/snapbase.py
1007@@ -12,16 +12,7 @@ from typing import Dict, Optional
1008 import pytz
1009 from lazr.enum import Item
1010 from storm.databases.postgres import JSON as PgJSON
1011-from storm.locals import (
1012- JSON,
1013- Bool,
1014- DateTime,
1015- Int,
1016- Reference,
1017- Store,
1018- Storm,
1019- Unicode,
1020-)
1021+from storm.locals import JSON, Bool, DateTime, Int, Reference, Store, Unicode
1022 from zope.component import getUtility
1023 from zope.interface import implementer
1024 from zope.security.proxy import removeSecurityProxy
1025@@ -32,6 +23,7 @@ from lp.registry.interfaces.pocket import PackagePublishingPocket
1026 from lp.registry.model.person import Person
1027 from lp.services.database.constants import DEFAULT
1028 from lp.services.database.interfaces import IPrimaryStore, IStore
1029+from lp.services.database.stormbase import StormBase
1030 from lp.snappy.interfaces.snapbase import (
1031 CannotDeleteSnapBase,
1032 ISnapBase,
1033@@ -49,7 +41,7 @@ from lp.soyuz.model.archivedependency import ArchiveDependency
1034
1035
1036 @implementer(ISnapBase)
1037-class SnapBase(Storm):
1038+class SnapBase(StormBase):
1039 """See `ISnapBase`."""
1040
1041 __storm_table__ = "SnapBase"
1042@@ -222,7 +214,7 @@ class SnapBase(Storm):
1043 Store.of(self).remove(self)
1044
1045
1046-class SnapBaseArch(Storm):
1047+class SnapBaseArch(StormBase):
1048 """Link table to back `SnapArch.processors`."""
1049
1050 __storm_table__ = "SnapBaseArch"
1051diff --git a/lib/lp/snappy/model/snapbuild.py b/lib/lp/snappy/model/snapbuild.py
1052index 2ae196c..410942b 100644
1053--- a/lib/lp/snappy/model/snapbuild.py
1054+++ b/lib/lp/snappy/model/snapbuild.py
1055@@ -25,7 +25,6 @@ from storm.locals import (
1056 Reference,
1057 Select,
1058 Store,
1059- Storm,
1060 Unicode,
1061 )
1062 from storm.store import EmptyResultSet
1063@@ -57,6 +56,7 @@ from lp.services.database.constants import DEFAULT
1064 from lp.services.database.decoratedresultset import DecoratedResultSet
1065 from lp.services.database.enumcol import DBEnum
1066 from lp.services.database.interfaces import IPrimaryStore, IStore
1067+from lp.services.database.stormbase import StormBase
1068 from lp.services.job.interfaces.job import JobStatus
1069 from lp.services.job.model.job import Job
1070 from lp.services.librarian.browser import ProxiedLibraryFileAlias
1071@@ -94,7 +94,7 @@ class SnapBuildStatusChangedEvent(ObjectEvent):
1072
1073
1074 @implementer(ISnapFile)
1075-class SnapFile(Storm):
1076+class SnapFile(StormBase):
1077 """See `ISnap`."""
1078
1079 __storm_table__ = "SnapFile"
1080@@ -115,7 +115,7 @@ class SnapFile(Storm):
1081
1082
1083 @implementer(ISnapBuild)
1084-class SnapBuild(PackageBuildMixin, Storm):
1085+class SnapBuild(PackageBuildMixin, StormBase):
1086 """See `ISnapBuild`."""
1087
1088 __storm_table__ = "SnapBuild"
1089diff --git a/lib/lp/snappy/model/snappyseries.py b/lib/lp/snappy/model/snappyseries.py
1090index fec61f1..5a74579 100644
1091--- a/lib/lp/snappy/model/snappyseries.py
1092+++ b/lib/lp/snappy/model/snappyseries.py
1093@@ -10,16 +10,7 @@ __all__ = [
1094 ]
1095
1096 import pytz
1097-from storm.locals import (
1098- Bool,
1099- DateTime,
1100- Desc,
1101- Int,
1102- Reference,
1103- Store,
1104- Storm,
1105- Unicode,
1106-)
1107+from storm.locals import Bool, DateTime, Desc, Int, Reference, Store, Unicode
1108 from zope.interface import implementer
1109
1110 from lp.registry.interfaces.series import SeriesStatus
1111@@ -27,6 +18,7 @@ from lp.registry.model.distroseries import DistroSeries
1112 from lp.services.database.constants import DEFAULT
1113 from lp.services.database.enumcol import DBEnum
1114 from lp.services.database.interfaces import IPrimaryStore, IStore
1115+from lp.services.database.stormbase import StormBase
1116 from lp.services.propertycache import cachedproperty, get_property_cache
1117 from lp.snappy.interfaces.snappyseries import (
1118 ISnappyDistroSeries,
1119@@ -38,7 +30,7 @@ from lp.snappy.interfaces.snappyseries import (
1120
1121
1122 @implementer(ISnappySeries)
1123-class SnappySeries(Storm):
1124+class SnappySeries(StormBase):
1125 """See `ISnappySeries`."""
1126
1127 __storm_table__ = "SnappySeries"
1128@@ -220,7 +212,7 @@ class SnappyDistroSeriesMixin:
1129
1130
1131 @implementer(ISnappyDistroSeries)
1132-class SnappyDistroSeries(Storm, SnappyDistroSeriesMixin):
1133+class SnappyDistroSeries(StormBase, SnappyDistroSeriesMixin):
1134 """Link table between `SnappySeries` and `DistroSeries`."""
1135
1136 __storm_table__ = "SnappyDistroSeries"
1137diff --git a/lib/lp/soyuz/model/archive.py b/lib/lp/soyuz/model/archive.py
1138index b74321f..3eb9387 100644
1139--- a/lib/lp/soyuz/model/archive.py
1140+++ b/lib/lp/soyuz/model/archive.py
1141@@ -18,7 +18,6 @@ from pathlib import PurePath
1142
1143 import six
1144 from lazr.lifecycle.event import ObjectCreatedEvent
1145-from storm.base import Storm
1146 from storm.expr import (
1147 And,
1148 Cast,
1149@@ -91,6 +90,7 @@ from lp.services.database.sqlobject import (
1150 IntCol,
1151 StringCol,
1152 )
1153+from lp.services.database.stormbase import StormBase
1154 from lp.services.database.stormexpr import BulkUpdate
1155 from lp.services.features import getFeatureFlag
1156 from lp.services.gpg.interfaces import IGPGHandler
1157@@ -3795,7 +3795,7 @@ class ArchiveSet:
1158 return []
1159
1160
1161-class ArchiveArch(Storm):
1162+class ArchiveArch(StormBase):
1163 """Link table to back Archive.processors."""
1164
1165 __storm_table__ = "ArchiveArch"
1166diff --git a/lib/lp/soyuz/model/archiveauthtoken.py b/lib/lp/soyuz/model/archiveauthtoken.py
1167index e9726a3..6f20ce5 100644
1168--- a/lib/lp/soyuz/model/archiveauthtoken.py
1169+++ b/lib/lp/soyuz/model/archiveauthtoken.py
1170@@ -10,22 +10,14 @@ __all__ = [
1171 import pytz
1172 from lazr.uri import URI
1173 from storm.expr import LeftJoin
1174-from storm.locals import (
1175- And,
1176- DateTime,
1177- Int,
1178- Join,
1179- Or,
1180- Reference,
1181- Storm,
1182- Unicode,
1183-)
1184+from storm.locals import And, DateTime, Int, Join, Or, Reference, Unicode
1185 from storm.store import Store
1186 from zope.interface import implementer
1187
1188 from lp.registry.model.teammembership import TeamParticipation
1189 from lp.services.database.constants import UTC_NOW
1190 from lp.services.database.interfaces import IStore
1191+from lp.services.database.stormbase import StormBase
1192 from lp.services.identity.interfaces.account import AccountStatus
1193 from lp.services.identity.model.account import Account
1194 from lp.soyuz.enums import ArchiveSubscriberStatus
1195@@ -36,7 +28,7 @@ from lp.soyuz.interfaces.archiveauthtoken import (
1196
1197
1198 @implementer(IArchiveAuthToken)
1199-class ArchiveAuthToken(Storm):
1200+class ArchiveAuthToken(StormBase):
1201 """See `IArchiveAuthToken`."""
1202
1203 __storm_table__ = "ArchiveAuthToken"
1204diff --git a/lib/lp/soyuz/model/archivefile.py b/lib/lp/soyuz/model/archivefile.py
1205index 43e27b9..b7170dc 100644
1206--- a/lib/lp/soyuz/model/archivefile.py
1207+++ b/lib/lp/soyuz/model/archivefile.py
1208@@ -12,7 +12,7 @@ import os.path
1209 import re
1210
1211 import pytz
1212-from storm.locals import And, DateTime, Int, Reference, Storm, Unicode
1213+from storm.locals import And, DateTime, Int, Reference, Unicode
1214 from zope.component import getUtility
1215 from zope.interface import implementer
1216
1217@@ -21,6 +21,7 @@ from lp.services.database.constants import UTC_NOW
1218 from lp.services.database.decoratedresultset import DecoratedResultSet
1219 from lp.services.database.interfaces import IPrimaryStore, IStore
1220 from lp.services.database.sqlbase import convert_storm_clause_to_string
1221+from lp.services.database.stormbase import StormBase
1222 from lp.services.database.stormexpr import RegexpMatch
1223 from lp.services.librarian.interfaces import ILibraryFileAliasSet
1224 from lp.services.librarian.model import LibraryFileAlias, LibraryFileContent
1225@@ -37,7 +38,7 @@ def _now():
1226
1227
1228 @implementer(IArchiveFile)
1229-class ArchiveFile(Storm):
1230+class ArchiveFile(StormBase):
1231 """See `IArchiveFile`."""
1232
1233 __storm_table__ = "ArchiveFile"
1234diff --git a/lib/lp/soyuz/model/archivesubscriber.py b/lib/lp/soyuz/model/archivesubscriber.py
1235index b733c52..95ee026 100644
1236--- a/lib/lp/soyuz/model/archivesubscriber.py
1237+++ b/lib/lp/soyuz/model/archivesubscriber.py
1238@@ -11,7 +11,7 @@ from operator import itemgetter
1239
1240 import pytz
1241 from storm.expr import And, Desc, Join, LeftJoin
1242-from storm.locals import DateTime, Int, Reference, Store, Storm, Unicode
1243+from storm.locals import DateTime, Int, Reference, Store, Unicode
1244 from storm.store import EmptyResultSet
1245 from zope.component import getUtility
1246 from zope.interface import implementer
1247@@ -24,6 +24,7 @@ from lp.services.database.bulk import load_related
1248 from lp.services.database.constants import UTC_NOW
1249 from lp.services.database.decoratedresultset import DecoratedResultSet
1250 from lp.services.database.enumcol import DBEnum
1251+from lp.services.database.stormbase import StormBase
1252 from lp.services.identity.interfaces.emailaddress import EmailAddressStatus
1253 from lp.services.identity.model.emailaddress import EmailAddress
1254 from lp.services.webapp.authorization import precache_permission_for_objects
1255@@ -38,7 +39,7 @@ from lp.soyuz.model.archiveauthtoken import ArchiveAuthToken
1256
1257
1258 @implementer(IArchiveSubscriber)
1259-class ArchiveSubscriber(Storm):
1260+class ArchiveSubscriber(StormBase):
1261 """See `IArchiveSubscriber`."""
1262
1263 __storm_table__ = "ArchiveSubscriber"
1264diff --git a/lib/lp/soyuz/model/binarypackagerelease.py b/lib/lp/soyuz/model/binarypackagerelease.py
1265index 41ac6b5..0d97f44 100644
1266--- a/lib/lp/soyuz/model/binarypackagerelease.py
1267+++ b/lib/lp/soyuz/model/binarypackagerelease.py
1268@@ -11,7 +11,7 @@ import re
1269 from operator import attrgetter
1270 from typing import Any
1271
1272-from storm.locals import Date, Int, Reference, Store, Storm
1273+from storm.locals import Date, Int, Reference, Store
1274 from zope.component import getUtility
1275 from zope.interface import implementer
1276
1277@@ -27,6 +27,7 @@ from lp.services.database.sqlobject import (
1278 IntCol,
1279 StringCol,
1280 )
1281+from lp.services.database.stormbase import StormBase
1282 from lp.services.propertycache import cachedproperty, get_property_cache
1283 from lp.soyuz.enums import (
1284 BinaryPackageFileType,
1285@@ -265,7 +266,7 @@ class BinaryPackageRelease(SQLBase):
1286
1287
1288 @implementer(IBinaryPackageReleaseDownloadCount)
1289-class BinaryPackageReleaseDownloadCount(Storm):
1290+class BinaryPackageReleaseDownloadCount(StormBase):
1291 """See `IBinaryPackageReleaseDownloadCount`."""
1292
1293 __storm_table__ = "BinaryPackageReleaseDownloadCount"
1294diff --git a/lib/lp/soyuz/model/distroarchseriesfilter.py b/lib/lp/soyuz/model/distroarchseriesfilter.py
1295index ac48343..c866917 100644
1296--- a/lib/lp/soyuz/model/distroarchseriesfilter.py
1297+++ b/lib/lp/soyuz/model/distroarchseriesfilter.py
1298@@ -8,13 +8,14 @@ __all__ = [
1299 ]
1300
1301 import pytz
1302-from storm.locals import DateTime, Int, Reference, Storm
1303+from storm.locals import DateTime, Int, Reference
1304 from zope.interface import implementer
1305 from zope.security.proxy import removeSecurityProxy
1306
1307 from lp.services.database.constants import DEFAULT, UTC_NOW
1308 from lp.services.database.enumcol import DBEnum
1309 from lp.services.database.interfaces import IPrimaryStore, IStore
1310+from lp.services.database.stormbase import StormBase
1311 from lp.soyuz.enums import DistroArchSeriesFilterSense
1312 from lp.soyuz.interfaces.distroarchseriesfilter import (
1313 IDistroArchSeriesFilter,
1314@@ -32,7 +33,7 @@ def distro_arch_series_filter_modified(pss, event):
1315
1316
1317 @implementer(IDistroArchSeriesFilter)
1318-class DistroArchSeriesFilter(Storm):
1319+class DistroArchSeriesFilter(StormBase):
1320 """See `IDistroArchSeriesFilter`."""
1321
1322 __storm_table__ = "DistroArchSeriesFilter"
1323diff --git a/lib/lp/soyuz/model/livefs.py b/lib/lp/soyuz/model/livefs.py
1324index 1f19e00..f7b650b 100644
1325--- a/lib/lp/soyuz/model/livefs.py
1326+++ b/lib/lp/soyuz/model/livefs.py
1327@@ -22,7 +22,6 @@ from storm.locals import (
1328 Not,
1329 Reference,
1330 Store,
1331- Storm,
1332 TimeDelta,
1333 Unicode,
1334 )
1335@@ -43,6 +42,7 @@ from lp.registry.interfaces.role import IHasOwner
1336 from lp.registry.model.person import Person, get_person_visibility_terms
1337 from lp.services.database.constants import DEFAULT, UTC_NOW
1338 from lp.services.database.interfaces import IPrimaryStore, IStore
1339+from lp.services.database.stormbase import StormBase
1340 from lp.services.database.stormexpr import Greatest, IsDistinctFrom, NullsLast
1341 from lp.services.features import getFeatureFlag
1342 from lp.services.webapp.interfaces import ILaunchBag
1343@@ -76,7 +76,7 @@ def livefs_modified(livefs, event):
1344
1345
1346 @implementer(ILiveFS, IHasOwner)
1347-class LiveFS(Storm, WebhookTargetMixin):
1348+class LiveFS(StormBase, WebhookTargetMixin):
1349 """See `ILiveFS`."""
1350
1351 __storm_table__ = "LiveFS"
1352diff --git a/lib/lp/soyuz/model/livefsbuild.py b/lib/lp/soyuz/model/livefsbuild.py
1353index 32d9193..23112f0 100644
1354--- a/lib/lp/soyuz/model/livefsbuild.py
1355+++ b/lib/lp/soyuz/model/livefsbuild.py
1356@@ -20,7 +20,6 @@ from storm.locals import (
1357 Reference,
1358 Select,
1359 Store,
1360- Storm,
1361 Unicode,
1362 )
1363 from storm.store import EmptyResultSet
1364@@ -42,6 +41,7 @@ from lp.services.database.constants import DEFAULT
1365 from lp.services.database.decoratedresultset import DecoratedResultSet
1366 from lp.services.database.enumcol import DBEnum
1367 from lp.services.database.interfaces import IPrimaryStore, IStore
1368+from lp.services.database.stormbase import StormBase
1369 from lp.services.features import getFeatureFlag
1370 from lp.services.librarian.browser import ProxiedLibraryFileAlias
1371 from lp.services.librarian.model import LibraryFileAlias, LibraryFileContent
1372@@ -69,7 +69,7 @@ from lp.soyuz.model.archivedependency import ArchiveDependency
1373
1374
1375 @implementer(ILiveFSFile)
1376-class LiveFSFile(Storm):
1377+class LiveFSFile(StormBase):
1378 """See `ILiveFS`."""
1379
1380 __storm_table__ = "LiveFSFile"
1381@@ -90,7 +90,7 @@ class LiveFSFile(Storm):
1382
1383
1384 @implementer(ILiveFSBuild)
1385-class LiveFSBuild(PackageBuildMixin, Storm):
1386+class LiveFSBuild(PackageBuildMixin, StormBase):
1387 """See `ILiveFSBuild`."""
1388
1389 __storm_table__ = "LiveFSBuild"
1390diff --git a/lib/lp/soyuz/model/packagecopyrequest.py b/lib/lp/soyuz/model/packagecopyrequest.py
1391index da1706b..bc8b815 100644
1392--- a/lib/lp/soyuz/model/packagecopyrequest.py
1393+++ b/lib/lp/soyuz/model/packagecopyrequest.py
1394@@ -5,13 +5,14 @@ __all__ = ["PackageCopyRequest", "PackageCopyRequestSet"]
1395
1396 import itertools
1397
1398-from storm.locals import Bool, DateTime, Enum, Int, Reference, Storm, Unicode
1399+from storm.locals import Bool, DateTime, Enum, Int, Reference, Unicode
1400 from zope.interface import implementer
1401
1402 from lp.registry.interfaces.person import validate_public_person
1403 from lp.registry.interfaces.pocket import PackagePublishingPocket
1404 from lp.services.database.constants import UTC_NOW
1405 from lp.services.database.interfaces import IStore
1406+from lp.services.database.stormbase import StormBase
1407 from lp.soyuz.enums import PackageCopyStatus
1408 from lp.soyuz.interfaces.packagecopyrequest import (
1409 IPackageCopyRequest,
1410@@ -25,7 +26,7 @@ def _construct_enum_mapping(db_item_cls):
1411
1412
1413 @implementer(IPackageCopyRequest)
1414-class PackageCopyRequest(Storm):
1415+class PackageCopyRequest(StormBase):
1416 """See `IPackageCopyRequest`."""
1417
1418 __storm_table__ = "PackageCopyRequest"
1419diff --git a/lib/lp/soyuz/model/packageset.py b/lib/lp/soyuz/model/packageset.py
1420index 7b4ee88..6091f74 100644
1421--- a/lib/lp/soyuz/model/packageset.py
1422+++ b/lib/lp/soyuz/model/packageset.py
1423@@ -6,7 +6,7 @@ __all__ = ["Packageset", "PackagesetSet"]
1424 import pytz
1425 import six
1426 from storm.expr import SQL
1427-from storm.locals import DateTime, Int, Reference, Storm, Unicode
1428+from storm.locals import DateTime, Int, Reference, Unicode
1429 from zope.component import getUtility
1430 from zope.interface import implementer
1431
1432@@ -16,6 +16,7 @@ from lp.registry.interfaces.sourcepackagename import (
1433 )
1434 from lp.registry.model.sourcepackagename import SourcePackageName
1435 from lp.services.database.interfaces import IPrimaryStore, IStore
1436+from lp.services.database.stormbase import StormBase
1437 from lp.soyuz.interfaces.packageset import (
1438 DuplicatePackagesetName,
1439 IPackageset,
1440@@ -32,7 +33,7 @@ def _order_result_set(result_set):
1441
1442
1443 @implementer(IPackageset)
1444-class Packageset(Storm):
1445+class Packageset(StormBase):
1446 """See `IPackageset`."""
1447
1448 __storm_table__ = "Packageset"
1449diff --git a/lib/lp/soyuz/model/packagesetgroup.py b/lib/lp/soyuz/model/packagesetgroup.py
1450index 04a4f10..aac5867 100644
1451--- a/lib/lp/soyuz/model/packagesetgroup.py
1452+++ b/lib/lp/soyuz/model/packagesetgroup.py
1453@@ -6,14 +6,15 @@ __all__ = [
1454 ]
1455
1456 import pytz
1457-from storm.locals import DateTime, Int, Reference, Storm
1458+from storm.locals import DateTime, Int, Reference
1459 from zope.interface import implementer
1460
1461+from lp.services.database.stormbase import StormBase
1462 from lp.soyuz.interfaces.packagesetgroup import IPackagesetGroup
1463
1464
1465 @implementer(IPackagesetGroup)
1466-class PackagesetGroup(Storm):
1467+class PackagesetGroup(StormBase):
1468 """See `IPackageset`."""
1469
1470 __storm_table__ = "PackagesetGroup"
1471diff --git a/lib/lp/soyuz/model/packagesetsources.py b/lib/lp/soyuz/model/packagesetsources.py
1472index 94a7bd2..11ba685 100644
1473--- a/lib/lp/soyuz/model/packagesetsources.py
1474+++ b/lib/lp/soyuz/model/packagesetsources.py
1475@@ -10,10 +10,12 @@ __all__ = [
1476 "PackagesetSources",
1477 ]
1478
1479-from storm.locals import Int, Reference, Storm
1480+from storm.locals import Int, Reference
1481
1482+from lp.services.database.stormbase import StormBase
1483
1484-class PackagesetSources(Storm):
1485+
1486+class PackagesetSources(StormBase):
1487 """Linking table: which packages are in a package set?"""
1488
1489 # This table is largely managed from Packageset, but also directly
1490diff --git a/lib/lp/soyuz/model/reporting.py b/lib/lp/soyuz/model/reporting.py
1491index 126217c..1054da8 100644
1492--- a/lib/lp/soyuz/model/reporting.py
1493+++ b/lib/lp/soyuz/model/reporting.py
1494@@ -6,12 +6,12 @@ __all__ = [
1495 ]
1496
1497 from lazr.delegates import delegate_to
1498-from storm.base import Storm
1499 from storm.locals import Int, Reference
1500 from storm.properties import DateTime
1501 from zope.interface import implementer
1502
1503 from lp.services.database.enumcol import DBEnum
1504+from lp.services.database.stormbase import StormBase
1505 from lp.soyuz.enums import ArchivePurpose
1506 from lp.soyuz.interfaces.reporting import (
1507 ILatestPersonSourcePackageReleaseCache,
1508@@ -21,7 +21,7 @@ from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease
1509
1510 @implementer(ILatestPersonSourcePackageReleaseCache)
1511 @delegate_to(ISourcePackageRelease, context="sourcepackagerelease")
1512-class LatestPersonSourcePackageReleaseCache(Storm):
1513+class LatestPersonSourcePackageReleaseCache(StormBase):
1514 """See `LatestPersonSourcePackageReleaseCache`."""
1515
1516 __storm_table__ = "LatestPersonSourcePackageReleaseCache"
1517diff --git a/lib/lp/soyuz/model/sourcepackageformat.py b/lib/lp/soyuz/model/sourcepackageformat.py
1518index 49dd49a..cae5565 100644
1519--- a/lib/lp/soyuz/model/sourcepackageformat.py
1520+++ b/lib/lp/soyuz/model/sourcepackageformat.py
1521@@ -6,11 +6,12 @@ __all__ = [
1522 "SourcePackageFormatSelectionSet",
1523 ]
1524
1525-from storm.locals import Int, Reference, Storm
1526+from storm.locals import Int, Reference
1527 from zope.interface import implementer
1528
1529 from lp.services.database.enumcol import DBEnum
1530 from lp.services.database.interfaces import IPrimaryStore, IStore
1531+from lp.services.database.stormbase import StormBase
1532 from lp.soyuz.enums import SourcePackageFormat
1533 from lp.soyuz.interfaces.sourcepackageformat import (
1534 ISourcePackageFormatSelection,
1535@@ -19,7 +20,7 @@ from lp.soyuz.interfaces.sourcepackageformat import (
1536
1537
1538 @implementer(ISourcePackageFormatSelection)
1539-class SourcePackageFormatSelection(Storm):
1540+class SourcePackageFormatSelection(StormBase):
1541 """See ISourcePackageFormatSelection."""
1542
1543 __storm_table__ = "sourcepackageformatselection"
1544diff --git a/lib/lp/translations/model/translationtemplatesbuild.py b/lib/lp/translations/model/translationtemplatesbuild.py
1545index 950583f..32c6a6f 100644
1546--- a/lib/lp/translations/model/translationtemplatesbuild.py
1547+++ b/lib/lp/translations/model/translationtemplatesbuild.py
1548@@ -12,7 +12,7 @@ import logging
1549 from datetime import timedelta
1550
1551 import pytz
1552-from storm.locals import Bool, DateTime, Int, Reference, Storm
1553+from storm.locals import Bool, DateTime, Int, Reference
1554 from zope.component import getUtility
1555 from zope.interface import implementer, provider
1556 from zope.security.proxy import removeSecurityProxy
1557@@ -32,6 +32,7 @@ from lp.services.database.bulk import load_related
1558 from lp.services.database.decoratedresultset import DecoratedResultSet
1559 from lp.services.database.enumcol import DBEnum
1560 from lp.services.database.interfaces import IStore
1561+from lp.services.database.stormbase import StormBase
1562 from lp.translations.interfaces.translationtemplatesbuild import (
1563 ITranslationTemplatesBuild,
1564 ITranslationTemplatesBuildSource,
1565@@ -44,7 +45,7 @@ HARDCODED_TRANSLATIONTEMPLATESBUILD_SCORE = 2515
1566 @implementer(ITranslationTemplatesBuild)
1567 @provider(ITranslationTemplatesBuildSource)
1568 class TranslationTemplatesBuild(
1569- SpecificBuildFarmJobSourceMixin, BuildFarmJobMixin, Storm
1570+ SpecificBuildFarmJobSourceMixin, BuildFarmJobMixin, StormBase
1571 ):
1572 """A `BuildFarmJob` extension for translation templates builds."""
1573
1574diff --git a/setup.cfg b/setup.cfg
1575index f93f218..0172a8a 100644
1576--- a/setup.cfg
1577+++ b/setup.cfg
1578@@ -211,6 +211,11 @@ ignore =
1579 # operators, at least for now.
1580 W503,
1581 W504
1582+enable-extensions = B1
1583+warn-symbols =
1584+ # It's OK to override these warnings in the case of isinstance checks.
1585+ storm.base.Storm = Inherit from lp.services.database.stormbase.StormBase instead.
1586+ storm.locals.Storm = Inherit from lp.services.database.stormbase.StormBase instead.
1587
1588 [isort]
1589 # database/* have some implicit relative imports.

Subscribers

People subscribed via source and target branches

to status/vote changes: