Merge lp:~michael.nelson/ubuntu-webcatalog/962140-display-video-demos into lp:ubuntu-webcatalog

Proposed by Michael Nelson
Status: Merged
Approved by: Anthony Lenton
Approved revision: 124
Merged at revision: 115
Proposed branch: lp:~michael.nelson/ubuntu-webcatalog/962140-display-video-demos
Merge into: lp:ubuntu-webcatalog
Diff against target: 195 lines (+80/-21)
3 files modified
src/webcatalog/forms.py (+16/-13)
src/webcatalog/management/commands/import_for_purchase_apps.py (+3/-6)
src/webcatalog/tests/test_forms.py (+61/-2)
To merge this branch: bzr merge lp:~michael.nelson/ubuntu-webcatalog/962140-display-video-demos
Reviewer Review Type Date Requested Status
Anthony Lenton (community) Approve
Review via email: mp+104402@code.launchpad.net

Commit message

Import video urls during import_for_purchase_apps.

Description of the change

Overview
========

Just a prep-branch for bug 962140 that:

* ensures we import the video urls when importing for-purchase apps
* removes unnecessary list serialise/unserialise and simplifies importer code by putting responsibility for saving media in the form.save() itself (matching the distro import command)

`fab test`

Tomorrow's first branch will simply use the imported data to display the iframe.

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

REFACTOR: Added commit kwargs back to form.save() methods.

Revision history for this message
Anthony Lenton (elachuni) wrote :

Looks fine!

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-04-20 06:41:56 +0000
+++ src/webcatalog/forms.py 2012-05-03 12:42:19 +0000
@@ -96,12 +96,10 @@
9696
97 return cleaned_data97 return cleaned_data
9898
99 def save(self):99 def save(self, commit=True):
100 # We don't provide a commit=False option as we have100 app = super(ApplicationForm, self).save(commit=commit)
101 # to commit to be able to add the screenshots.
102 app = super(ApplicationForm, self).save()
103 screenshot_url = self.cleaned_data['screenshot_url']101 screenshot_url = self.cleaned_data['screenshot_url']
104 if screenshot_url:102 if commit and screenshot_url:
105 if screenshot_url not in app.screenshots:103 if screenshot_url not in app.screenshots:
106 app.applicationmedia_set.create(104 app.applicationmedia_set.create(
107 media_type='screenshot', url=screenshot_url)105 media_type='screenshot', url=screenshot_url)
@@ -114,7 +112,7 @@
114 # Return an empty list if no input was given.112 # Return an empty list if no input was given.
115 if not value:113 if not value:
116 return []114 return []
117 return value.split(',')115 return value
118116
119 def validate(self, value):117 def validate(self, value):
120 "Check if value consists only of valid urls."118 "Check if value consists only of valid urls."
@@ -128,20 +126,21 @@
128126
129class ForPurchaseApplicationForm(forms.ModelForm):127class ForPurchaseApplicationForm(forms.ModelForm):
130 screenshot_urls = MultiURLField(required=False)128 screenshot_urls = MultiURLField(required=False)
129 video_embedded_html_urls = MultiURLField(required=False)
131130
132 class Meta:131 class Meta:
133 model = Application132 model = Application
134 exclude = ('distroseries', 'section', 'popcon')133 exclude = ('section', 'popcon')
135134
136 @classmethod135 @classmethod
137 def from_json(cls, app_data, distroseries):136 def from_api_data(cls, app_data, distroseries):
138 app_data = app_data.copy()137 app_data = app_data.copy()
138 app_data['distroseries'] = distroseries.id
139 app_data['for_purchase'] = True
139 if 'description' in app_data:140 if 'description' in app_data:
140 tagline, _, description = app_data['description'].partition('\n')141 tagline, _, description = app_data['description'].partition('\n')
141 app_data['comment'] = tagline142 app_data['comment'] = tagline
142 app_data['description'] = description143 app_data['description'] = description
143 if 'screenshot_urls' in app_data:
144 app_data['screenshot_urls'] = ",".join(app_data['screenshot_urls'])
145 if 'debtags' in app_data and app_data['debtags']:144 if 'debtags' in app_data and app_data['debtags']:
146 app_data['debtags'] = json.dumps([get_hw_short_description(x)145 app_data['debtags'] = json.dumps([get_hw_short_description(x)
147 for x in app_data['debtags']])146 for x in app_data['debtags']])
@@ -159,16 +158,20 @@
159 return apt.apt_pkg.upstream_version(value)158 return apt.apt_pkg.upstream_version(value)
160159
161 def save(self, commit=True):160 def save(self, commit=True):
162 app = super(ForPurchaseApplicationForm, self).save(commit)161 app = super(ForPurchaseApplicationForm, self).save(commit=commit)
163 if commit:162 if commit:
164 self.save_screenshot_urls()163 self.save_media_urls()
165 return app164 return app
166165
167 def save_screenshot_urls(self):166 def save_media_urls(self):
168 for screenshot_url in self.cleaned_data['screenshot_urls']:167 for screenshot_url in self.cleaned_data['screenshot_urls']:
169 self.instance.applicationmedia_set.get_or_create(168 self.instance.applicationmedia_set.get_or_create(
170 url=screenshot_url, media_type='screenshot')169 url=screenshot_url, media_type='screenshot')
171170
171 for video_url in self.cleaned_data['video_embedded_html_urls']:
172 self.instance.applicationmedia_set.get_or_create(
173 url=video_url, media_type='video')
174
172175
173class EmailDownloadLinkForm(forms.Form):176class EmailDownloadLinkForm(forms.Form):
174 email = forms.EmailField()177 email = forms.EmailField()
175178
=== modified file 'src/webcatalog/management/commands/import_for_purchase_apps.py'
--- src/webcatalog/management/commands/import_for_purchase_apps.py 2012-03-19 14:38:02 +0000
+++ src/webcatalog/management/commands/import_for_purchase_apps.py 2012-05-03 12:42:19 +0000
@@ -70,13 +70,10 @@
70 Application.objects.check_latest(app_data['package_name'])70 Application.objects.check_latest(app_data['package_name'])
7171
72 def import_app_from_data(self, app_data, icon_data, distroseries):72 def import_app_from_data(self, app_data, icon_data, distroseries):
73 form = ForPurchaseApplicationForm.from_json(app_data, distroseries)73 form = ForPurchaseApplicationForm.from_api_data(
74 app_data, distroseries)
74 if form.is_valid():75 if form.is_valid():
75 app = form.save(commit=False)76 app = form.save()
76 app.distroseries = distroseries
77 app.for_purchase = True
78 app.save()
79 form.save_screenshot_urls()
80 app.update_departments()77 app.update_departments()
81 self.add_icon_to_app(app, data=icon_data)78 self.add_icon_to_app(app, data=icon_data)
82 self.output(u"{0} created.\n".format(app.name).encode('utf-8'), 1)79 self.output(u"{0} created.\n".format(app.name).encode('utf-8'), 1)
8380
=== modified file 'src/webcatalog/tests/test_forms.py'
--- src/webcatalog/tests/test_forms.py 2012-04-20 06:41:56 +0000
+++ src/webcatalog/tests/test_forms.py 2012-05-03 12:42:19 +0000
@@ -22,12 +22,16 @@
22 with_statement,22 with_statement,
23 )23 )
2424
25from django.forms import ValidationError
26from django.test import TestCase
27
25from textwrap import dedent28from textwrap import dedent
2629
27from webcatalog.forms import (30from webcatalog.forms import (
28 ApplicationForm,31 ApplicationForm,
29 desktop_field_mappings,32 desktop_field_mappings,
30 ForPurchaseApplicationForm,33 ForPurchaseApplicationForm,
34 MultiURLField,
31 )35 )
32from webcatalog.models import Application, ApplicationMedia36from webcatalog.models import Application, ApplicationMedia
33from webcatalog.tests.factory import TestCaseWithFactory37from webcatalog.tests.factory import TestCaseWithFactory
@@ -36,6 +40,7 @@
36__all__ = [40__all__ = [
37 'ApplicationFormTestCase',41 'ApplicationFormTestCase',
38 'ForPurchaseApplicationFormTestCase',42 'ForPurchaseApplicationFormTestCase',
43 'MultiURLFieldTestCase',
39 ]44 ]
4045
4146
@@ -169,10 +174,64 @@
169174
170class ForPurchaseApplicationFormTestCase(TestCaseWithFactory):175class ForPurchaseApplicationFormTestCase(TestCaseWithFactory):
171176
172 def test_from_json_shortens_debtag(self):177 def test_from_api_data_shortens_debtag(self):
173 app = self.factory.make_application()178 app = self.factory.make_application()
174 data = {'debtags': ['hardware::storage:cd-writer']}179 data = {'debtags': ['hardware::storage:cd-writer']}
175180
176 form = ForPurchaseApplicationForm.from_json(data, app.distroseries)181 form = ForPurchaseApplicationForm.from_api_data(data, app.distroseries)
177182
178 self.assertEqual(form.data['debtags'], '["CD burner"]')183 self.assertEqual(form.data['debtags'], '["CD burner"]')
184
185 def test_save_media_urls(self):
186 app = self.factory.make_application(
187 screenshot_url="http://example.com/screenshot1.png")
188 self.assertEqual(1, app.applicationmedia_set.count())
189 data = {
190 'screenshot_urls': [
191 'http://example.com/screenshot1.png',
192 'http://example.com/screenshot2.png',
193 ],
194 'video_embedded_html_urls': [
195 'http://example.com/video1.mp4',
196 ],
197 'archive_id': app.archive_id,
198 'package_name': app.package_name,
199 'name': app.name,
200 }
201
202 form = ForPurchaseApplicationForm.from_api_data(data,
203 app.distroseries)
204 self.assertTrue(form.is_valid())
205 form.save_media_urls()
206 self.assertEqual(3, app.applicationmedia_set.count())
207 actual_urls = [media.url for media in app.applicationmedia_set.all()]
208 self.assertEqual([
209 'http://example.com/screenshot1.png',
210 'http://example.com/screenshot2.png',
211 'http://example.com/video1.mp4',
212 ], actual_urls)
213
214
215class MultiURLFieldTestCase(TestCase):
216
217 def test_normalize_empty_value(self):
218 self.assertEqual(
219 [], MultiURLField().to_python(''))
220 self.assertEqual(
221 [], MultiURLField().to_python(None))
222 self.assertEqual(
223 [], MultiURLField().to_python([]))
224
225 def test_normalize_expects_list_strings(self):
226 self.assertEqual(
227 ['foo', 'bar'],
228 MultiURLField().to_python(['foo', 'bar']))
229
230 def test_validates_multiple_URLs(self):
231 MultiURLField().validate(
232 ['http://example.com', 'https://example.com/two'])
233
234 self.assertRaises(
235 ValidationError,
236 MultiURLField().validate,
237 ['httpd://example.com', 'https://example.com/two'])

Subscribers

People subscribed via source and target branches