Merge lp:~michael.nelson/ubuntu-webcatalog/1015515-archive-dont-overwrite-sca into lp:ubuntu-webcatalog

Proposed by Michael Nelson
Status: Merged
Merged at revision: 152
Proposed branch: lp:~michael.nelson/ubuntu-webcatalog/1015515-archive-dont-overwrite-sca
Merge into: lp:ubuntu-webcatalog
Prerequisite: lp:~michael.nelson/ubuntu-webcatalog/1015515-only-one-app
Diff against target: 283 lines (+56/-30)
7 files modified
src/webcatalog/forms.py (+12/-8)
src/webcatalog/management/commands/import_all_app_install_data.py (+2/-0)
src/webcatalog/management/commands/import_app_install_data.py (+3/-2)
src/webcatalog/management/commands/import_sca_apps.py (+2/-2)
src/webcatalog/tests/test_commands.py (+4/-1)
src/webcatalog/tests/test_forms.py (+32/-16)
src/webcatalog/views.py (+1/-1)
To merge this branch: bzr merge lp:~michael.nelson/ubuntu-webcatalog/1015515-archive-dont-overwrite-sca
Reviewer Review Type Date Requested Status
Natalia Bidart (community) Approve
Review via email: mp+112561@code.launchpad.net

Commit message

import_app_install_data should not overwrite apps imported from sca.

Description of the change

Overview
========

Builds on the prerequisite, ensuring that when archive apps are imported, they are not able to overwrite app instances imported from sca.

I also renamed the forms to be (hopefully) clearer, renamed import_for_purchase_apps (but symlinked with the old name), and added a check_all_latest to the end of import_all_app_install_data.

`fab test`

To post a comment you must log in.
180. By Michael Nelson

Merged 1015515-only-one-app into 1015515-archive-dont-overwrite-sca.

181. By Michael Nelson

Merged 1015515-only-one-app into 1015515-archive-dont-overwrite-sca.

182. By Michael Nelson

Indentation and small test fix.

183. By Michael Nelson

REFACTOR: Renamed application forms.

Revision history for this message
Natalia Bidart (nataliabidart) wrote :

I love it!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/webcatalog/forms.py'
--- src/webcatalog/forms.py 2012-06-28 14:27:19 +0000
+++ src/webcatalog/forms.py 2012-06-28 14:27:19 +0000
@@ -38,7 +38,7 @@
3838
39__metaclass__ = type39__metaclass__ = type
40__all__ = [40__all__ = [
41 'ApplicationForm',41 'ArchiveApplicationForm',
42 'desktop_field_mappings',42 'desktop_field_mappings',
43]43]
4444
@@ -56,7 +56,7 @@
56}56}
5757
5858
59class ApplicationForm(forms.ModelForm):59class ArchiveApplicationForm(forms.ModelForm):
6060
61 screenshot_url = forms.URLField(required=False)61 screenshot_url = forms.URLField(required=False)
6262
@@ -82,11 +82,15 @@
82 return cls(data=data, instance=instance)82 return cls(data=data, instance=instance)
8383
84 def clean(self):84 def clean(self):
85 cleaned_data = super(ApplicationForm, self).clean()85 cleaned_data = super(ArchiveApplicationForm, self).clean()
8686
87 # For all fields, ensure we don't overwrite valid data on an
88 # associated instance with blank fields.
89 if self.instance.id:87 if self.instance.id:
88 if self.instance.imported_from_sca:
89 raise forms.ValidationError(
90 u"Attempt to overwrite an sca-imported app.")
91
92 # For all fields, ensure we don't overwrite valid data on an
93 # associated instance with blank fields.
90 for key, value in cleaned_data.items():94 for key, value in cleaned_data.items():
91 if not value:95 if not value:
92 instance_value = getattr(self.instance, key, False)96 instance_value = getattr(self.instance, key, False)
@@ -97,7 +101,7 @@
97 return cleaned_data101 return cleaned_data
98102
99 def save(self, commit=True):103 def save(self, commit=True):
100 app = super(ApplicationForm, self).save(commit=commit)104 app = super(ArchiveApplicationForm, self).save(commit=commit)
101 screenshot_url = self.cleaned_data['screenshot_url']105 screenshot_url = self.cleaned_data['screenshot_url']
102 if commit and screenshot_url:106 if commit and screenshot_url:
103 if screenshot_url not in app.screenshots:107 if screenshot_url not in app.screenshots:
@@ -124,7 +128,7 @@
124 validator(email)128 validator(email)
125129
126130
127class ForPurchaseApplicationForm(forms.ModelForm):131class SCAApplicationForm(forms.ModelForm):
128 screenshot_urls = MultiURLField(required=False)132 screenshot_urls = MultiURLField(required=False)
129 video_embedded_html_urls = MultiURLField(required=False)133 video_embedded_html_urls = MultiURLField(required=False)
130134
@@ -165,7 +169,7 @@
165 return apt.apt_pkg.upstream_version(value)169 return apt.apt_pkg.upstream_version(value)
166170
167 def save(self, commit=True):171 def save(self, commit=True):
168 app = super(ForPurchaseApplicationForm, self).save(commit=commit)172 app = super(SCAApplicationForm, self).save(commit=commit)
169 if commit:173 if commit:
170 self.save_media_urls()174 self.save_media_urls()
171 return app175 return app
172176
=== modified file 'src/webcatalog/management/commands/import_all_app_install_data.py'
--- src/webcatalog/management/commands/import_all_app_install_data.py 2012-06-21 20:18:44 +0000
+++ src/webcatalog/management/commands/import_all_app_install_data.py 2012-06-28 14:27:19 +0000
@@ -38,6 +38,8 @@
38 self.output("Importing app-install-data for {0}\n".format(38 self.output("Importing app-install-data for {0}\n".format(
39 distroseries), 1)39 distroseries), 1)
40 call_command('import_app_install_data', distroseries)40 call_command('import_app_install_data', distroseries)
41 self.output("Running check_all_latest across all distroseries.\n", 1)
42 call_command('check_all_latest')
4143
42 def output(self, message, level=None, flush=False):44 def output(self, message, level=None, flush=False):
43 if hasattr(self, 'stdout'):45 if hasattr(self, 'stdout'):
4446
=== modified file 'src/webcatalog/management/commands/import_app_install_data.py'
--- src/webcatalog/management/commands/import_app_install_data.py 2012-06-19 13:23:48 +0000
+++ src/webcatalog/management/commands/import_app_install_data.py 2012-06-28 14:27:19 +0000
@@ -40,7 +40,7 @@
40from django.core.files.images import ImageFile40from django.core.files.images import ImageFile
41from django.core.management.base import LabelCommand41from django.core.management.base import LabelCommand
4242
43from webcatalog.forms import ApplicationForm43from webcatalog.forms import ArchiveApplicationForm
44from webcatalog.models import (44from webcatalog.models import (
45 Application,45 Application,
46 DistroSeries,46 DistroSeries,
@@ -193,7 +193,8 @@
193 def process_desktop_file(self, desktop_file_path, icon_dir, distroseries):193 def process_desktop_file(self, desktop_file_path, icon_dir, distroseries):
194 with open(desktop_file_path, 'r') as desktop_file:194 with open(desktop_file_path, 'r') as desktop_file:
195 data = desktop_file.read()195 data = desktop_file.read()
196 form = ApplicationForm.get_form_from_desktop_data(data, distroseries)196 form = ArchiveApplicationForm.get_form_from_desktop_data(
197 data, distroseries)
197198
198 if form.is_valid():199 if form.is_valid():
199 app = form.save()200 app = form.save()
200201
=== added symlink 'src/webcatalog/management/commands/import_for_purchase_apps.py'
=== target is u'import_sca_apps.py'
=== renamed file 'src/webcatalog/management/commands/import_for_purchase_apps.py' => 'src/webcatalog/management/commands/import_sca_apps.py'
--- src/webcatalog/management/commands/import_for_purchase_apps.py 2012-06-14 09:23:43 +0000
+++ src/webcatalog/management/commands/import_sca_apps.py 2012-06-28 14:27:19 +0000
@@ -34,7 +34,7 @@
34from django.core.files.images import ImageFile34from django.core.files.images import ImageFile
35from django.core.management.base import BaseCommand35from django.core.management.base import BaseCommand
3636
37from webcatalog.forms import ForPurchaseApplicationForm37from webcatalog.forms import SCAApplicationForm
38from webcatalog.models import (38from webcatalog.models import (
39 Application,39 Application,
40 DistroSeries,40 DistroSeries,
@@ -73,7 +73,7 @@
73 Application.objects.check_latest(app_data['package_name'])73 Application.objects.check_latest(app_data['package_name'])
7474
75 def import_app_from_data(self, app_data, icon_data, distroseries):75 def import_app_from_data(self, app_data, icon_data, distroseries):
76 form = ForPurchaseApplicationForm.from_api_data(76 form = SCAApplicationForm.from_api_data(
77 app_data, distroseries)77 app_data, distroseries)
78 if form.is_valid():78 if form.is_valid():
79 app = form.save()79 app = form.save()
8080
=== modified file 'src/webcatalog/tests/test_commands.py'
--- src/webcatalog/tests/test_commands.py 2012-06-28 14:27:19 +0000
+++ src/webcatalog/tests/test_commands.py 2012-06-28 14:27:19 +0000
@@ -1044,7 +1044,10 @@
1044 with patch(patch_attr) as mock_call_command:1044 with patch(patch_attr) as mock_call_command:
1045 call_command('import_all_app_install_data')1045 call_command('import_all_app_install_data')
10461046
1047 self.assertEqual(mock_call_command.call_count, len(TEST_VERSIONS))1047 # In addition to calling import for each series, a final
1048 # call_command does check_all_latest automatically.
1049 self.assertEqual(mock_call_command.call_count,
1050 len(TEST_VERSIONS) + 1)
10481051
10491052
1050class ImportAllRatingsStatsTestCase(TestCaseWithFactory):1053class ImportAllRatingsStatsTestCase(TestCaseWithFactory):
10511054
=== modified file 'src/webcatalog/tests/test_forms.py'
--- src/webcatalog/tests/test_forms.py 2012-06-28 14:27:19 +0000
+++ src/webcatalog/tests/test_forms.py 2012-06-28 14:27:19 +0000
@@ -28,9 +28,9 @@
28from textwrap import dedent28from textwrap import dedent
2929
30from webcatalog.forms import (30from webcatalog.forms import (
31 ApplicationForm,31 ArchiveApplicationForm,
32 desktop_field_mappings,32 desktop_field_mappings,
33 ForPurchaseApplicationForm,33 SCAApplicationForm,
34 MultiURLField,34 MultiURLField,
35)35)
36from webcatalog.models import Application, ApplicationMedia36from webcatalog.models import Application, ApplicationMedia
@@ -38,13 +38,13 @@
3838
39__metaclass__ = type39__metaclass__ = type
40__all__ = [40__all__ = [
41 'ApplicationFormTestCase',41 'ArchiveApplicationFormTestCase',
42 'ForPurchaseApplicationFormTestCase',42 'SCAApplicationFormTestCase',
43 'MultiURLFieldTestCase',43 'MultiURLFieldTestCase',
44]44]
4545
4646
47class ApplicationFormTestCase(TestCaseWithFactory):47class ArchiveApplicationFormTestCase(TestCaseWithFactory):
4848
49 def get_desktop_data(self, overrides):49 def get_desktop_data(self, overrides):
50 data = {50 data = {
@@ -87,7 +87,7 @@
87 }87 }
88 desktop_entry = self.get_desktop_entry(self.get_desktop_data(data))88 desktop_entry = self.get_desktop_entry(self.get_desktop_data(data))
8989
90 form = ApplicationForm.get_form_from_desktop_data(90 form = ArchiveApplicationForm.get_form_from_desktop_data(
91 desktop_entry, distroseries=self.factory.make_distroseries())91 desktop_entry, distroseries=self.factory.make_distroseries())
9292
93 self.assertTrue(form.is_valid())93 self.assertTrue(form.is_valid())
@@ -105,7 +105,7 @@
105 }105 }
106 desktop_entry = self.get_desktop_entry(self.get_desktop_data(data))106 desktop_entry = self.get_desktop_entry(self.get_desktop_data(data))
107107
108 form = ApplicationForm.get_form_from_desktop_data(108 form = ArchiveApplicationForm.get_form_from_desktop_data(
109 desktop_entry, distroseries=app.distroseries)109 desktop_entry, distroseries=app.distroseries)
110110
111 self.assertTrue(form.is_valid())111 self.assertTrue(form.is_valid())
@@ -129,7 +129,7 @@
129 info = self.get_desktop_data(extra_desktop_info)129 info = self.get_desktop_data(extra_desktop_info)
130 desktop_entry = self.get_desktop_entry(info)130 desktop_entry = self.get_desktop_entry(info)
131131
132 form = ApplicationForm.get_form_from_desktop_data(132 form = ArchiveApplicationForm.get_form_from_desktop_data(
133 desktop_entry, distroseries=self.factory.make_distroseries())133 desktop_entry, distroseries=self.factory.make_distroseries())
134134
135 self.assertTrue(form.is_valid())135 self.assertTrue(form.is_valid())
@@ -147,7 +147,7 @@
147 info = self.get_desktop_data(extra_desktop_info)147 info = self.get_desktop_data(extra_desktop_info)
148 desktop_entry = self.get_desktop_entry(info)148 desktop_entry = self.get_desktop_entry(info)
149149
150 form = ApplicationForm.get_form_from_desktop_data(150 form = ArchiveApplicationForm.get_form_from_desktop_data(
151 desktop_entry, distroseries=app.distroseries)151 desktop_entry, distroseries=app.distroseries)
152 form.save()152 form.save()
153153
@@ -168,17 +168,33 @@
168 d = dict(screenshot_url='http://foo.com:42/broken',168 d = dict(screenshot_url='http://foo.com:42/broken',
169 section='required', name='required', package_name='required',169 section='required', name='required', package_name='required',
170 distroseries=distroseries.id)170 distroseries=distroseries.id)
171 form = ApplicationForm(d)171 form = ArchiveApplicationForm(d)
172 self.assertTrue(form.is_valid())172 self.assertTrue(form.is_valid())
173173
174174 def test_updating_an_sca_imported_app_fails_validation(self):
175class ForPurchaseApplicationFormTestCase(TestCaseWithFactory):175 app = self.factory.make_application(imported_from_sca=True)
176 extra_desktop_info = {
177 'X-AppInstall-Package': app.package_name,
178 }
179 info = self.get_desktop_data(extra_desktop_info)
180 desktop_entry = self.get_desktop_entry(info)
181
182 form = ArchiveApplicationForm.get_form_from_desktop_data(
183 desktop_entry, distroseries=app.distroseries)
184
185 self.assertFalse(form.is_valid())
186 self.assertEqual(
187 {'__all__': [u'Attempt to overwrite an sca-imported app.']},
188 form.errors)
189
190
191class SCAApplicationFormTestCase(TestCaseWithFactory):
176192
177 def test_from_api_data_shortens_debtag(self):193 def test_from_api_data_shortens_debtag(self):
178 app = self.factory.make_application()194 app = self.factory.make_application()
179 data = self.make_valid_data(debtags=['hardware::storage:cd-writer'])195 data = self.make_valid_data(debtags=['hardware::storage:cd-writer'])
180196
181 form = ForPurchaseApplicationForm.from_api_data(data, app.distroseries)197 form = SCAApplicationForm.from_api_data(data, app.distroseries)
182198
183 self.assertEqual(form.data['debtags'], '["CD burner"]')199 self.assertEqual(form.data['debtags'], '["CD burner"]')
184200
@@ -199,8 +215,8 @@
199 'name': app.name,215 'name': app.name,
200 }216 }
201217
202 form = ForPurchaseApplicationForm.from_api_data(data,218 form = SCAApplicationForm.from_api_data(data,
203 app.distroseries)219 app.distroseries)
204 self.assertTrue(form.is_valid())220 self.assertTrue(form.is_valid())
205 form.save_media_urls()221 form.save_media_urls()
206222
@@ -259,7 +275,7 @@
259275
260 data = self.make_valid_data(archive_id='')276 data = self.make_valid_data(archive_id='')
261277
262 form = ForPurchaseApplicationForm.from_api_data(data, precise)278 form = SCAApplicationForm.from_api_data(data, precise)
263279
264 self.assertTrue(form.is_valid())280 self.assertTrue(form.is_valid())
265281
266282
=== modified file 'src/webcatalog/views.py'
--- src/webcatalog/views.py 2012-06-28 14:27:19 +0000
+++ src/webcatalog/views.py 2012-06-28 14:27:19 +0000
@@ -232,7 +232,7 @@
232232
233def application_reviews(request, package_name, distro, ajax=False, page=1):233def application_reviews(request, package_name, distro, ajax=False, page=1):
234 app = get_object_or_404(Application, package_name=package_name,234 app = get_object_or_404(Application, package_name=package_name,
235 distroseries__code_name=distro)235 distroseries__code_name=distro)
236236
237 # XXX michaeln 2011-09-15 bug=851662 Better review language options.237 # XXX michaeln 2011-09-15 bug=851662 Better review language options.
238 reviews = WebServices().get_reviews_for_package(238 reviews = WebServices().get_reviews_for_package(

Subscribers

People subscribed via source and target branches