Merge lp:~abentley/launchpad/blueprint-info-type-code into lp:launchpad

Proposed by Aaron Bentley
Status: Superseded
Proposed branch: lp:~abentley/launchpad/blueprint-info-type-code
Merge into: lp:launchpad
Prerequisite: lp:~abentley/launchpad/blueprint-info-type-idx
Diff against target: 156 lines (+59/-1)
5 files modified
database/schema/security.cfg (+1/-0)
lib/lp/blueprints/interfaces/specification.py (+8/-0)
lib/lp/blueprints/model/specification.py (+4/-0)
lib/lp/scripts/garbo.py (+33/-1)
lib/lp/scripts/tests/test_garbo.py (+13/-0)
To merge this branch: bzr merge lp:~abentley/launchpad/blueprint-info-type-code
Reviewer Review Type Date Requested Status
Stuart Bishop (community) Approve
Canonical Launchpad Engineering Pending
Robert Collins db Pending
Review via email: mp+117981@code.launchpad.net

Commit message

Add model code and garbo job for Specification.information_type

Description of the change

= Summary =
Add model code and garbo job for Specification.information_type
Previous: https://code.launchpad.net/~abentley/launchpad/blueprint-info-type-idx/+merge/117980
Next: https://code.launchpad.net/~abentley/launchpad/blueprint-info-type-remove-garbo/+merge/117983

== Pre-implementation notes ==
Advised by lifeless and wgrant

== LOC Rationale ==
Part of Private projects

== Implementation details ==
Since we can't set the information_type to PUBLIC when creating the column, we must do it afterward.
The model code comes in handy for doing this.

== Tests ==
bin/test -t test_SpecificationInformationTypeDefault

== Demo and Q/A ==
None

= Launchpad lint =

Checking for conflicts and issues in changed files.

Linting changed files:
  database/schema/patch-2209-28-1.sql
  database/schema/comments.sql
  database/schema/security.cfg
  lib/lp/scripts/garbo.py
  lib/lp/blueprints/model/specification.py
  lib/lp/scripts/tests/test_garbo.py
  database/schema/patch-2209-28-2.sql
  lib/lp/blueprints/interfaces/specification.py

To post a comment you must log in.
Revision history for this message
Stuart Bishop (stub) wrote :

Not a db patch

review: Abstain (db)
Revision history for this message
Stuart Bishop (stub) wrote :

This all looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'database/schema/security.cfg'
2--- database/schema/security.cfg 2012-08-01 05:29:38 +0000
3+++ database/schema/security.cfg 2012-08-02 20:03:21 +0000
4@@ -2257,6 +2257,7 @@
5 public.sourcepackagename = SELECT
6 public.sourcepackagerelease = SELECT
7 public.sourcepackagepublishinghistory = SELECT, UPDATE
8+public.specification = SELECT, UPDATE
9 public.suggestivepotemplate = INSERT, DELETE
10 public.teamparticipation = SELECT, DELETE
11 public.translationmessage = SELECT, DELETE
12
13=== modified file 'lib/lp/blueprints/interfaces/specification.py'
14--- lib/lp/blueprints/interfaces/specification.py 2012-05-17 07:46:56 +0000
15+++ lib/lp/blueprints/interfaces/specification.py 2012-08-02 20:03:21 +0000
16@@ -70,6 +70,7 @@
17 from lp.blueprints.interfaces.sprint import ISprint
18 from lp.bugs.interfaces.buglink import IBugLinkTarget
19 from lp.code.interfaces.branchlink import IHasLinkedBranches
20+from lp.registry.enums import InformationType
21 from lp.registry.interfaces.milestone import IMilestone
22 from lp.registry.interfaces.person import IPerson
23 from lp.registry.interfaces.projectgroup import IProjectGroup
24@@ -152,6 +153,13 @@
25
26 id = Int(title=_("Database ID"), required=True, readonly=True)
27
28+ information_type = exported(
29+ Choice(
30+ title=_('Information Type'), vocabulary=InformationType,
31+ required=True, readonly=True, default=InformationType.PUBLIC,
32+ description=_(
33+ 'The type of information contained in this specification.')))
34+
35 name = exported(
36 SpecNameField(
37 title=_('Name'), required=True, readonly=False,
38
39=== modified file 'lib/lp/blueprints/model/specification.py'
40--- lib/lp/blueprints/model/specification.py 2012-06-18 11:19:46 +0000
41+++ lib/lp/blueprints/model/specification.py 2012-08-02 20:03:21 +0000
42@@ -70,6 +70,7 @@
43 from lp.bugs.model.buglinktarget import BugLinkTargetMixin
44 from lp.registry.interfaces.distribution import IDistribution
45 from lp.registry.interfaces.distroseries import IDistroSeries
46+from lp.registry.enums import InformationType
47 from lp.registry.interfaces.person import validate_public_person
48 from lp.registry.interfaces.product import IProduct
49 from lp.registry.interfaces.productseries import IProductSeries
50@@ -123,6 +124,9 @@
51 _defaultOrder = ['-priority', 'definition_status', 'name', 'id']
52
53 # db field names
54+
55+ information_type = EnumCol(
56+ enum=InformationType, default=InformationType.PUBLIC)
57 name = StringCol(unique=True, notNull=True)
58 title = StringCol(notNull=True)
59 summary = StringCol(notNull=True)
60
61=== modified file 'lib/lp/scripts/garbo.py'
62--- lib/lp/scripts/garbo.py 2012-07-23 11:25:26 +0000
63+++ lib/lp/scripts/garbo.py 2012-08-02 20:03:21 +0000
64@@ -26,7 +26,11 @@
65 import iso8601
66 from psycopg2 import IntegrityError
67 import pytz
68-from storm.expr import In
69+from storm.expr import (
70+ In,
71+ Select,
72+ Update,
73+ )
74 from storm.locals import (
75 Max,
76 Min,
77@@ -38,6 +42,7 @@
78 from zope.security.proxy import removeSecurityProxy
79
80 from lp.answers.model.answercontact import AnswerContact
81+from lp.blueprints.model.specification import Specification
82 from lp.bugs.interfaces.bug import IBugSet
83 from lp.bugs.model.bug import Bug
84 from lp.bugs.model.bugattachment import BugAttachment
85@@ -927,6 +932,32 @@
86 self.done = True
87
88
89+class SpecificationInformationTypeDefault(TunableLoop):
90+ """Set all Specification.information_type to Public (default)."""
91+ maximum_chunk_size = 1000
92+
93+ def __init__(self, log, abort_time=None):
94+ super(SpecificationInformationTypeDefault, self).__init__(log,
95+ abort_time)
96+ self.rows_updated = None
97+ self.store = IMasterStore(Specification)
98+
99+ def isDone(self):
100+ """See `TunableLoop`."""
101+ return self.rows_updated == 0
102+
103+ def __call__(self, chunk_size):
104+ """See `TunableLoop`."""
105+ subselect = Select(
106+ Specification.id, Specification.information_type == None,
107+ limit=chunk_size)
108+ result = self.store.execute(
109+ Update({Specification.information_type: 1},
110+ Specification.id.is_in(subselect)))
111+ transaction.commit()
112+ self.rows_updated = result.rowcount
113+
114+
115 class UnusedPOTMsgSetPruner(TunableLoop):
116 """Cleans up unused POTMsgSets."""
117
118@@ -1273,6 +1304,7 @@
119 OldTimeLimitedTokenDeleter,
120 RevisionAuthorEmailLinker,
121 ScrubPOFileTranslator,
122+ SpecificationInformationTypeDefault,
123 SuggestiveTemplatesCacheUpdater,
124 POTranslationPruner,
125 UnusedPOTMsgSetPruner,
126
127=== modified file 'lib/lp/scripts/tests/test_garbo.py'
128--- lib/lp/scripts/tests/test_garbo.py 2012-07-23 11:25:26 +0000
129+++ lib/lp/scripts/tests/test_garbo.py 2012-08-02 20:03:21 +0000
130@@ -35,6 +35,7 @@
131 from zope.security.proxy import removeSecurityProxy
132
133 from lp.answers.model.answercontact import AnswerContact
134+from lp.blueprints.model.specification import Specification
135 from lp.bugs.model.bugnotification import (
136 BugNotification,
137 BugNotificationRecipient,
138@@ -620,6 +621,18 @@
139 "SELECT COUNT(*) FROM %s" % table_name).get_one()[0]
140 self.failUnless(num_unexpired > 0)
141
142+ def test_SpecificationInformationTypeDefault(self):
143+ switch_dbuser('testadmin')
144+ spec = self.factory.makeSpecification()
145+ removeSecurityProxy(spec).information_type = None
146+ store = Store.of(spec)
147+ store.flush()
148+ self.assertEqual(1, store.find(Specification,
149+ Specification.information_type == None).count())
150+ self.runDaily()
151+ self.assertEqual(0, store.find(Specification,
152+ Specification.information_type == None).count())
153+
154 def test_RevisionAuthorEmailLinker(self):
155 switch_dbuser('testadmin')
156 rev1 = self.factory.makeRevision('Author 1 <author-1@Example.Org>')