Merge lp:~developer-ubuntu-com-dev/developer-ubuntu-com/show-gadgetsnap-images into lp:developer-ubuntu-com
- show-gadgetsnap-images
- Merge into stable
Proposed by
Daniel Holbach
Status: | Merged |
---|---|
Merged at revision: | 167 |
Proposed branch: | lp:~developer-ubuntu-com-dev/developer-ubuntu-com/show-gadgetsnap-images |
Merge into: | lp:developer-ubuntu-com |
Diff against target: |
321 lines (+208/-18) 8 files modified
developer_portal/templatetags/text_extras.py (+8/-0) store_data/cms_plugins.py (+20/-3) store_data/management/commands/update-gadget-snaps.py (+5/-1) store_data/migrations/0002_add_title_field.py (+58/-0) store_data/migrations/0003_add_website_field.py (+59/-0) store_data/models.py (+2/-0) templates/gadget_snap_list.html (+24/-14) templates/gadget_snap_shortlist.html (+32/-0) |
To merge this branch: | bzr merge lp:~developer-ubuntu-com-dev/developer-ubuntu-com/show-gadgetsnap-images |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel Holbach (community) | Approve | ||
Review via email: mp+277089@code.launchpad.net |
Commit message
Show gadget snap images (icon_url instead of screenshot_url) and display a more readable name.
Description of the change
To post a comment you must log in.
- 169. By Daniel Holbach
-
remove unnecessary blank line
- 170. By David Callé
-
Add shortlist CMS plugin for gadget snaps, layout fixes
- 171. By Daniel Holbach
-
simplify code and style generic-* snap names as well
- 172. By Daniel Holbach
-
use title field instead
- 173. By Daniel Holbach
-
fix -community name
- 174. By Daniel Holbach
-
add website field for store api
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'developer_portal/templatetags/text_extras.py' |
2 | --- developer_portal/templatetags/text_extras.py 2015-07-02 19:51:07 +0000 |
3 | +++ developer_portal/templatetags/text_extras.py 2015-11-10 14:53:00 +0000 |
4 | @@ -24,3 +24,11 @@ |
5 | @register.filter |
6 | def string(integer): |
7 | return str(integer) |
8 | + |
9 | +@register.filter |
10 | +def style_snap_name(snap_name): |
11 | + if snap_name.startswith('generic-'): |
12 | + return 'Generic {}'.format(snap_name.split('-')[1]) |
13 | + if snap_name.endswith('-community'): |
14 | + return snap_name.replace('-community', '').title() |
15 | + return snap_name.split('.')[0].title() |
16 | |
17 | === modified file 'store_data/cms_plugins.py' |
18 | --- store_data/cms_plugins.py 2015-07-02 15:43:26 +0000 |
19 | +++ store_data/cms_plugins.py 2015-11-10 14:53:00 +0000 |
20 | @@ -5,8 +5,10 @@ |
21 | from .models import GadgetSnap |
22 | |
23 | |
24 | -class GadgetSnapListPlugin(CMSPluginBase): |
25 | - name = _("Gadget Snap List Plugin") |
26 | +class GadgetSnapListPluginLarge(CMSPluginBase): |
27 | + # Keeping the name short to be able to differentiate them |
28 | + # in the editor dropdown |
29 | + name = _("Snap list - Gadget") |
30 | render_template = "gadget_snap_list.html" |
31 | text_enabled = True |
32 | |
33 | @@ -16,4 +18,19 @@ |
34 | }) |
35 | return context |
36 | |
37 | -plugin_pool.register_plugin(GadgetSnapListPlugin) |
38 | +plugin_pool.register_plugin(GadgetSnapListPluginLarge) |
39 | + |
40 | +class GadgetSnapListPluginSmall(CMSPluginBase): |
41 | + # Keeping the name short to be able to differentiate them |
42 | + # in the editor dropdown |
43 | + name = _("Snap shortlist - Gadget") |
44 | + render_template = "gadget_snap_shortlist.html" |
45 | + text_enabled = True |
46 | + |
47 | + def render(self, context, instance, placeholder): |
48 | + context.update({ |
49 | + 'gadget_snap_list': GadgetSnap.objects.all(), |
50 | + }) |
51 | + return context |
52 | + |
53 | +plugin_pool.register_plugin(GadgetSnapListPluginSmall) |
54 | |
55 | === modified file 'store_data/management/commands/update-gadget-snaps.py' |
56 | --- store_data/management/commands/update-gadget-snaps.py 2015-07-02 12:42:22 +0000 |
57 | +++ store_data/management/commands/update-gadget-snaps.py 2015-11-10 14:53:00 +0000 |
58 | @@ -20,7 +20,9 @@ |
59 | 'ratings_average': entry['ratings_average'], |
60 | 'alias': entry['alias'], 'price': entry['price'], |
61 | 'publisher': entry['publisher'], 'version': entry['version'], |
62 | - 'last_updated': now, 'description': entry['description']}) |
63 | + 'last_updated': now, 'description': entry['description'], |
64 | + 'title': entry['title'], 'website': entry.get('website', ''), |
65 | + }) |
66 | if not created: |
67 | gadget_snap.last_updated = now |
68 | gadget_snap.icon_url = entry['icon_url'] |
69 | @@ -30,6 +32,8 @@ |
70 | gadget_snap.publisher = entry['publisher'] |
71 | gadget_snap.version = entry['version'] |
72 | gadget_snap.description = entry['description'] |
73 | + gadget_snap.title = entry['title'] |
74 | + gadget_snap.website = entry.get('website', '') |
75 | gadget_snap.save() |
76 | for arch in entry['architecture']: |
77 | arch_ob, created = Architecture.objects.get_or_create(name=arch) |
78 | |
79 | === added file 'store_data/migrations/0002_add_title_field.py' |
80 | --- store_data/migrations/0002_add_title_field.py 1970-01-01 00:00:00 +0000 |
81 | +++ store_data/migrations/0002_add_title_field.py 2015-11-10 14:53:00 +0000 |
82 | @@ -0,0 +1,58 @@ |
83 | +# -*- coding: utf-8 -*- |
84 | +from south.utils import datetime_utils as datetime |
85 | +from south.db import db |
86 | +from south.v2 import SchemaMigration |
87 | +from django.db import models |
88 | + |
89 | + |
90 | +class Migration(SchemaMigration): |
91 | + |
92 | + def forwards(self, orm): |
93 | + # Adding field 'GadgetSnap.title' |
94 | + db.add_column(u'store_data_gadgetsnap', 'title', |
95 | + self.gf('django.db.models.fields.CharField')(max_length=250, null=True, blank=True), |
96 | + keep_default=False) |
97 | + |
98 | + |
99 | + def backwards(self, orm): |
100 | + # Deleting field 'GadgetSnap.title' |
101 | + db.delete_column(u'store_data_gadgetsnap', 'title') |
102 | + |
103 | + |
104 | + models = { |
105 | + u'store_data.architecture': { |
106 | + 'Meta': {'object_name': 'Architecture'}, |
107 | + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
108 | + 'name': ('django.db.models.fields.CharField', [], {'max_length': '10'}) |
109 | + }, |
110 | + u'store_data.gadgetsnap': { |
111 | + 'Meta': {'object_name': 'GadgetSnap'}, |
112 | + 'alias': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), |
113 | + 'architecture': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Architecture']", 'symmetrical': 'False'}), |
114 | + 'description': ('django.db.models.fields.TextField', [], {'max_length': '5000'}), |
115 | + 'icon_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
116 | + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
117 | + 'last_updated': ('django.db.models.fields.DateTimeField', [], {}), |
118 | + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
119 | + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}), |
120 | + 'publisher': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
121 | + 'ratings_average': ('django.db.models.fields.DecimalField', [], {'max_digits': '2', 'decimal_places': '1'}), |
122 | + 'release': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Release']", 'symmetrical': 'False'}), |
123 | + 'screenshot_url': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.ScreenshotURL']", 'symmetrical': 'False'}), |
124 | + 'store_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
125 | + 'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), |
126 | + 'version': ('django.db.models.fields.CharField', [], {'max_length': '25'}) |
127 | + }, |
128 | + u'store_data.release': { |
129 | + 'Meta': {'object_name': 'Release'}, |
130 | + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
131 | + 'name': ('django.db.models.fields.CharField', [], {'max_length': '25'}) |
132 | + }, |
133 | + u'store_data.screenshoturl': { |
134 | + 'Meta': {'object_name': 'ScreenshotURL'}, |
135 | + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
136 | + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) |
137 | + } |
138 | + } |
139 | + |
140 | + complete_apps = ['store_data'] |
141 | \ No newline at end of file |
142 | |
143 | === added file 'store_data/migrations/0003_add_website_field.py' |
144 | --- store_data/migrations/0003_add_website_field.py 1970-01-01 00:00:00 +0000 |
145 | +++ store_data/migrations/0003_add_website_field.py 2015-11-10 14:53:00 +0000 |
146 | @@ -0,0 +1,59 @@ |
147 | +# -*- coding: utf-8 -*- |
148 | +from south.utils import datetime_utils as datetime |
149 | +from south.db import db |
150 | +from south.v2 import SchemaMigration |
151 | +from django.db import models |
152 | + |
153 | + |
154 | +class Migration(SchemaMigration): |
155 | + |
156 | + def forwards(self, orm): |
157 | + # Adding field 'GadgetSnap.website' |
158 | + db.add_column(u'store_data_gadgetsnap', 'website', |
159 | + self.gf('django.db.models.fields.URLField')(default='', max_length=200, blank=True), |
160 | + keep_default=False) |
161 | + |
162 | + |
163 | + def backwards(self, orm): |
164 | + # Deleting field 'GadgetSnap.website' |
165 | + db.delete_column(u'store_data_gadgetsnap', 'website') |
166 | + |
167 | + |
168 | + models = { |
169 | + u'store_data.architecture': { |
170 | + 'Meta': {'object_name': 'Architecture'}, |
171 | + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
172 | + 'name': ('django.db.models.fields.CharField', [], {'max_length': '10'}) |
173 | + }, |
174 | + u'store_data.gadgetsnap': { |
175 | + 'Meta': {'object_name': 'GadgetSnap'}, |
176 | + 'alias': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), |
177 | + 'architecture': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Architecture']", 'symmetrical': 'False'}), |
178 | + 'description': ('django.db.models.fields.TextField', [], {'max_length': '5000'}), |
179 | + 'icon_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
180 | + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
181 | + 'last_updated': ('django.db.models.fields.DateTimeField', [], {}), |
182 | + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
183 | + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}), |
184 | + 'publisher': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
185 | + 'ratings_average': ('django.db.models.fields.DecimalField', [], {'max_digits': '2', 'decimal_places': '1'}), |
186 | + 'release': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Release']", 'symmetrical': 'False'}), |
187 | + 'screenshot_url': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.ScreenshotURL']", 'symmetrical': 'False'}), |
188 | + 'store_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
189 | + 'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), |
190 | + 'version': ('django.db.models.fields.CharField', [], {'max_length': '25'}), |
191 | + 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) |
192 | + }, |
193 | + u'store_data.release': { |
194 | + 'Meta': {'object_name': 'Release'}, |
195 | + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
196 | + 'name': ('django.db.models.fields.CharField', [], {'max_length': '25'}) |
197 | + }, |
198 | + u'store_data.screenshoturl': { |
199 | + 'Meta': {'object_name': 'ScreenshotURL'}, |
200 | + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
201 | + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) |
202 | + } |
203 | + } |
204 | + |
205 | + complete_apps = ['store_data'] |
206 | \ No newline at end of file |
207 | |
208 | === modified file 'store_data/models.py' |
209 | --- store_data/models.py 2015-07-02 08:49:35 +0000 |
210 | +++ store_data/models.py 2015-11-10 14:53:00 +0000 |
211 | @@ -17,6 +17,7 @@ |
212 | icon_url = models.URLField(blank=True) |
213 | release = models.ManyToManyField(Release) |
214 | name = models.CharField(max_length=100) |
215 | + title = models.CharField(max_length=250, blank=True, null=True) |
216 | ratings_average = models.DecimalField(max_digits=2, decimal_places=1) |
217 | alias = models.CharField(max_length=100, blank=True, null=True) |
218 | price = models.DecimalField(max_digits=5, decimal_places=2) |
219 | @@ -27,3 +28,4 @@ |
220 | last_updated = models.DateTimeField() |
221 | description = models.TextField(max_length=5000) |
222 | screenshot_url = models.ManyToManyField(ScreenshotURL) |
223 | + website = models.URLField(blank=True) |
224 | |
225 | === modified file 'templates/gadget_snap_list.html' |
226 | --- templates/gadget_snap_list.html 2015-07-03 08:00:09 +0000 |
227 | +++ templates/gadget_snap_list.html 2015-11-10 14:53:00 +0000 |
228 | @@ -1,32 +1,42 @@ |
229 | {% load i18n static text_extras %} |
230 | |
231 | -<div class="row equal-height no-border"> |
232 | - {% for snap in gadget_snap_list %} |
233 | - {% if gadget_snap_list|index:snap|divisibleby:3 %} |
234 | - <div class="left four-col last-col box"> |
235 | +<div class="no-border"> |
236 | + {% for snap in gadget_snap_list %} |
237 | + {% if gadget_snap_list|index:snap|divisibleby:1 %} |
238 | + <div class="left twelve-col last-col box"> |
239 | {% else %} |
240 | - <div class="left four-col box"> |
241 | + <div class="left twelve-col box"> |
242 | {% endif %} |
243 | - {% if snap.screenshot_url.0.url %} |
244 | - <p><img src="{{ snap.screenshot_url.0.url }}"/></p> |
245 | + {% if snap.icon_url %} |
246 | + <div class="two-col no-margin-bottom"> |
247 | + <img src="{{ snap.icon_url }}"/> |
248 | + </div> |
249 | {% else %} |
250 | {% with 0|randint:10|string as rand %} |
251 | {% with "img/boards/noboard-"|add:rand|add:".png" as noboard %} |
252 | - <p><img src="{% static noboard %}"/></p> |
253 | + <div class="two-col no-margin-bottom"> |
254 | + <img src="{% static noboard %}"/> |
255 | + </div> |
256 | {% endwith %} |
257 | {% endwith %} |
258 | {% endif %} |
259 | - <h3>{{ snap.alias|default_if_none:snap.name }}</h3> |
260 | + <div class="ten-col last-col no-margin-bottom"> |
261 | + <h3> |
262 | + {% with snap_name=snap.title|default_if_none:snap.name %} |
263 | + {{ snap_name|style_snap_name }} |
264 | + {% endwith %} |
265 | + </h3> |
266 | {% if snap.description|length > 180 %} |
267 | <p>{{ snap.description|truncatechars:180 }}</p> |
268 | {% else %} |
269 | <p>{% autoescape off %}{{ snap.description|html_links }}{% endautoescape %}</p> |
270 | {% endif %} |
271 | - <ul class="list-ubuntu"> |
272 | - <li> |
273 | - <a href="https://developer.ubuntu.com/en/snappy/start/">{% trans "Install Snappy on this device" %}</a> |
274 | - </li> |
275 | - </ul> |
276 | + <ul class="list-ubuntu"> |
277 | + <li> |
278 | + <a href="https://developer.ubuntu.com/en/snappy/start/">{% trans "Install Snappy on this device" %}</a> |
279 | + </li> |
280 | + </ul> |
281 | + </div> |
282 | </div> |
283 | {% endfor %} |
284 | </div> |
285 | |
286 | === added file 'templates/gadget_snap_shortlist.html' |
287 | --- templates/gadget_snap_shortlist.html 1970-01-01 00:00:00 +0000 |
288 | +++ templates/gadget_snap_shortlist.html 2015-11-10 14:53:00 +0000 |
289 | @@ -0,0 +1,32 @@ |
290 | +{% load i18n static text_extras %} |
291 | + |
292 | +<div class="equal-height no-border"> |
293 | + {% for snap in gadget_snap_list|slice:"6" %} |
294 | + {% if gadget_snap_list|index:snap|divisibleby:6 %} |
295 | + <div class="two-col last-col box"> |
296 | + {% else %} |
297 | + <div class="two-col box"> |
298 | + {% endif %} |
299 | + {% if snap.icon_url %} |
300 | + <div class="two-col"> |
301 | + <img src="{{ snap.icon_url }}"/> |
302 | + </div> |
303 | + {% else %} |
304 | + {% with 0|randint:10|string as rand %} |
305 | + {% with "img/boards/noboard-"|add:rand|add:".png" as noboard %} |
306 | + <div class="two-col"> |
307 | + <img src="{% static noboard %}"/> |
308 | + </div> |
309 | + {% endwith %} |
310 | + {% endwith %} |
311 | + {% endif %} |
312 | + <div class="two-col no-margin-bottom"> |
313 | + <h4> |
314 | + {% with snap_name=snap.title|default_if_none:snap.name %} |
315 | + {{ snap_name|style_snap_name }} |
316 | + {% endwith %} |
317 | + </h4> |
318 | + </div> |
319 | + </div> |
320 | + {% endfor %} |
321 | +</div> |
Good to go!