Merge lp:~julian-edwards/launchpad/publisher-config-ppa-schema-bug-734807 into lp:launchpad/db-devel

Proposed by Julian Edwards
Status: Work in progress
Proposed branch: lp:~julian-edwards/launchpad/publisher-config-ppa-schema-bug-734807
Merge into: lp:launchpad/db-devel
Diff against target: 267 lines (+125/-6)
7 files modified
database/schema/patch-2208-99-0.sql (+13/-0)
lib/lp/archivepublisher/interfaces/publisherconfig.py (+22/-0)
lib/lp/archivepublisher/model/publisherconfig.py (+21/-1)
lib/lp/archivepublisher/tests/test_publisherconfig.py (+15/-0)
lib/lp/registry/browser/distribution.py (+13/-2)
lib/lp/registry/browser/tests/test_distribution_views.py (+33/-1)
lib/lp/testing/factory.py (+8/-2)
To merge this branch: bzr merge lp:~julian-edwards/launchpad/publisher-config-ppa-schema-bug-734807
Reviewer Review Type Date Requested Status
j.c.sackett (community) Approve
Stuart Bishop db Pending
Review via email: mp+53802@code.launchpad.net

Description of the change

= Summary =
Add PPA publisher config fields to PublisherConfig.

== Proposed fix ==
A fairly mechanical branch to add PPA-related config fields to the
PublisherConfig table and the edit form.

== Tests ==
bin/test -cvvt test_distribution_views -t test_publisherconfig

== Demo and Q/A ==
See http://launchpad.dev/ubuntu/+pubconf

To post a comment you must log in.
Revision history for this message
j.c.sackett (jcsackett) wrote :

As we discussed on IRC, there should probably be a way that you can get an instance out of the factory without the new fields set. Besides that, this looks good.

review: Approve
10312. By Julian Edwards

Remove factory code that makes it impossible to set optional fields to None.

Revision history for this message
Julian Edwards (julian-edwards) wrote :

I am putting this on hold until I work out some other issues to do with non-Ubuntu PPAs.

Unmerged revisions

10312. By Julian Edwards

Remove factory code that makes it impossible to set optional fields to None.

10311. By Julian Edwards

Put the extra fields on the form and make the tests pass

10310. By Julian Edwards

failing tests for the form

10309. By Julian Edwards

Update tests

10308. By Julian Edwards

model, interface and factory changes

10307. By Julian Edwards

add schema patch

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'database/schema/patch-2208-99-0.sql'
2--- database/schema/patch-2208-99-0.sql 1970-01-01 00:00:00 +0000
3+++ database/schema/patch-2208-99-0.sql 2011-03-17 14:37:44 +0000
4@@ -0,0 +1,13 @@
5+-- Copyright 2011 Canonical Ltd. This software is licensed under the
6+-- GNU Affero General Public License version 3 (see the file LICENSE).
7+
8+SET client_min_messages=ERROR;
9+
10+ALTER TABLE PublisherConfig
11+ ADD COLUMN ppa_root_dir text,
12+ ADD COLUMN ppa_private_root_dir text,
13+ ADD COLUMN ppa_base_url text,
14+ ADD COLUMN ppa_private_base_url text,
15+ ADD COLUMN ppa_signing_keys_root text;
16+
17+INSERT INTO LaunchpadDatabaseRevision VALUES (2208, 99, 0);
18
19=== modified file 'lib/lp/archivepublisher/interfaces/publisherconfig.py'
20--- lib/lp/archivepublisher/interfaces/publisherconfig.py 2011-03-04 17:05:45 +0000
21+++ lib/lp/archivepublisher/interfaces/publisherconfig.py 2011-03-17 14:37:44 +0000
22@@ -44,6 +44,28 @@
23 title=_("Copy Base URL"), required=True,
24 description=_("The base URL for published copy archives"))
25
26+ ppa_root_dir = TextLine(
27+ title=_("PPA Root Directory"), required=False,
28+ description=_("The root directory for published PPAs."))
29+
30+ ppa_private_root_dir = TextLine(
31+ title=_("Private PPA Root Directory"), required=False,
32+ description=_("The root directory for published private PPAs."))
33+
34+ ppa_base_url = TextLine(
35+ title=_("PPA Base URL"), required=False,
36+ description=_("The base URL for published PPAs."))
37+
38+ ppa_private_base_url = TextLine(
39+ title=_("Private PPA Base URL"), required=False,
40+ description=_("The base URL for published private PPAs."))
41+
42+ ppa_signing_keys_root = TextLine(
43+ title=_("Root Directory For PPA Signing Keys"), required=False,
44+ description=_(
45+ "The directory containing the GPG signing keys for PPAs."))
46+
47+
48
49 class IPublisherConfigSet(Interface):
50 """`PublisherConfigSet` interface."""
51
52=== modified file 'lib/lp/archivepublisher/model/publisherconfig.py'
53--- lib/lp/archivepublisher/model/publisherconfig.py 2011-03-08 12:51:02 +0000
54+++ lib/lp/archivepublisher/model/publisherconfig.py 2011-03-17 14:37:44 +0000
55@@ -43,13 +43,28 @@
56
57 copy_base_url = Unicode(name='copy_base_url', allow_none=False)
58
59+ ppa_root_dir = Unicode(name='ppa_root_dir', allow_none=True)
60+
61+ ppa_private_root_dir = Unicode(
62+ name='ppa_private_root_dir', allow_none=True)
63+
64+ ppa_base_url = Unicode(name='ppa_base_url', allow_none=True)
65+
66+ ppa_private_base_url = Unicode(
67+ name='ppa_private_base_url', allow_none=True)
68+
69+ ppa_signing_keys_root = Unicode(
70+ name='ppa_signing_keys_root', allow_none=True)
71+
72
73 class PublisherConfigSet:
74 """See `IPublisherConfigSet`."""
75 implements(IPublisherConfigSet)
76 title = "Soyuz Publisher Configurations"
77
78- def new(self, distribution, root_dir, base_url, copy_base_url):
79+ def new(self, distribution, root_dir, base_url, copy_base_url,
80+ ppa_root_dir=None, ppa_private_root_dir=None, ppa_base_url=None,
81+ ppa_private_base_url=None, ppa_signing_keys_root=None):
82 """Make and return a new `PublisherConfig`."""
83 store = IMasterStore(PublisherConfig)
84 pubconf = PublisherConfig()
85@@ -57,6 +72,11 @@
86 pubconf.root_dir = root_dir
87 pubconf.base_url = base_url
88 pubconf.copy_base_url = copy_base_url
89+ pubconf.ppa_root_dir = ppa_root_dir
90+ pubconf.ppa_private_root_dir = ppa_private_root_dir
91+ pubconf.ppa_base_url = ppa_base_url
92+ pubconf.ppa_private_base_url = ppa_private_base_url
93+ pubconf.ppa_signing_keys_root = ppa_signing_keys_root
94 store.add(pubconf)
95 return pubconf
96
97
98=== modified file 'lib/lp/archivepublisher/tests/test_publisherconfig.py'
99--- lib/lp/archivepublisher/tests/test_publisherconfig.py 2011-03-16 17:04:49 +0000
100+++ lib/lp/archivepublisher/tests/test_publisherconfig.py 2011-03-17 14:37:44 +0000
101@@ -47,17 +47,32 @@
102 ROOT_DIR = u"rootdir/test"
103 BASE_URL = u"http://base.url"
104 COPY_BASE_URL = u"http://base.url"
105+ PPA_ROOT = u"root/foo"
106+ PPA_PRIVATE_ROOT = u"private/foo"
107+ PPA_BASE_URL = u"http://ppa.foo"
108+ PPA_PRIVATE_BASE_URL = u"http://private.foo"
109+ PPA_KEYS_ROOT = u"keyroot/foo"
110 pubconf = self.factory.makePublisherConfig(
111 distribution=self.distribution,
112 root_dir=ROOT_DIR,
113 base_url=BASE_URL,
114 copy_base_url=COPY_BASE_URL,
115+ ppa_root_dir=PPA_ROOT,
116+ ppa_private_root_dir=PPA_PRIVATE_ROOT,
117+ ppa_base_url=PPA_BASE_URL,
118+ ppa_private_base_url=PPA_PRIVATE_BASE_URL,
119+ ppa_signing_keys_root=PPA_KEYS_ROOT
120 )
121
122 self.assertEqual(self.distribution.name, pubconf.distribution.name)
123 self.assertEqual(ROOT_DIR, pubconf.root_dir)
124 self.assertEqual(BASE_URL, pubconf.base_url)
125 self.assertEqual(COPY_BASE_URL, pubconf.copy_base_url)
126+ self.assertEqual(PPA_ROOT, pubconf.ppa_root_dir)
127+ self.assertEqual(PPA_PRIVATE_ROOT, pubconf.ppa_private_root_dir)
128+ self.assertEqual(PPA_BASE_URL, pubconf.ppa_base_url)
129+ self.assertEqual(PPA_PRIVATE_BASE_URL, pubconf.ppa_private_base_url)
130+ self.assertEqual(PPA_KEYS_ROOT, pubconf.ppa_signing_keys_root)
131
132 def test_one_config_per_distro(self):
133 # Only one config for each distro is allowed.
134
135=== modified file 'lib/lp/registry/browser/distribution.py'
136--- lib/lp/registry/browser/distribution.py 2011-03-10 17:02:15 +0000
137+++ lib/lp/registry/browser/distribution.py 2011-03-17 14:37:44 +0000
138@@ -1108,7 +1108,11 @@
139 It redirects to the main distroseries page after a successful edit.
140 """
141 schema = IPublisherConfig
142- field_names = ['root_dir', 'base_url', 'copy_base_url']
143+ field_names = [
144+ 'root_dir', 'base_url', 'copy_base_url', 'ppa_root_dir',
145+ 'ppa_private_root_dir', 'ppa_base_url', 'ppa_private_base_url',
146+ 'ppa_signing_keys_root',
147+ ]
148
149 @property
150 def label(self):
151@@ -1147,7 +1151,14 @@
152 distribution=self.context,
153 root_dir=data['root_dir'],
154 base_url=data['base_url'],
155- copy_base_url=data['copy_base_url'])
156+ copy_base_url=data['copy_base_url'],
157+ # The following fields are optional.
158+ ppa_root_dir=data.get('ppa_root_dir'),
159+ ppa_private_root_dir=data.get('ppa_private_root_dir'),
160+ ppa_base_url=data.get('ppa_base_url'),
161+ ppa_private_base_url=data.get('ppa_private_base_url'),
162+ ppa_signing_keys_root=data.get('ppa_signing_keys_root')
163+ )
164 else:
165 form.applyChanges(config, self.form_fields, data, self.adapters)
166
167
168=== modified file 'lib/lp/registry/browser/tests/test_distribution_views.py'
169--- lib/lp/registry/browser/tests/test_distribution_views.py 2011-03-16 17:14:26 +0000
170+++ lib/lp/registry/browser/tests/test_distribution_views.py 2011-03-17 14:37:44 +0000
171@@ -34,6 +34,11 @@
172 self.ROOT_DIR = u"rootdir/test"
173 self.BASE_URL = u"http://base.url"
174 self.COPY_BASE_URL = u"http://copybase.url"
175+ self.PPA_ROOT_DIR = u"ppa/root"
176+ self.PPA_PRIVATE_ROOT_DIR = u"ppa/private"
177+ self.PPA_BASE_URL = u"http://ppa.base"
178+ self.PPA_PRIVATE_BASE_URL = u"http://private.ppa"
179+ self.PPA_SIGNING_KEYS_ROOT = u"keys/root"
180
181 def test_empty_initial_values(self):
182 # Test that the page will display empty field values with no
183@@ -58,13 +63,15 @@
184 self.assertEqual(
185 pubconf.copy_base_url, view.initial_values["copy_base_url"])
186
187- def _change_and_test_config(self):
188+ def _change_and_test_config(self, extra_fields=None):
189 form = {
190 'field.actions.save': 'save',
191 'field.root_dir': self.ROOT_DIR,
192 'field.base_url': self.BASE_URL,
193 'field.copy_base_url': self.COPY_BASE_URL,
194 }
195+ if extra_fields is not None:
196+ form.update(extra_fields)
197
198 view = DistributionPublisherConfigView(
199 self.distro, LaunchpadTestRequest(method='POST', form=form))
200@@ -76,6 +83,7 @@
201 self.assertEqual(self.ROOT_DIR, config.root_dir)
202 self.assertEqual(self.BASE_URL, config.base_url)
203 self.assertEqual(self.COPY_BASE_URL, config.copy_base_url)
204+ return config
205
206 def test_add_new_config(self):
207 # Test POSTing a new config.
208@@ -91,6 +99,30 @@
209 )
210 self._change_and_test_config()
211
212+ def test_ppa_config_fields(self):
213+ # The other tests don't set PPA fields and continue to work
214+ # because they are optional. Here we check that they can be
215+ # set.
216+ form = {
217+ 'field.ppa_root_dir': self.PPA_ROOT_DIR,
218+ 'field.ppa_private_root_dir': self.PPA_PRIVATE_ROOT_DIR,
219+ 'field.ppa_base_url': self.PPA_BASE_URL,
220+ 'field.ppa_private_base_url': self.PPA_PRIVATE_BASE_URL,
221+ 'field.ppa_signing_keys_root': self.PPA_SIGNING_KEYS_ROOT,
222+ }
223+
224+ config = self._change_and_test_config(extra_fields=form)
225+
226+ self.assertEqual(self.PPA_ROOT_DIR, config.ppa_root_dir)
227+ self.assertEqual(
228+ self.PPA_PRIVATE_ROOT_DIR, config.ppa_private_root_dir)
229+ self.assertEqual(self.PPA_BASE_URL, config.ppa_base_url)
230+ self.assertEqual(
231+ self.PPA_PRIVATE_BASE_URL, config.ppa_private_base_url)
232+ self.assertEqual(
233+ self.PPA_SIGNING_KEYS_ROOT, config.ppa_signing_keys_root)
234+
235+
236
237 class TestDistroAddView(TestCaseWithFactory):
238 """Test the +add page for a new distribution."""
239
240=== modified file 'lib/lp/testing/factory.py'
241--- lib/lp/testing/factory.py 2011-03-17 14:28:30 +0000
242+++ lib/lp/testing/factory.py 2011-03-17 14:37:44 +0000
243@@ -3908,7 +3908,10 @@
244 return getUtility(ICveSet).new(sequence, description, cvestate)
245
246 def makePublisherConfig(self, distribution=None, root_dir=None,
247- base_url=None, copy_base_url=None):
248+ base_url=None, copy_base_url=None,
249+ ppa_root_dir=None, ppa_private_root_dir=None,
250+ ppa_base_url=None, ppa_private_base_url=None,
251+ ppa_signing_keys_root=None):
252 """Create a new `PublisherConfig` record."""
253 if distribution is None:
254 distribution = self.makeDistribution()
255@@ -3918,8 +3921,11 @@
256 base_url = self.getUniqueUnicode()
257 if copy_base_url is None:
258 copy_base_url = self.getUniqueUnicode()
259+
260 return getUtility(IPublisherConfigSet).new(
261- distribution, root_dir, base_url, copy_base_url)
262+ distribution, root_dir, base_url, copy_base_url, ppa_root_dir,
263+ ppa_private_root_dir, ppa_base_url, ppa_private_base_url,
264+ ppa_signing_keys_root)
265
266
267 # Some factory methods return simple Python types. We don't add

Subscribers

People subscribed via source and target branches

to status/vote changes: