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
=== added file 'database/schema/patch-2208-99-0.sql'
--- database/schema/patch-2208-99-0.sql 1970-01-01 00:00:00 +0000
+++ database/schema/patch-2208-99-0.sql 2011-03-17 14:37:44 +0000
@@ -0,0 +1,13 @@
1-- Copyright 2011 Canonical Ltd. This software is licensed under the
2-- GNU Affero General Public License version 3 (see the file LICENSE).
3
4SET client_min_messages=ERROR;
5
6ALTER TABLE PublisherConfig
7 ADD COLUMN ppa_root_dir text,
8 ADD COLUMN ppa_private_root_dir text,
9 ADD COLUMN ppa_base_url text,
10 ADD COLUMN ppa_private_base_url text,
11 ADD COLUMN ppa_signing_keys_root text;
12
13INSERT INTO LaunchpadDatabaseRevision VALUES (2208, 99, 0);
014
=== modified file 'lib/lp/archivepublisher/interfaces/publisherconfig.py'
--- lib/lp/archivepublisher/interfaces/publisherconfig.py 2011-03-04 17:05:45 +0000
+++ lib/lp/archivepublisher/interfaces/publisherconfig.py 2011-03-17 14:37:44 +0000
@@ -44,6 +44,28 @@
44 title=_("Copy Base URL"), required=True,44 title=_("Copy Base URL"), required=True,
45 description=_("The base URL for published copy archives"))45 description=_("The base URL for published copy archives"))
4646
47 ppa_root_dir = TextLine(
48 title=_("PPA Root Directory"), required=False,
49 description=_("The root directory for published PPAs."))
50
51 ppa_private_root_dir = TextLine(
52 title=_("Private PPA Root Directory"), required=False,
53 description=_("The root directory for published private PPAs."))
54
55 ppa_base_url = TextLine(
56 title=_("PPA Base URL"), required=False,
57 description=_("The base URL for published PPAs."))
58
59 ppa_private_base_url = TextLine(
60 title=_("Private PPA Base URL"), required=False,
61 description=_("The base URL for published private PPAs."))
62
63 ppa_signing_keys_root = TextLine(
64 title=_("Root Directory For PPA Signing Keys"), required=False,
65 description=_(
66 "The directory containing the GPG signing keys for PPAs."))
67
68
4769
48class IPublisherConfigSet(Interface):70class IPublisherConfigSet(Interface):
49 """`PublisherConfigSet` interface."""71 """`PublisherConfigSet` interface."""
5072
=== modified file 'lib/lp/archivepublisher/model/publisherconfig.py'
--- lib/lp/archivepublisher/model/publisherconfig.py 2011-03-08 12:51:02 +0000
+++ lib/lp/archivepublisher/model/publisherconfig.py 2011-03-17 14:37:44 +0000
@@ -43,13 +43,28 @@
4343
44 copy_base_url = Unicode(name='copy_base_url', allow_none=False)44 copy_base_url = Unicode(name='copy_base_url', allow_none=False)
4545
46 ppa_root_dir = Unicode(name='ppa_root_dir', allow_none=True)
47
48 ppa_private_root_dir = Unicode(
49 name='ppa_private_root_dir', allow_none=True)
50
51 ppa_base_url = Unicode(name='ppa_base_url', allow_none=True)
52
53 ppa_private_base_url = Unicode(
54 name='ppa_private_base_url', allow_none=True)
55
56 ppa_signing_keys_root = Unicode(
57 name='ppa_signing_keys_root', allow_none=True)
58
4659
47class PublisherConfigSet:60class PublisherConfigSet:
48 """See `IPublisherConfigSet`."""61 """See `IPublisherConfigSet`."""
49 implements(IPublisherConfigSet)62 implements(IPublisherConfigSet)
50 title = "Soyuz Publisher Configurations"63 title = "Soyuz Publisher Configurations"
5164
52 def new(self, distribution, root_dir, base_url, copy_base_url):65 def new(self, distribution, root_dir, base_url, copy_base_url,
66 ppa_root_dir=None, ppa_private_root_dir=None, ppa_base_url=None,
67 ppa_private_base_url=None, ppa_signing_keys_root=None):
53 """Make and return a new `PublisherConfig`."""68 """Make and return a new `PublisherConfig`."""
54 store = IMasterStore(PublisherConfig)69 store = IMasterStore(PublisherConfig)
55 pubconf = PublisherConfig()70 pubconf = PublisherConfig()
@@ -57,6 +72,11 @@
57 pubconf.root_dir = root_dir72 pubconf.root_dir = root_dir
58 pubconf.base_url = base_url73 pubconf.base_url = base_url
59 pubconf.copy_base_url = copy_base_url74 pubconf.copy_base_url = copy_base_url
75 pubconf.ppa_root_dir = ppa_root_dir
76 pubconf.ppa_private_root_dir = ppa_private_root_dir
77 pubconf.ppa_base_url = ppa_base_url
78 pubconf.ppa_private_base_url = ppa_private_base_url
79 pubconf.ppa_signing_keys_root = ppa_signing_keys_root
60 store.add(pubconf)80 store.add(pubconf)
61 return pubconf81 return pubconf
6282
6383
=== modified file 'lib/lp/archivepublisher/tests/test_publisherconfig.py'
--- lib/lp/archivepublisher/tests/test_publisherconfig.py 2011-03-16 17:04:49 +0000
+++ lib/lp/archivepublisher/tests/test_publisherconfig.py 2011-03-17 14:37:44 +0000
@@ -47,17 +47,32 @@
47 ROOT_DIR = u"rootdir/test"47 ROOT_DIR = u"rootdir/test"
48 BASE_URL = u"http://base.url"48 BASE_URL = u"http://base.url"
49 COPY_BASE_URL = u"http://base.url"49 COPY_BASE_URL = u"http://base.url"
50 PPA_ROOT = u"root/foo"
51 PPA_PRIVATE_ROOT = u"private/foo"
52 PPA_BASE_URL = u"http://ppa.foo"
53 PPA_PRIVATE_BASE_URL = u"http://private.foo"
54 PPA_KEYS_ROOT = u"keyroot/foo"
50 pubconf = self.factory.makePublisherConfig(55 pubconf = self.factory.makePublisherConfig(
51 distribution=self.distribution,56 distribution=self.distribution,
52 root_dir=ROOT_DIR,57 root_dir=ROOT_DIR,
53 base_url=BASE_URL,58 base_url=BASE_URL,
54 copy_base_url=COPY_BASE_URL,59 copy_base_url=COPY_BASE_URL,
60 ppa_root_dir=PPA_ROOT,
61 ppa_private_root_dir=PPA_PRIVATE_ROOT,
62 ppa_base_url=PPA_BASE_URL,
63 ppa_private_base_url=PPA_PRIVATE_BASE_URL,
64 ppa_signing_keys_root=PPA_KEYS_ROOT
55 )65 )
5666
57 self.assertEqual(self.distribution.name, pubconf.distribution.name)67 self.assertEqual(self.distribution.name, pubconf.distribution.name)
58 self.assertEqual(ROOT_DIR, pubconf.root_dir)68 self.assertEqual(ROOT_DIR, pubconf.root_dir)
59 self.assertEqual(BASE_URL, pubconf.base_url)69 self.assertEqual(BASE_URL, pubconf.base_url)
60 self.assertEqual(COPY_BASE_URL, pubconf.copy_base_url)70 self.assertEqual(COPY_BASE_URL, pubconf.copy_base_url)
71 self.assertEqual(PPA_ROOT, pubconf.ppa_root_dir)
72 self.assertEqual(PPA_PRIVATE_ROOT, pubconf.ppa_private_root_dir)
73 self.assertEqual(PPA_BASE_URL, pubconf.ppa_base_url)
74 self.assertEqual(PPA_PRIVATE_BASE_URL, pubconf.ppa_private_base_url)
75 self.assertEqual(PPA_KEYS_ROOT, pubconf.ppa_signing_keys_root)
6176
62 def test_one_config_per_distro(self):77 def test_one_config_per_distro(self):
63 # Only one config for each distro is allowed.78 # Only one config for each distro is allowed.
6479
=== modified file 'lib/lp/registry/browser/distribution.py'
--- lib/lp/registry/browser/distribution.py 2011-03-10 17:02:15 +0000
+++ lib/lp/registry/browser/distribution.py 2011-03-17 14:37:44 +0000
@@ -1108,7 +1108,11 @@
1108 It redirects to the main distroseries page after a successful edit.1108 It redirects to the main distroseries page after a successful edit.
1109 """1109 """
1110 schema = IPublisherConfig1110 schema = IPublisherConfig
1111 field_names = ['root_dir', 'base_url', 'copy_base_url']1111 field_names = [
1112 'root_dir', 'base_url', 'copy_base_url', 'ppa_root_dir',
1113 'ppa_private_root_dir', 'ppa_base_url', 'ppa_private_base_url',
1114 'ppa_signing_keys_root',
1115 ]
11121116
1113 @property1117 @property
1114 def label(self):1118 def label(self):
@@ -1147,7 +1151,14 @@
1147 distribution=self.context,1151 distribution=self.context,
1148 root_dir=data['root_dir'],1152 root_dir=data['root_dir'],
1149 base_url=data['base_url'],1153 base_url=data['base_url'],
1150 copy_base_url=data['copy_base_url'])1154 copy_base_url=data['copy_base_url'],
1155 # The following fields are optional.
1156 ppa_root_dir=data.get('ppa_root_dir'),
1157 ppa_private_root_dir=data.get('ppa_private_root_dir'),
1158 ppa_base_url=data.get('ppa_base_url'),
1159 ppa_private_base_url=data.get('ppa_private_base_url'),
1160 ppa_signing_keys_root=data.get('ppa_signing_keys_root')
1161 )
1151 else:1162 else:
1152 form.applyChanges(config, self.form_fields, data, self.adapters)1163 form.applyChanges(config, self.form_fields, data, self.adapters)
11531164
11541165
=== modified file 'lib/lp/registry/browser/tests/test_distribution_views.py'
--- lib/lp/registry/browser/tests/test_distribution_views.py 2011-03-16 17:14:26 +0000
+++ lib/lp/registry/browser/tests/test_distribution_views.py 2011-03-17 14:37:44 +0000
@@ -34,6 +34,11 @@
34 self.ROOT_DIR = u"rootdir/test"34 self.ROOT_DIR = u"rootdir/test"
35 self.BASE_URL = u"http://base.url"35 self.BASE_URL = u"http://base.url"
36 self.COPY_BASE_URL = u"http://copybase.url"36 self.COPY_BASE_URL = u"http://copybase.url"
37 self.PPA_ROOT_DIR = u"ppa/root"
38 self.PPA_PRIVATE_ROOT_DIR = u"ppa/private"
39 self.PPA_BASE_URL = u"http://ppa.base"
40 self.PPA_PRIVATE_BASE_URL = u"http://private.ppa"
41 self.PPA_SIGNING_KEYS_ROOT = u"keys/root"
3742
38 def test_empty_initial_values(self):43 def test_empty_initial_values(self):
39 # Test that the page will display empty field values with no44 # Test that the page will display empty field values with no
@@ -58,13 +63,15 @@
58 self.assertEqual(63 self.assertEqual(
59 pubconf.copy_base_url, view.initial_values["copy_base_url"])64 pubconf.copy_base_url, view.initial_values["copy_base_url"])
6065
61 def _change_and_test_config(self):66 def _change_and_test_config(self, extra_fields=None):
62 form = {67 form = {
63 'field.actions.save': 'save',68 'field.actions.save': 'save',
64 'field.root_dir': self.ROOT_DIR,69 'field.root_dir': self.ROOT_DIR,
65 'field.base_url': self.BASE_URL,70 'field.base_url': self.BASE_URL,
66 'field.copy_base_url': self.COPY_BASE_URL,71 'field.copy_base_url': self.COPY_BASE_URL,
67 }72 }
73 if extra_fields is not None:
74 form.update(extra_fields)
6875
69 view = DistributionPublisherConfigView(76 view = DistributionPublisherConfigView(
70 self.distro, LaunchpadTestRequest(method='POST', form=form))77 self.distro, LaunchpadTestRequest(method='POST', form=form))
@@ -76,6 +83,7 @@
76 self.assertEqual(self.ROOT_DIR, config.root_dir)83 self.assertEqual(self.ROOT_DIR, config.root_dir)
77 self.assertEqual(self.BASE_URL, config.base_url)84 self.assertEqual(self.BASE_URL, config.base_url)
78 self.assertEqual(self.COPY_BASE_URL, config.copy_base_url)85 self.assertEqual(self.COPY_BASE_URL, config.copy_base_url)
86 return config
7987
80 def test_add_new_config(self):88 def test_add_new_config(self):
81 # Test POSTing a new config.89 # Test POSTing a new config.
@@ -91,6 +99,30 @@
91 )99 )
92 self._change_and_test_config()100 self._change_and_test_config()
93101
102 def test_ppa_config_fields(self):
103 # The other tests don't set PPA fields and continue to work
104 # because they are optional. Here we check that they can be
105 # set.
106 form = {
107 'field.ppa_root_dir': self.PPA_ROOT_DIR,
108 'field.ppa_private_root_dir': self.PPA_PRIVATE_ROOT_DIR,
109 'field.ppa_base_url': self.PPA_BASE_URL,
110 'field.ppa_private_base_url': self.PPA_PRIVATE_BASE_URL,
111 'field.ppa_signing_keys_root': self.PPA_SIGNING_KEYS_ROOT,
112 }
113
114 config = self._change_and_test_config(extra_fields=form)
115
116 self.assertEqual(self.PPA_ROOT_DIR, config.ppa_root_dir)
117 self.assertEqual(
118 self.PPA_PRIVATE_ROOT_DIR, config.ppa_private_root_dir)
119 self.assertEqual(self.PPA_BASE_URL, config.ppa_base_url)
120 self.assertEqual(
121 self.PPA_PRIVATE_BASE_URL, config.ppa_private_base_url)
122 self.assertEqual(
123 self.PPA_SIGNING_KEYS_ROOT, config.ppa_signing_keys_root)
124
125
94126
95class TestDistroAddView(TestCaseWithFactory):127class TestDistroAddView(TestCaseWithFactory):
96 """Test the +add page for a new distribution."""128 """Test the +add page for a new distribution."""
97129
=== modified file 'lib/lp/testing/factory.py'
--- lib/lp/testing/factory.py 2011-03-17 14:28:30 +0000
+++ lib/lp/testing/factory.py 2011-03-17 14:37:44 +0000
@@ -3908,7 +3908,10 @@
3908 return getUtility(ICveSet).new(sequence, description, cvestate)3908 return getUtility(ICveSet).new(sequence, description, cvestate)
39093909
3910 def makePublisherConfig(self, distribution=None, root_dir=None,3910 def makePublisherConfig(self, distribution=None, root_dir=None,
3911 base_url=None, copy_base_url=None):3911 base_url=None, copy_base_url=None,
3912 ppa_root_dir=None, ppa_private_root_dir=None,
3913 ppa_base_url=None, ppa_private_base_url=None,
3914 ppa_signing_keys_root=None):
3912 """Create a new `PublisherConfig` record."""3915 """Create a new `PublisherConfig` record."""
3913 if distribution is None:3916 if distribution is None:
3914 distribution = self.makeDistribution()3917 distribution = self.makeDistribution()
@@ -3918,8 +3921,11 @@
3918 base_url = self.getUniqueUnicode()3921 base_url = self.getUniqueUnicode()
3919 if copy_base_url is None:3922 if copy_base_url is None:
3920 copy_base_url = self.getUniqueUnicode()3923 copy_base_url = self.getUniqueUnicode()
3924
3921 return getUtility(IPublisherConfigSet).new(3925 return getUtility(IPublisherConfigSet).new(
3922 distribution, root_dir, base_url, copy_base_url)3926 distribution, root_dir, base_url, copy_base_url, ppa_root_dir,
3927 ppa_private_root_dir, ppa_base_url, ppa_private_base_url,
3928 ppa_signing_keys_root)
39233929
39243930
3925# Some factory methods return simple Python types. We don't add3931# Some factory methods return simple Python types. We don't add

Subscribers

People subscribed via source and target branches

to status/vote changes: