Merge lp:~developer-ubuntu-com-dev/developer-ubuntu-com/1470715 into lp:developer-ubuntu-com

Proposed by Daniel Holbach on 2015-08-19
Status: Merged
Merged at revision: 169
Proposed branch: lp:~developer-ubuntu-com-dev/developer-ubuntu-com/1470715
Merge into: lp:developer-ubuntu-com
Diff against target: 1489 lines (+206/-790)
23 files modified
Makefile (+30/-6)
README.md (+2/-2)
api_docs/migrations/0001_initial.py (+0/-186)
developer_portal/admin.py (+3/-1)
developer_portal/blog/views.py (+3/-1)
developer_portal/management/commands/import-external-docs-branches.py (+10/-6)
developer_portal/management/commands/initdb.py (+1/-1)
developer_portal/migrations/0001_initial.py (+0/-20)
developer_portal/migrations/0002_add_rawhtml_plugin.py (+0/-53)
developer_portal/migrations/0003_add_external_docs_branches.py (+0/-62)
developer_portal/migrations/0004_auto__add_seoextension.py (+0/-126)
developer_portal/settings.py (+42/-22)
developer_portal/urls.py (+1/-1)
requirements.txt (+38/-40)
service/urls.py (+7/-7)
store_data/migrations/0001_initial.py (+62/-133)
store_data/migrations/0002_add_title_field.py (+0/-58)
store_data/migrations/0003_add_website_field.py (+0/-59)
templates/zinnia/_entry_detail_base.html (+2/-2)
templates/zinnia/base.html (+1/-1)
templates/zinnia/category_list.html (+2/-1)
templates/zinnia/entry_detail_base.html (+1/-1)
templates/zinnia/entry_list.html (+1/-1)
To merge this branch: bzr merge lp:~developer-ubuntu-com-dev/developer-ubuntu-com/1470715
Reviewer Review Type Date Requested Status
Daniel Holbach (community) Approve on 2015-11-17
David Callé 2015-08-19 Pending
Michael Hall 2015-08-19 Pending
Review via email: mp+268471@code.launchpad.net

Description of the Change

Migration notes:
 - Use lp:developer-ubuntu-com as a basis, if it's not an instance with live data, make sure you've run all steps from README.md

 - Run:
   ./env/bin/python manage.py cms delete_orphaned_plugins
   ./env/bin/python manage.py cms fix-mptt

 - merge this branch

 - Run:
   make update-1470715
   ./env/bin/python manage.py runserver

To post a comment you must log in.
Daniel Holbach (dholbach) wrote :

Ok, this might need some work if we fully plan to move off of mptt - where is templates/zinnia/category_list.html used?

daniel@daydream:~/dev/sites/developer-ubuntu-com$ bzr grep mptt
developer_portal/settings.py: 'mptt', #utilities for implementing a modified pre-order traversal tree
requirements.txt:django-mptt==0.6.1
templates/zinnia/category_list.html:{% load i18n mptt_tags %}
daniel@daydream:~/dev/sites/developer-ubuntu-com$

review: Needs Information
Michael Hall (mhall119) wrote :

> Ok, this might need some work if we fully plan to move off of mptt - where is
> templates/zinnia/category_list.html used?
>

I believe it's used here: https://developer.ubuntu.com/en/blog/categories/

Daniel Holbach (dholbach) wrote :

I removed the mptt references, they're not required for our app. zinnia still uses mptt internally though.

163. By Daniel Holbach on 2015-11-02

merged trunk

164. By David Callé on 2015-11-02

Fix importer commands

165. By David Callé on 2015-11-02

Fix diverged branches

166. By Daniel Holbach on 2015-11-02

update various packages

167. By Daniel Holbach on 2015-11-02

django 1.8.6 is not on pypi yet

168. By Daniel Holbach on 2015-11-02

fix djangocms_link migrations path

169. By Daniel Holbach on 2015-11-02

@transaction.commit_on_success now is @transaction.atomic (https://stackoverflow.com/questions/21861207/)

170. By Daniel Holbach on 2015-11-04

merge trunk

Daniel Holbach (dholbach) wrote :

Markdown importer works after migration in sqlite scenario using these steps: http://pastebin.ubuntu.com/13101183/

Daniel Holbach (dholbach) wrote :

The migration using http://pastebin.ubuntu.com/13101380/ (postgres) works fine, but the article tree there is broken too. Symptoms: unpublished articles, parent pages can't be found → sys.exit. Maybe the code in django-cms changed and we need to use a new API?

171. By Daniel Holbach on 2015-11-06

merge trunk

172. By Daniel Holbach on 2015-11-06

update permissions model changes

173. By Daniel Holbach on 2015-11-16

merge trunk

174. By Daniel Holbach on 2015-11-16

update migrations accordingly

175. By Daniel Holbach on 2015-11-17

remove non-existing migration dependency

176. By Daniel Holbach on 2015-11-17

update Makefile target for migration

177. By Daniel Holbach on 2015-11-17

update pip components and migration script

178. By Daniel Holbach on 2015-11-17

avoid breakage with some newer components

Daniel Holbach (dholbach) wrote :

With this we are not 100% up to date:

daniel@daydream:~/dev/sites/developer-ubuntu-com$ ./env/bin/pip list -o
argparse (Current: 1.2.1 Latest: 1.4.0)
→ Pillow (Current: 2.9.0 Latest: 3.0.0)
pip (Current: 1.5.6 Latest: 7.1.2)
→ django-cms (Current: 3.1.2 Latest: 3.1.3)
html5lib (Current: 0.999 Latest: 0.9999999)
Django-Select2 (Current: 4.3.2 Latest: 5.3.0)
→ Django (Current: 1.8.5 Latest: 1.8.6)
daniel@daydream:~/dev/sites/developer-ubuntu-com$

I ran into some issues with the newest versions (components marked with '→'), so I downgraded them. The other components are just pulled in by others.

179. By Daniel Holbach on 2015-11-17

remove comments

Daniel Holbach (dholbach) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'Makefile'
2--- Makefile 2015-10-30 10:11:17 +0000
3+++ Makefile 2015-11-17 14:32:37 +0000
4@@ -3,9 +3,34 @@
5 SOURCE_DIR := $(PWD)
6 REVNO := `bzr revno`
7
8+update-1470715:
9+ ./env/bin/pip install -r requirements.txt --upgrade
10+ ./env/bin/pip uninstall -yq South
11+ ./env/bin/pip uninstall -yq python-keystoneclient
12+ ./env/bin/python manage.py migrate --fake admin
13+ ./env/bin/python manage.py migrate --fake sessions
14+ ./env/bin/python manage.py migrate --fake sites
15+ ./env/bin/python manage.py migrate --fake cms 0001_initial
16+ ./env/bin/python manage.py migrate --fake cms 0002_auto_20140816_1918
17+ ./env/bin/python manage.py migrate --fake cmsplugin_zinnia
18+ ./env/bin/python manage.py migrate --fake djangocms_link 0001_initial
19+ ./env/bin/python manage.py migrate --fake djangocms_picture
20+ ./env/bin/python manage.py migrate --fake djangocms_snippet 0001_initial
21+ ./env/bin/python manage.py migrate --fake djangocms_text_ckeditor
22+ ./env/bin/python manage.py migrate --fake djangocms_video
23+ ./env/bin/python manage.py migrate --fake django_comments 0001_initial
24+ ./env/bin/python manage.py migrate --fake menus
25+ ./env/bin/python manage.py migrate --fake reversion 0001_initial
26+ ./env/bin/python manage.py migrate cms
27+ ./env/bin/python manage.py migrate --fake developer_portal
28+ ./env/bin/python manage.py migrate --fake api_docs
29+ ./env/bin/python manage.py migrate --fake django_openid_auth 0001_initial
30+ ./env/bin/python manage.py migrate --fake store_data 0001_initial
31+ ./env/bin/python manage.py migrate
32+
33 update-instance:
34 @echo "Nothing to do for the app";
35-
36+
37 update-common:
38 @echo "Updating database"
39 if [ $(DATABASE_URL) ]; then $(MAKE) initdb; fi
40@@ -45,8 +70,8 @@
41 @python manage.py init_apidocs --settings charm_settings
42
43 syncdb:
44- @echo "Syncing database"
45- @python manage.py syncdb --noinput --migrate --settings charm_settings
46+ @echo "Syncing/migrating database"
47+ @python manage.py migrate --noinput --settings charm_settings
48
49 collectstatic: collectstatic.done
50 collectstatic.done:
51@@ -63,7 +88,7 @@
52 rm -rf pip-cache
53 bzr branch lp:~developer-ubuntu-com-dev/developer-ubuntu-com/dependencies pip-cache
54 pip install --exists-action=w --download pip-cache/ -r requirements.txt
55- bzr add pip-cache/*
56+ bzr add pip-cache/*
57 bzr commit pip-cache/ -m 'automatically updated devportal requirements'
58 bzr push --directory pip-cache lp:~developer-ubuntu-com-dev/developer-ubuntu-com/dependencies
59 bzr revno pip-cache > pip-cache-revno.txt
60@@ -82,7 +107,7 @@
61
62 db.sqlite3: env
63 @echo "Initializing database"
64- @./env/bin/python manage.py syncdb --noinput --migrate
65+ @./env/bin/python manage.py migrate --noinput
66 @./env/bin/python manage.py initdb
67 @./env/bin/python manage.py init_apidocs
68
69@@ -111,4 +136,3 @@
70 @rm ../developer_portal.tar.gz
71 @$(MAKE) tarball;
72 @echo build_label=`bzr revno`
73-
74
75=== modified file 'README.md'
76--- README.md 2015-10-01 13:48:23 +0000
77+++ README.md 2015-11-17 14:32:37 +0000
78@@ -4,7 +4,7 @@
79 2. Change directory to the branch location
80 3. Install the apt requirements:
81
82- sudo apt install python-dev python-django python-django-south python-psycopg2 pwgen virtualenv
83+ sudo apt install python-dev python-django python-psycopg2 pwgen virtualenv
84
85 4. Setup your local dev environment:
86
87@@ -27,7 +27,7 @@
88 ./env/bin/python manage.py flush --noinput
89 echo "delete from auth_permission;" | ./env/bin/python manage.py dbshell
90 ./env/bin/python manage.py loaddata ../dbbackup/dbdump.json
91- ./env/bin/python manage.py syncdb --noinput --all
92+ ./env/bin/python manage.py migrate --noinput
93 ./env/bin/python manage.py initdb
94
95 # Managing translations
96
97=== added file 'api_docs/migrations/0001_initial.py'
98--- api_docs/migrations/0001_initial.py 1970-01-01 00:00:00 +0000
99+++ api_docs/migrations/0001_initial.py 2015-11-17 14:32:37 +0000
100@@ -0,0 +1,139 @@
101+# -*- coding: utf-8 -*-
102+from __future__ import unicode_literals
103+
104+from django.db import migrations, models
105+
106+
107+class Migration(migrations.Migration):
108+
109+ dependencies = [
110+ ]
111+
112+ operations = [
113+ migrations.CreateModel(
114+ name='Element',
115+ fields=[
116+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
117+ ('name', models.CharField(max_length=64)),
118+ ('description', models.CharField(default=b'', max_length=256, blank=True)),
119+ ('fullname', models.CharField(max_length=128)),
120+ ('keywords', models.CharField(default=b'', max_length=256, blank=True)),
121+ ('data', models.TextField(default=b'', blank=True)),
122+ ('source_file', models.CharField(max_length=128, null=True, blank=True)),
123+ ('source_format', models.CharField(max_length=32, null=True, blank=True)),
124+ ],
125+ options={
126+ 'ordering': ('name',),
127+ 'verbose_name': 'Rendered Element',
128+ 'verbose_name_plural': 'Rendered Elements',
129+ },
130+ ),
131+ migrations.CreateModel(
132+ name='Language',
133+ fields=[
134+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
135+ ('name', models.CharField(max_length=64)),
136+ ('slug', models.CharField(max_length=64)),
137+ ],
138+ ),
139+ migrations.CreateModel(
140+ name='Namespace',
141+ fields=[
142+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
143+ ('name', models.CharField(max_length=64)),
144+ ('display_name', models.CharField(default=b'', max_length=64, blank=True)),
145+ ('data', models.TextField(default=b'', blank=True)),
146+ ('source_file', models.CharField(max_length=128, null=True, blank=True)),
147+ ('source_format', models.CharField(max_length=32, null=True, blank=True)),
148+ ],
149+ options={
150+ 'ordering': ('name',),
151+ },
152+ ),
153+ migrations.CreateModel(
154+ name='Page',
155+ fields=[
156+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
157+ ('slug', models.CharField(max_length=64)),
158+ ('title', models.CharField(max_length=64)),
159+ ('description', models.CharField(default=b'', max_length=256, blank=True)),
160+ ('fullname', models.CharField(max_length=128)),
161+ ('keywords', models.CharField(default=b'', max_length=256, blank=True)),
162+ ('data', models.TextField(default=b'', blank=True)),
163+ ('source_file', models.CharField(max_length=128, null=True, blank=True)),
164+ ('source_format', models.CharField(max_length=32, null=True, blank=True)),
165+ ('order_index', models.PositiveIntegerField(default=0, blank=True)),
166+ ('namespace', models.ForeignKey(blank=True, to='api_docs.Namespace', null=True)),
167+ ],
168+ options={
169+ 'ordering': ('order_index',),
170+ 'verbose_name': 'Rendered Page',
171+ 'verbose_name_plural': 'Rendered Pages',
172+ },
173+ ),
174+ migrations.CreateModel(
175+ name='Section',
176+ fields=[
177+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
178+ ('name', models.CharField(max_length=64)),
179+ ('description', models.TextField(null=True, blank=True)),
180+ ],
181+ ),
182+ migrations.CreateModel(
183+ name='Topic',
184+ fields=[
185+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
186+ ('name', models.CharField(max_length=64)),
187+ ('slug', models.CharField(max_length=64)),
188+ ],
189+ ),
190+ migrations.CreateModel(
191+ name='Version',
192+ fields=[
193+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
194+ ('name', models.CharField(max_length=64)),
195+ ('slug', models.CharField(max_length=64)),
196+ ('language', models.ForeignKey(to='api_docs.Language', null=True)),
197+ ],
198+ ),
199+ migrations.AddField(
200+ model_name='section',
201+ name='topic_version',
202+ field=models.ForeignKey(to='api_docs.Version'),
203+ ),
204+ migrations.AddField(
205+ model_name='page',
206+ name='section',
207+ field=models.ForeignKey(to='api_docs.Section'),
208+ ),
209+ migrations.AddField(
210+ model_name='namespace',
211+ name='platform_section',
212+ field=models.ForeignKey(to='api_docs.Section'),
213+ ),
214+ migrations.AddField(
215+ model_name='language',
216+ name='current_version',
217+ field=models.ForeignKey(related_name='current_for_lang', blank=True, to='api_docs.Version', null=True),
218+ ),
219+ migrations.AddField(
220+ model_name='language',
221+ name='development_version',
222+ field=models.ForeignKey(related_name='development_for_lang', blank=True, to='api_docs.Version', null=True),
223+ ),
224+ migrations.AddField(
225+ model_name='language',
226+ name='topic',
227+ field=models.ForeignKey(to='api_docs.Topic'),
228+ ),
229+ migrations.AddField(
230+ model_name='element',
231+ name='namespace',
232+ field=models.ForeignKey(blank=True, to='api_docs.Namespace', null=True),
233+ ),
234+ migrations.AddField(
235+ model_name='element',
236+ name='section',
237+ field=models.ForeignKey(to='api_docs.Section'),
238+ ),
239+ ]
240
241=== removed file 'api_docs/migrations/0001_initial.py'
242--- api_docs/migrations/0001_initial.py 2015-02-05 14:24:04 +0000
243+++ api_docs/migrations/0001_initial.py 1970-01-01 00:00:00 +0000
244@@ -1,186 +0,0 @@
245-# -*- coding: utf-8 -*-
246-from south.utils import datetime_utils as datetime
247-from south.db import db
248-from south.v2 import SchemaMigration
249-from django.db import models
250-
251-
252-class Migration(SchemaMigration):
253-
254- def forwards(self, orm):
255- # Adding model 'Topic'
256- db.create_table(u'api_docs_topic', (
257- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
258- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
259- ('slug', self.gf('django.db.models.fields.CharField')(max_length=64)),
260- ))
261- db.send_create_signal(u'api_docs', ['Topic'])
262-
263- # Adding model 'Language'
264- db.create_table(u'api_docs_language', (
265- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
266- ('topic', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api_docs.Topic'])),
267- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
268- ('slug', self.gf('django.db.models.fields.CharField')(max_length=64)),
269- ('current_version', self.gf('django.db.models.fields.related.ForeignKey')(related_name='current_for_lang', null=True, to=orm['api_docs.Version'])),
270- ('development_version', self.gf('django.db.models.fields.related.ForeignKey')(related_name='development_for_lang', null=True, to=orm['api_docs.Version'])),
271- ))
272- db.send_create_signal(u'api_docs', ['Language'])
273-
274- # Adding model 'Version'
275- db.create_table(u'api_docs_version', (
276- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
277- ('language', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api_docs.Language'], null=True)),
278- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
279- ('slug', self.gf('django.db.models.fields.CharField')(max_length=64)),
280- ))
281- db.send_create_signal(u'api_docs', ['Version'])
282-
283- # Adding model 'Section'
284- db.create_table(u'api_docs_section', (
285- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
286- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
287- ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
288- ('topic_version', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api_docs.Version'])),
289- ))
290- db.send_create_signal(u'api_docs', ['Section'])
291-
292- # Adding model 'Namespace'
293- db.create_table(u'api_docs_namespace', (
294- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
295- ('platform_section', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api_docs.Section'])),
296- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
297- ('display_name', self.gf('django.db.models.fields.CharField')(default='', max_length=64, blank=True)),
298- ('data', self.gf('django.db.models.fields.TextField')(default='', blank=True)),
299- ('source_file', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),
300- ('source_format', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
301- ))
302- db.send_create_signal(u'api_docs', ['Namespace'])
303-
304- # Adding model 'Element'
305- db.create_table(u'api_docs_element', (
306- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
307- ('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
308- ('description', self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True)),
309- ('namespace', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api_docs.Namespace'], null=True, blank=True)),
310- ('section', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api_docs.Section'])),
311- ('fullname', self.gf('django.db.models.fields.CharField')(max_length=128)),
312- ('keywords', self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True)),
313- ('data', self.gf('django.db.models.fields.TextField')(default='', blank=True)),
314- ('source_file', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),
315- ('source_format', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
316- ))
317- db.send_create_signal(u'api_docs', ['Element'])
318-
319- # Adding model 'Page'
320- db.create_table(u'api_docs_page', (
321- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
322- ('slug', self.gf('django.db.models.fields.CharField')(max_length=64)),
323- ('title', self.gf('django.db.models.fields.CharField')(max_length=64)),
324- ('description', self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True)),
325- ('namespace', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api_docs.Namespace'], null=True, blank=True)),
326- ('section', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api_docs.Section'])),
327- ('fullname', self.gf('django.db.models.fields.CharField')(max_length=128)),
328- ('keywords', self.gf('django.db.models.fields.CharField')(default='', max_length=256, blank=True)),
329- ('data', self.gf('django.db.models.fields.TextField')(default='', blank=True)),
330- ('source_file', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),
331- ('source_format', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
332- ('order_index', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)),
333- ))
334- db.send_create_signal(u'api_docs', ['Page'])
335-
336-
337- def backwards(self, orm):
338- # Deleting model 'Topic'
339- db.delete_table(u'api_docs_topic')
340-
341- # Deleting model 'Language'
342- db.delete_table(u'api_docs_language')
343-
344- # Deleting model 'Version'
345- db.delete_table(u'api_docs_version')
346-
347- # Deleting model 'Section'
348- db.delete_table(u'api_docs_section')
349-
350- # Deleting model 'Namespace'
351- db.delete_table(u'api_docs_namespace')
352-
353- # Deleting model 'Element'
354- db.delete_table(u'api_docs_element')
355-
356- # Deleting model 'Page'
357- db.delete_table(u'api_docs_page')
358-
359-
360- models = {
361- u'api_docs.element': {
362- 'Meta': {'ordering': "('name',)", 'object_name': 'Element'},
363- 'data': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
364- 'description': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}),
365- 'fullname': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
366- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
367- 'keywords': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}),
368- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
369- 'namespace': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api_docs.Namespace']", 'null': 'True', 'blank': 'True'}),
370- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api_docs.Section']"}),
371- 'source_file': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
372- 'source_format': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'})
373- },
374- u'api_docs.language': {
375- 'Meta': {'object_name': 'Language'},
376- 'current_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'current_for_lang'", 'null': 'True', 'to': u"orm['api_docs.Version']"}),
377- 'development_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'development_for_lang'", 'null': 'True', 'to': u"orm['api_docs.Version']"}),
378- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
379- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
380- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
381- 'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api_docs.Topic']"})
382- },
383- u'api_docs.namespace': {
384- 'Meta': {'ordering': "('name',)", 'object_name': 'Namespace'},
385- 'data': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
386- 'display_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64', 'blank': 'True'}),
387- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
388- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
389- 'platform_section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api_docs.Section']"}),
390- 'source_file': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
391- 'source_format': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'})
392- },
393- u'api_docs.page': {
394- 'Meta': {'ordering': "('order_index',)", 'object_name': 'Page'},
395- 'data': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
396- 'description': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}),
397- 'fullname': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
398- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
399- 'keywords': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}),
400- 'namespace': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api_docs.Namespace']", 'null': 'True', 'blank': 'True'}),
401- 'order_index': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}),
402- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api_docs.Section']"}),
403- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
404- 'source_file': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
405- 'source_format': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
406- 'title': ('django.db.models.fields.CharField', [], {'max_length': '64'})
407- },
408- u'api_docs.section': {
409- 'Meta': {'object_name': 'Section'},
410- 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
411- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
412- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
413- 'topic_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api_docs.Version']"})
414- },
415- u'api_docs.topic': {
416- 'Meta': {'object_name': 'Topic'},
417- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
418- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
419- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '64'})
420- },
421- u'api_docs.version': {
422- 'Meta': {'object_name': 'Version'},
423- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
424- 'language': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api_docs.Language']", 'null': 'True'}),
425- 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
426- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '64'})
427- }
428- }
429-
430- complete_apps = ['api_docs']
431\ No newline at end of file
432
433=== modified file 'developer_portal/admin.py'
434--- developer_portal/admin.py 2015-10-21 14:41:23 +0000
435+++ developer_portal/admin.py 2015-11-17 14:32:37 +0000
436@@ -12,8 +12,10 @@
437
438
439 def import_selected_external_docs_branches(modeladmin, request, queryset):
440+ branches = []
441 for branch in queryset:
442- call_command('import-external-docs-branches', branch.docs_namespace)
443+ branches.append(branch.docs_namespace)
444+ call_command('import-external-docs-branches', *branches)
445 import_selected_external_docs_branches.short_description = \
446 "Import selected branches"
447
448
449=== modified file 'developer_portal/blog/views.py'
450--- developer_portal/blog/views.py 2015-01-14 22:38:55 +0000
451+++ developer_portal/blog/views.py 2015-11-17 14:32:37 +0000
452@@ -35,7 +35,9 @@
453 return super(MultiLangEntryIndex, self).get(request, *args, **kwargs)
454
455 def get_dated_queryset(self, ordering=None, **lookup):
456- return super(MultiLangEntryIndex, self).get_dated_queryset(ordering, **lookup).filter(categories__slug=self.language)
457+ if ordering:
458+ return super(MultiLangEntryIndex, self).get_dated_queryset(**lookup).filter(categories__slug=self.language).order_by(ordering)
459+ return super(MultiLangEntryIndex, self).get_dated_queryset(**lookup).filter(categories__slug=self.language)
460
461 class MultiLangEntryYear(MultiLangMixin, EntryYear):
462 def get(self, request, *args, **kwargs):
463
464=== modified file 'developer_portal/management/commands/import-external-docs-branches.py'
465--- developer_portal/management/commands/import-external-docs-branches.py 2015-11-06 09:46:58 +0000
466+++ developer_portal/management/commands/import-external-docs-branches.py 2015-11-17 14:32:37 +0000
467@@ -33,7 +33,7 @@
468 def remove_page(self, page_id):
469 self.removed_pages += [page_id]
470
471- @transaction.commit_on_success()
472+ @transaction.atomic()
473 def run(self):
474 for added_page in self.added_pages:
475 page = get_or_create_page(**added_page)
476@@ -44,7 +44,7 @@
477 created_by="script").delete()
478
479 # https://stackoverflow.com/questions/33284171/
480- call_command('cms', 'fix-mptt')
481+ call_command('cms', 'fix-tree')
482
483
484 class MarkdownFile:
485@@ -353,13 +353,17 @@
486 class Command(BaseCommand):
487 help = "Import external branches for documentation."
488
489+ def add_arguments(self, parser):
490+ parser.add_argument('branches', nargs='*')
491+
492 def handle(*args, **options):
493 logging.basicConfig(
494 level=logging.ERROR,
495 format='%(asctime)s %(levelname)-8s %(message)s',
496 datefmt='%F %T')
497- if len(args) < 2 or args[1] == "all":
498- selection = '.*'
499+ branches = options['branches']
500+ if not branches:
501+ import_branches('.*')
502 else:
503- selection = args[1]
504- import_branches(selection)
505+ for b in branches:
506+ import_branches(b)
507
508=== modified file 'developer_portal/management/commands/initdb.py'
509--- developer_portal/management/commands/initdb.py 2015-06-23 10:54:49 +0000
510+++ developer_portal/management/commands/initdb.py 2015-11-17 14:32:37 +0000
511@@ -53,7 +53,7 @@
512 if hasattr(settings, 'EDITOR_GROUP') and settings.EDITOR_GROUP != "":
513 print "Configuring "+settings.EDITOR_GROUP+" group."
514 editors, created = PageUserGroup.objects.get_or_create(name=settings.EDITOR_GROUP, defaults={'created_by': admin})
515- page_perms = Permission.objects.filter(content_type__app_label='cms', content_type__name='page')
516+ page_perms = Permission.objects.filter(content_type__app_label='cms', content_type__model='page')
517 editors.permissions.add(*list(page_perms))
518
519 print "Configuring global permissions for group."
520
521=== added file 'developer_portal/migrations/0001_initial.py'
522--- developer_portal/migrations/0001_initial.py 1970-01-01 00:00:00 +0000
523+++ developer_portal/migrations/0001_initial.py 2015-11-17 14:32:37 +0000
524@@ -0,0 +1,45 @@
525+# -*- coding: utf-8 -*-
526+from __future__ import unicode_literals
527+
528+from django.db import migrations, models
529+
530+
531+class Migration(migrations.Migration):
532+
533+ dependencies = [
534+ ]
535+
536+ operations = [
537+ migrations.CreateModel(
538+ name='ExternalDocsBranch',
539+ fields=[
540+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
541+ ('lp_origin', models.CharField(help_text='External branch location, ie: lp:snappy/15.04 or https://github.com/ubuntu-core/snappy.git', max_length=200)),
542+ ('docs_namespace', models.CharField(help_text='Path alias we want to use for the docs, ie "snappy/guides/15.04" or "snappy/guides/latest", etc.', max_length=120)),
543+ ('index_doc', models.CharField(help_text='File name of doc to be used as index document, ie "intro.md"', max_length=120, blank=True)),
544+ ],
545+ ),
546+ migrations.CreateModel(
547+ name='RawHtml',
548+ fields=[
549+ ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
550+ ('body', models.TextField(verbose_name='body')),
551+ ],
552+ options={
553+ 'abstract': False,
554+ },
555+ bases=('cms.cmsplugin',),
556+ ),
557+ migrations.CreateModel(
558+ name='SEOExtension',
559+ fields=[
560+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
561+ ('keywords', models.CharField(max_length=256)),
562+ ('extended_object', models.OneToOneField(editable=False, to='cms.Title')),
563+ ('public_extension', models.OneToOneField(related_name='draft_extension', null=True, editable=False, to='developer_portal.SEOExtension')),
564+ ],
565+ options={
566+ 'abstract': False,
567+ },
568+ ),
569+ ]
570
571=== removed file 'developer_portal/migrations/0001_initial.py'
572--- developer_portal/migrations/0001_initial.py 2015-01-19 16:29:47 +0000
573+++ developer_portal/migrations/0001_initial.py 1970-01-01 00:00:00 +0000
574@@ -1,20 +0,0 @@
575-# -*- coding: utf-8 -*-
576-from south.utils import datetime_utils as datetime
577-from south.db import db
578-from south.v2 import SchemaMigration
579-from django.db import models
580-
581-
582-class Migration(SchemaMigration):
583-
584- def forwards(self, orm):
585- pass
586-
587- def backwards(self, orm):
588- pass
589-
590- models = {
591-
592- }
593-
594- complete_apps = ['developer_portal']
595\ No newline at end of file
596
597=== removed file 'developer_portal/migrations/0002_add_rawhtml_plugin.py'
598--- developer_portal/migrations/0002_add_rawhtml_plugin.py 2015-01-19 16:29:47 +0000
599+++ developer_portal/migrations/0002_add_rawhtml_plugin.py 1970-01-01 00:00:00 +0000
600@@ -1,53 +0,0 @@
601-# -*- coding: utf-8 -*-
602-from south.utils import datetime_utils as datetime
603-from south.db import db
604-from south.v2 import SchemaMigration
605-from django.db import models
606-
607-
608-class Migration(SchemaMigration):
609-
610- def forwards(self, orm):
611- # Adding model 'RawHtml'
612- db.create_table(u'developer_portal_rawhtml', (
613- (u'cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
614- ('body', self.gf('django.db.models.fields.TextField')()),
615- ))
616- db.send_create_signal(u'developer_portal', ['RawHtml'])
617-
618-
619- def backwards(self, orm):
620- # Deleting model 'RawHtml'
621- db.delete_table(u'developer_portal_rawhtml')
622-
623-
624- models = {
625- 'cms.cmsplugin': {
626- 'Meta': {'object_name': 'CMSPlugin'},
627- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
628- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
629- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
630- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
631- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
632- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
633- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
634- 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
635- 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
636- 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
637- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
638- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
639- },
640- 'cms.placeholder': {
641- 'Meta': {'object_name': 'Placeholder'},
642- 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
643- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
644- 'slot': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'})
645- },
646- u'developer_portal.rawhtml': {
647- 'Meta': {'object_name': 'RawHtml'},
648- 'body': ('django.db.models.fields.TextField', [], {}),
649- u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'})
650- }
651- }
652-
653- complete_apps = ['developer_portal']
654\ No newline at end of file
655
656=== removed file 'developer_portal/migrations/0003_add_external_docs_branches.py'
657--- developer_portal/migrations/0003_add_external_docs_branches.py 2015-08-06 09:30:11 +0000
658+++ developer_portal/migrations/0003_add_external_docs_branches.py 1970-01-01 00:00:00 +0000
659@@ -1,62 +0,0 @@
660-# -*- coding: utf-8 -*-
661-from south.utils import datetime_utils as datetime
662-from south.db import db
663-from south.v2 import SchemaMigration
664-from django.db import models
665-
666-
667-class Migration(SchemaMigration):
668-
669- def forwards(self, orm):
670- # Adding model 'ExternalDocsBranch'
671- db.create_table(u'developer_portal_externaldocsbranch', (
672- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
673- ('lp_origin', self.gf('django.db.models.fields.CharField')(max_length=200)),
674- ('docs_namespace', self.gf('django.db.models.fields.CharField')(max_length=120)),
675- ('index_doc', self.gf('django.db.models.fields.CharField')(max_length=120, blank=True)),
676- ))
677- db.send_create_signal(u'developer_portal', ['ExternalDocsBranch'])
678-
679-
680- def backwards(self, orm):
681- # Deleting model 'ExternalDocsBranch'
682- db.delete_table(u'developer_portal_externaldocsbranch')
683-
684-
685- models = {
686- 'cms.cmsplugin': {
687- 'Meta': {'object_name': 'CMSPlugin'},
688- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
689- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
690- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
691- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
692- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
693- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
694- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
695- 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
696- 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
697- 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
698- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
699- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
700- },
701- 'cms.placeholder': {
702- 'Meta': {'object_name': 'Placeholder'},
703- 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
704- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
705- 'slot': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'})
706- },
707- u'developer_portal.externaldocsbranch': {
708- 'Meta': {'object_name': 'ExternalDocsBranch'},
709- 'docs_namespace': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
710- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
711- 'index_doc': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
712- 'lp_origin': ('django.db.models.fields.CharField', [], {'max_length': '200'})
713- },
714- u'developer_portal.rawhtml': {
715- 'Meta': {'object_name': 'RawHtml'},
716- 'body': ('django.db.models.fields.TextField', [], {}),
717- u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'})
718- }
719- }
720-
721- complete_apps = ['developer_portal']
722\ No newline at end of file
723
724=== removed file 'developer_portal/migrations/0004_auto__add_seoextension.py'
725--- developer_portal/migrations/0004_auto__add_seoextension.py 2015-10-21 14:41:23 +0000
726+++ developer_portal/migrations/0004_auto__add_seoextension.py 1970-01-01 00:00:00 +0000
727@@ -1,126 +0,0 @@
728-# -*- coding: utf-8 -*-
729-from south.utils import datetime_utils as datetime
730-from south.db import db
731-from south.v2 import SchemaMigration
732-from django.db import models
733-
734-
735-class Migration(SchemaMigration):
736-
737- def forwards(self, orm):
738- # Adding model 'SEOExtension'
739- db.create_table(u'developer_portal_seoextension', (
740- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
741- ('public_extension', self.gf('django.db.models.fields.related.OneToOneField')(related_name='draft_extension', unique=True, null=True, to=orm['developer_portal.SEOExtension'])),
742- ('extended_object', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.Title'], unique=True)),
743- ('keywords', self.gf('django.db.models.fields.CharField')(max_length=256)),
744- ))
745- db.send_create_signal(u'developer_portal', ['SEOExtension'])
746-
747-
748- def backwards(self, orm):
749- # Deleting model 'SEOExtension'
750- db.delete_table(u'developer_portal_seoextension')
751-
752-
753- models = {
754- 'cms.cmsplugin': {
755- 'Meta': {'object_name': 'CMSPlugin'},
756- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
757- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
758- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
759- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
760- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
761- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
762- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
763- 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
764- 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
765- 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
766- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
767- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
768- },
769- 'cms.page': {
770- 'Meta': {'ordering': "('tree_id', 'lft')", 'unique_together': "(('publisher_is_draft', 'application_namespace'), ('reverse_id', 'site', 'publisher_is_draft'))", 'object_name': 'Page'},
771- 'application_namespace': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
772- 'application_urls': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '200', 'null': 'True', 'blank': 'True'}),
773- 'changed_by': ('django.db.models.fields.CharField', [], {'max_length': '70'}),
774- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
775- 'created_by': ('django.db.models.fields.CharField', [], {'max_length': '70'}),
776- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
777- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
778- 'in_navigation': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
779- 'is_home': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
780- 'languages': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
781- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
782- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
783- 'limit_visibility_in_menu': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
784- 'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
785- 'navigation_extenders': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '80', 'null': 'True', 'blank': 'True'}),
786- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['cms.Page']"}),
787- 'placeholders': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['cms.Placeholder']", 'symmetrical': 'False'}),
788- 'publication_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
789- 'publication_end_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
790- 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
791- 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.Page']"}),
792- 'reverse_id': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '40', 'null': 'True', 'blank': 'True'}),
793- 'revision_id': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
794- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
795- 'site': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'djangocms_pages'", 'to': u"orm['sites.Site']"}),
796- 'soft_root': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
797- 'template': ('django.db.models.fields.CharField', [], {'default': "'INHERIT'", 'max_length': '100'}),
798- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
799- 'xframe_options': ('django.db.models.fields.IntegerField', [], {'default': '0'})
800- },
801- 'cms.placeholder': {
802- 'Meta': {'object_name': 'Placeholder'},
803- 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
804- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
805- 'slot': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'})
806- },
807- 'cms.title': {
808- 'Meta': {'unique_together': "(('language', 'page'),)", 'object_name': 'Title'},
809- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
810- 'has_url_overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
811- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
812- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
813- 'menu_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
814- 'meta_description': ('django.db.models.fields.TextField', [], {'max_length': '155', 'null': 'True', 'blank': 'True'}),
815- 'page': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'title_set'", 'to': "orm['cms.Page']"}),
816- 'page_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
817- 'path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
818- 'published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
819- 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
820- 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.Title']"}),
821- 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
822- 'redirect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
823- 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
824- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
825- },
826- u'developer_portal.externaldocsbranch': {
827- 'Meta': {'object_name': 'ExternalDocsBranch'},
828- 'docs_namespace': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
829- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
830- 'index_doc': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
831- 'lp_origin': ('django.db.models.fields.CharField', [], {'max_length': '200'})
832- },
833- u'developer_portal.rawhtml': {
834- 'Meta': {'object_name': 'RawHtml'},
835- 'body': ('django.db.models.fields.TextField', [], {}),
836- u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'})
837- },
838- u'developer_portal.seoextension': {
839- 'Meta': {'object_name': 'SEOExtension'},
840- 'extended_object': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.Title']", 'unique': 'True'}),
841- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
842- 'keywords': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
843- 'public_extension': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'draft_extension'", 'unique': 'True', 'null': 'True', 'to': u"orm['developer_portal.SEOExtension']"})
844- },
845- u'sites.site': {
846- 'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"},
847- 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
848- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
849- 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
850- }
851- }
852-
853- complete_apps = ['developer_portal']
854\ No newline at end of file
855
856=== modified file 'developer_portal/settings.py'
857--- developer_portal/settings.py 2015-10-02 15:50:10 +0000
858+++ developer_portal/settings.py 2015-11-17 14:32:37 +0000
859@@ -30,8 +30,6 @@
860 # SECURITY WARNING: don't run with debug turned on in production!
861 DEBUG = True
862
863-TEMPLATE_DEBUG = True
864-
865 ALLOWED_HOSTS = ['127.0.0.1', 'developer.ubuntu.com']
866
867
868@@ -49,14 +47,13 @@
869 # Allow login from Ubuntu SSO
870 'django_openid_auth',
871
872- 'mptt', #utilities for implementing a modified pre-order traversal tree
873 'menus', #helper for model independent hierarchical website navigation
874- 'south', #intelligent schema and data migrations
875 'sekizai', #for javascript and css management
876 'reversion', #content versioning
877 'django_pygments',
878 'django_comments',
879 'tagging',
880+ 'template_debug',
881
882 'ckeditor',
883 'djangocms_text_ckeditor',
884@@ -66,6 +63,7 @@
885 'djangocms_picture',
886 'djangocms_video',
887 'djangocms_snippet',
888+ 'treebeard', #required by django CMS
889
890 'cmsplugin_zinnia',
891 'zinnia',
892@@ -107,24 +105,29 @@
893 #CACHE_MIDDLEWARE_SECONDS = 3600
894 #CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
895
896-TEMPLATE_CONTEXT_PROCESSORS = (
897- 'django.contrib.auth.context_processors.auth',
898- 'django.core.context_processors.i18n',
899- 'django.core.context_processors.request',
900- 'django.core.context_processors.media',
901- 'django.core.context_processors.static',
902-
903- 'sekizai.context_processors.sekizai',
904- 'cms.context_processors.cms_settings',
905- 'django.contrib.messages.context_processors.messages',
906-)
907-
908-TEMPLATE_DIRS = (
909- # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
910- # Always use forward slashes, even on Windows.
911- # Don't forget to use absolute paths, not relative paths.
912- os.path.join(PROJECT_PATH, "templates"),
913-)
914+
915+TEMPLATES = [
916+ {
917+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
918+ 'DIRS': [
919+ os.path.join(PROJECT_PATH, "templates"),
920+ ],
921+ 'APP_DIRS': True,
922+ 'OPTIONS': {
923+ 'context_processors': [
924+ 'django.core.context_processors.request',
925+ 'django.contrib.auth.context_processors.auth',
926+ 'django.core.context_processors.i18n',
927+ 'django.core.context_processors.media',
928+ 'django.core.context_processors.static',
929+
930+ 'sekizai.context_processors.sekizai',
931+ 'cms.context_processors.cms_settings',
932+ 'django.contrib.messages.context_processors.messages',
933+ ]
934+ }
935+ }
936+]
937
938 ROOT_URLCONF = 'developer_portal.urls'
939
940@@ -313,6 +316,23 @@
941 #'PAGINATE_BY': 10,
942 }
943
944+MIGRATION_MODULES = {
945+ 'cms': 'cms.migrations',
946+ 'cmsplugin_zinnia': 'cmsplugin_zinnia.migrations',
947+ 'djangocms_link': 'djangocms_link.migrations',
948+ 'djangocms_picture': 'djangocms_picture.migrations_django',
949+ 'djangocms_snippet': 'djangocms_snippet.migrations_django',
950+ 'djangocms_text_ckeditor': 'djangocms_text_ckeditor.migrations',
951+ 'djangocms_video': 'djangocms_video.migrations_django',
952+ 'django_comments': 'django_comments.migrations',
953+ 'menus': 'menus.migrations',
954+ 'rest_framework.authtoken': 'rest_framework.authtoken.migrations',
955+ 'reversion': 'reversion.migrations',
956+ 'tagging': 'tagging.migrations',
957+ 'taggit': 'taggit.migrations',
958+ 'zinnia': 'zinnia.migrations',
959+}
960+
961 LOGGING = {
962 'version': 1,
963 'disable_existing_loggers': False,
964
965=== modified file 'developer_portal/urls.py'
966--- developer_portal/urls.py 2015-06-25 21:53:23 +0000
967+++ developer_portal/urls.py 2015-11-17 14:32:37 +0000
968@@ -32,7 +32,7 @@
969
970 urlpatterns += i18n_patterns('',
971 url(r'^search/', 'developer_portal.views.search', name='search'),
972- url(r'^ckeditor/', include('ckeditor.urls')),
973+ url(r'^ckeditor/', include('ckeditor_uploader.urls')),
974 url(r'^', include('cms.urls')),
975 ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
976
977
978=== modified file 'requirements.txt'
979--- requirements.txt 2015-10-29 10:55:07 +0000
980+++ requirements.txt 2015-11-17 14:32:37 +0000
981@@ -1,53 +1,51 @@
982-oslo.config==1.6.0
983-oslo.i18n==1.2.0
984-oslo.serialization==1.2.0
985-oslo.utils==1.2.0
986-Django==1.6.8
987-Markdown==2.6.2
988-South==1.0.1
989-Pillow==2.6.1
990-beautifulsoup4==4.4.0
991-cmsplugin-zinnia==0.6
992+Django==1.8.5
993+django-template-debug==0.3.5
994+oslo.config==2.7.0
995+oslo.i18n==2.7.0
996+oslo.serialization==1.11.0
997+oslo.utils==2.8.0
998+Pillow==2.9.0
999+cmsplugin-zinnia==0.8
1000+Markdown==2.6.4
1001+beautifulsoup4==4.4.1
1002 dj-database-url==0.3.0
1003-django-admin-enhancer==0.1.3.1
1004-django-appconf==0.6
1005-django-blog-zinnia==0.14.2
1006-django-ckeditor==4.4.7
1007+django-admin-enhancer==1.0.0
1008+django-appconf==1.0.1
1009+django-blog-zinnia==0.15.2
1010+django-ckeditor==5.0.2
1011 django-ckeditor-updated==4.4.4
1012-django-classy-tags==0.5.1
1013-django-cms==3.0.6
1014-django-contrib-comments==1.5
1015-django-meta==0.2.0
1016-django-meta-mixin==0.1.1
1017+django-classy-tags==0.6.2
1018+django-cms==3.1.2
1019+django-contrib-comments==1.6.1
1020+django-meta==0.3.1
1021+django-meta-mixin==0.2.1
1022 django-missing==0.1.13
1023-django-mptt==0.7.4
1024-django-parler==1.1.1
1025-django-polymorphic==0.6
1026-django-reversion==1.8.4
1027-django-sekizai==0.7
1028+django-parler==1.5.1
1029+django-polymorphic==0.7.2
1030+django-reversion==1.9.3
1031+django-sekizai==0.8.2
1032 django-swiftstorage==1.1.0
1033-django-tagging==0.3.3
1034-django-taggit==0.12.2
1035-django-taggit-autosuggest==0.2.5
1036+django-tagging==0.4
1037+django-taggit==0.17.3
1038+django-taggit-autosuggest==0.2.7
1039 django-taggit-templatetags==0.2.5
1040 django-templatetag-sugar==1.0
1041 django-xmlrpc==0.1.5
1042-djangocms-admin-style==0.2.2
1043-djangocms-link==1.5
1044+djangocms-admin-style==1.0.5
1045+djangocms-link==1.7.1
1046 djangocms-picture==0.1
1047-djangocms-snippet==1.3
1048-djangocms-text-ckeditor==2.4.2
1049+djangocms-snippet==1.5
1050+djangocms-text-ckeditor==2.7.0
1051 djangocms-utils==0.9.5
1052 djangocms-video==0.1
1053-python-keystoneclient==0.11.2
1054-python-swiftclient==2.3.1
1055-pytz==2014.7
1056+python-swiftclient==2.6.0
1057+pytz==2015.7
1058 simple-translation==0.8.6
1059-simplejson==3.6.5
1060+simplejson==3.8.1
1061 wsgiref==0.1.2
1062-zinnia-wysiwyg-ckeditor==1.1
1063-Pygments==1.6
1064+zinnia-wysiwyg-ckeditor==1.3
1065+Pygments==2.0.2
1066 django-pygments==0.1
1067-django-openid-auth==0.5
1068-python-openid==2.2.4
1069-djangorestframework==3.0.4
1070+django-openid-auth==0.7
1071+python-openid==2.2.5
1072+djangorestframework==3.3.1
1073
1074=== modified file 'service/urls.py'
1075--- service/urls.py 2015-02-05 14:24:04 +0000
1076+++ service/urls.py 2015-11-17 14:32:37 +0000
1077@@ -4,13 +4,13 @@
1078
1079 # Routers provide an easy way of automatically determining the URL conf
1080 router = routers.DefaultRouter()
1081-router.register(r'elements', ElementViewSet)
1082-router.register(r'pages', PageViewSet)
1083-router.register(r'namespaces', NamespaceViewSet)
1084-router.register(r'sections', SectionViewSet)
1085-router.register(r'versions', VersionViewSet)
1086-router.register(r'languages', LanguageViewSet)
1087-router.register(r'topics', TopicViewSet)
1088+router.register(r'elements', ElementViewSet, base_name='element-list')
1089+router.register(r'pages', PageViewSet, base_name='page-list')
1090+router.register(r'namespaces', NamespaceViewSet, base_name='namespace-list')
1091+router.register(r'sections', SectionViewSet, base_name='section-list')
1092+router.register(r'versions', VersionViewSet, base_name='version-list')
1093+router.register(r'languages', LanguageViewSet, base_name='language-list')
1094+router.register(r'topics', TopicViewSet, base_name='topic-list')
1095
1096
1097 # Wire up our API using automatic URL routing.
1098
1099=== modified file 'store_data/migrations/0001_initial.py'
1100--- store_data/migrations/0001_initial.py 2015-07-02 08:49:35 +0000
1101+++ store_data/migrations/0001_initial.py 2015-11-17 14:32:37 +0000
1102@@ -1,134 +1,63 @@
1103 # -*- coding: utf-8 -*-
1104-from south.utils import datetime_utils as datetime
1105-from south.db import db
1106-from south.v2 import SchemaMigration
1107-from django.db import models
1108-
1109-
1110-class Migration(SchemaMigration):
1111-
1112- def forwards(self, orm):
1113- # Adding model 'Release'
1114- db.create_table(u'store_data_release', (
1115- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
1116- ('name', self.gf('django.db.models.fields.CharField')(max_length=25)),
1117- ))
1118- db.send_create_signal(u'store_data', ['Release'])
1119-
1120- # Adding model 'Architecture'
1121- db.create_table(u'store_data_architecture', (
1122- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
1123- ('name', self.gf('django.db.models.fields.CharField')(max_length=10)),
1124- ))
1125- db.send_create_signal(u'store_data', ['Architecture'])
1126-
1127- # Adding model 'ScreenshotURL'
1128- db.create_table(u'store_data_screenshoturl', (
1129- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
1130- ('url', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)),
1131- ))
1132- db.send_create_signal(u'store_data', ['ScreenshotURL'])
1133-
1134- # Adding model 'GadgetSnap'
1135- db.create_table(u'store_data_gadgetsnap', (
1136- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
1137- ('icon_url', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)),
1138- ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
1139- ('ratings_average', self.gf('django.db.models.fields.DecimalField')(max_digits=2, decimal_places=1)),
1140- ('alias', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)),
1141- ('price', self.gf('django.db.models.fields.DecimalField')(max_digits=5, decimal_places=2)),
1142- ('publisher', self.gf('django.db.models.fields.CharField')(max_length=100)),
1143- ('store_url', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)),
1144- ('version', self.gf('django.db.models.fields.CharField')(max_length=25)),
1145- ('last_updated', self.gf('django.db.models.fields.DateTimeField')()),
1146- ('description', self.gf('django.db.models.fields.TextField')(max_length=5000)),
1147- ))
1148- db.send_create_signal(u'store_data', ['GadgetSnap'])
1149-
1150- # Adding M2M table for field release on 'GadgetSnap'
1151- m2m_table_name = db.shorten_name(u'store_data_gadgetsnap_release')
1152- db.create_table(m2m_table_name, (
1153- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
1154- ('gadgetsnap', models.ForeignKey(orm[u'store_data.gadgetsnap'], null=False)),
1155- ('release', models.ForeignKey(orm[u'store_data.release'], null=False))
1156- ))
1157- db.create_unique(m2m_table_name, ['gadgetsnap_id', 'release_id'])
1158-
1159- # Adding M2M table for field architecture on 'GadgetSnap'
1160- m2m_table_name = db.shorten_name(u'store_data_gadgetsnap_architecture')
1161- db.create_table(m2m_table_name, (
1162- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
1163- ('gadgetsnap', models.ForeignKey(orm[u'store_data.gadgetsnap'], null=False)),
1164- ('architecture', models.ForeignKey(orm[u'store_data.architecture'], null=False))
1165- ))
1166- db.create_unique(m2m_table_name, ['gadgetsnap_id', 'architecture_id'])
1167-
1168- # Adding M2M table for field screenshot_url on 'GadgetSnap'
1169- m2m_table_name = db.shorten_name(u'store_data_gadgetsnap_screenshot_url')
1170- db.create_table(m2m_table_name, (
1171- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
1172- ('gadgetsnap', models.ForeignKey(orm[u'store_data.gadgetsnap'], null=False)),
1173- ('screenshoturl', models.ForeignKey(orm[u'store_data.screenshoturl'], null=False))
1174- ))
1175- db.create_unique(m2m_table_name, ['gadgetsnap_id', 'screenshoturl_id'])
1176-
1177-
1178- def backwards(self, orm):
1179- # Deleting model 'Release'
1180- db.delete_table(u'store_data_release')
1181-
1182- # Deleting model 'Architecture'
1183- db.delete_table(u'store_data_architecture')
1184-
1185- # Deleting model 'ScreenshotURL'
1186- db.delete_table(u'store_data_screenshoturl')
1187-
1188- # Deleting model 'GadgetSnap'
1189- db.delete_table(u'store_data_gadgetsnap')
1190-
1191- # Removing M2M table for field release on 'GadgetSnap'
1192- db.delete_table(db.shorten_name(u'store_data_gadgetsnap_release'))
1193-
1194- # Removing M2M table for field architecture on 'GadgetSnap'
1195- db.delete_table(db.shorten_name(u'store_data_gadgetsnap_architecture'))
1196-
1197- # Removing M2M table for field screenshot_url on 'GadgetSnap'
1198- db.delete_table(db.shorten_name(u'store_data_gadgetsnap_screenshot_url'))
1199-
1200-
1201- models = {
1202- u'store_data.architecture': {
1203- 'Meta': {'object_name': 'Architecture'},
1204- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1205- 'name': ('django.db.models.fields.CharField', [], {'max_length': '10'})
1206- },
1207- u'store_data.gadgetsnap': {
1208- 'Meta': {'object_name': 'GadgetSnap'},
1209- 'alias': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
1210- 'architecture': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Architecture']", 'symmetrical': 'False'}),
1211- 'description': ('django.db.models.fields.TextField', [], {'max_length': '5000'}),
1212- 'icon_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
1213- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1214- 'last_updated': ('django.db.models.fields.DateTimeField', [], {}),
1215- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1216- 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
1217- 'publisher': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1218- 'ratings_average': ('django.db.models.fields.DecimalField', [], {'max_digits': '2', 'decimal_places': '1'}),
1219- 'release': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Release']", 'symmetrical': 'False'}),
1220- 'screenshot_url': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.ScreenshotURL']", 'symmetrical': 'False'}),
1221- 'store_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
1222- 'version': ('django.db.models.fields.CharField', [], {'max_length': '25'})
1223- },
1224- u'store_data.release': {
1225- 'Meta': {'object_name': 'Release'},
1226- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1227- 'name': ('django.db.models.fields.CharField', [], {'max_length': '25'})
1228- },
1229- u'store_data.screenshoturl': {
1230- 'Meta': {'object_name': 'ScreenshotURL'},
1231- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1232- 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
1233- }
1234- }
1235-
1236- complete_apps = ['store_data']
1237\ No newline at end of file
1238+from __future__ import unicode_literals
1239+
1240+from django.db import migrations, models
1241+
1242+
1243+class Migration(migrations.Migration):
1244+
1245+ dependencies = [
1246+ ]
1247+
1248+ operations = [
1249+ migrations.CreateModel(
1250+ name='Architecture',
1251+ fields=[
1252+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
1253+ ('name', models.CharField(max_length=10)),
1254+ ],
1255+ ),
1256+ migrations.CreateModel(
1257+ name='GadgetSnap',
1258+ fields=[
1259+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
1260+ ('icon_url', models.URLField(blank=True)),
1261+ ('name', models.CharField(max_length=100)),
1262+ ('title', models.CharField(max_length=250, null=True, blank=True)),
1263+ ('ratings_average', models.DecimalField(max_digits=2, decimal_places=1)),
1264+ ('alias', models.CharField(max_length=100, null=True, blank=True)),
1265+ ('price', models.DecimalField(max_digits=5, decimal_places=2)),
1266+ ('publisher', models.CharField(max_length=100)),
1267+ ('store_url', models.URLField(blank=True)),
1268+ ('version', models.CharField(max_length=25)),
1269+ ('last_updated', models.DateTimeField()),
1270+ ('description', models.TextField(max_length=5000)),
1271+ ('website', models.URLField(blank=True)),
1272+ ('architecture', models.ManyToManyField(to='store_data.Architecture')),
1273+ ],
1274+ ),
1275+ migrations.CreateModel(
1276+ name='Release',
1277+ fields=[
1278+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
1279+ ('name', models.CharField(max_length=25)),
1280+ ],
1281+ ),
1282+ migrations.CreateModel(
1283+ name='ScreenshotURL',
1284+ fields=[
1285+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
1286+ ('url', models.URLField(blank=True)),
1287+ ],
1288+ ),
1289+ migrations.AddField(
1290+ model_name='gadgetsnap',
1291+ name='release',
1292+ field=models.ManyToManyField(to='store_data.Release'),
1293+ ),
1294+ migrations.AddField(
1295+ model_name='gadgetsnap',
1296+ name='screenshot_url',
1297+ field=models.ManyToManyField(to='store_data.ScreenshotURL'),
1298+ ),
1299+ ]
1300
1301=== removed file 'store_data/migrations/0002_add_title_field.py'
1302--- store_data/migrations/0002_add_title_field.py 2015-11-10 14:13:42 +0000
1303+++ store_data/migrations/0002_add_title_field.py 1970-01-01 00:00:00 +0000
1304@@ -1,58 +0,0 @@
1305-# -*- coding: utf-8 -*-
1306-from south.utils import datetime_utils as datetime
1307-from south.db import db
1308-from south.v2 import SchemaMigration
1309-from django.db import models
1310-
1311-
1312-class Migration(SchemaMigration):
1313-
1314- def forwards(self, orm):
1315- # Adding field 'GadgetSnap.title'
1316- db.add_column(u'store_data_gadgetsnap', 'title',
1317- self.gf('django.db.models.fields.CharField')(max_length=250, null=True, blank=True),
1318- keep_default=False)
1319-
1320-
1321- def backwards(self, orm):
1322- # Deleting field 'GadgetSnap.title'
1323- db.delete_column(u'store_data_gadgetsnap', 'title')
1324-
1325-
1326- models = {
1327- u'store_data.architecture': {
1328- 'Meta': {'object_name': 'Architecture'},
1329- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1330- 'name': ('django.db.models.fields.CharField', [], {'max_length': '10'})
1331- },
1332- u'store_data.gadgetsnap': {
1333- 'Meta': {'object_name': 'GadgetSnap'},
1334- 'alias': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
1335- 'architecture': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Architecture']", 'symmetrical': 'False'}),
1336- 'description': ('django.db.models.fields.TextField', [], {'max_length': '5000'}),
1337- 'icon_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
1338- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1339- 'last_updated': ('django.db.models.fields.DateTimeField', [], {}),
1340- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1341- 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
1342- 'publisher': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1343- 'ratings_average': ('django.db.models.fields.DecimalField', [], {'max_digits': '2', 'decimal_places': '1'}),
1344- 'release': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Release']", 'symmetrical': 'False'}),
1345- 'screenshot_url': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.ScreenshotURL']", 'symmetrical': 'False'}),
1346- 'store_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
1347- 'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}),
1348- 'version': ('django.db.models.fields.CharField', [], {'max_length': '25'})
1349- },
1350- u'store_data.release': {
1351- 'Meta': {'object_name': 'Release'},
1352- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1353- 'name': ('django.db.models.fields.CharField', [], {'max_length': '25'})
1354- },
1355- u'store_data.screenshoturl': {
1356- 'Meta': {'object_name': 'ScreenshotURL'},
1357- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1358- 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
1359- }
1360- }
1361-
1362- complete_apps = ['store_data']
1363\ No newline at end of file
1364
1365=== removed file 'store_data/migrations/0003_add_website_field.py'
1366--- store_data/migrations/0003_add_website_field.py 2015-11-10 14:52:15 +0000
1367+++ store_data/migrations/0003_add_website_field.py 1970-01-01 00:00:00 +0000
1368@@ -1,59 +0,0 @@
1369-# -*- coding: utf-8 -*-
1370-from south.utils import datetime_utils as datetime
1371-from south.db import db
1372-from south.v2 import SchemaMigration
1373-from django.db import models
1374-
1375-
1376-class Migration(SchemaMigration):
1377-
1378- def forwards(self, orm):
1379- # Adding field 'GadgetSnap.website'
1380- db.add_column(u'store_data_gadgetsnap', 'website',
1381- self.gf('django.db.models.fields.URLField')(default='', max_length=200, blank=True),
1382- keep_default=False)
1383-
1384-
1385- def backwards(self, orm):
1386- # Deleting field 'GadgetSnap.website'
1387- db.delete_column(u'store_data_gadgetsnap', 'website')
1388-
1389-
1390- models = {
1391- u'store_data.architecture': {
1392- 'Meta': {'object_name': 'Architecture'},
1393- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1394- 'name': ('django.db.models.fields.CharField', [], {'max_length': '10'})
1395- },
1396- u'store_data.gadgetsnap': {
1397- 'Meta': {'object_name': 'GadgetSnap'},
1398- 'alias': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
1399- 'architecture': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Architecture']", 'symmetrical': 'False'}),
1400- 'description': ('django.db.models.fields.TextField', [], {'max_length': '5000'}),
1401- 'icon_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
1402- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1403- 'last_updated': ('django.db.models.fields.DateTimeField', [], {}),
1404- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1405- 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
1406- 'publisher': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1407- 'ratings_average': ('django.db.models.fields.DecimalField', [], {'max_digits': '2', 'decimal_places': '1'}),
1408- 'release': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.Release']", 'symmetrical': 'False'}),
1409- 'screenshot_url': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['store_data.ScreenshotURL']", 'symmetrical': 'False'}),
1410- 'store_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
1411- 'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}),
1412- 'version': ('django.db.models.fields.CharField', [], {'max_length': '25'}),
1413- 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
1414- },
1415- u'store_data.release': {
1416- 'Meta': {'object_name': 'Release'},
1417- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1418- 'name': ('django.db.models.fields.CharField', [], {'max_length': '25'})
1419- },
1420- u'store_data.screenshoturl': {
1421- 'Meta': {'object_name': 'ScreenshotURL'},
1422- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1423- 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
1424- }
1425- }
1426-
1427- complete_apps = ['store_data']
1428\ No newline at end of file
1429
1430=== modified file 'templates/zinnia/_entry_detail_base.html'
1431--- templates/zinnia/_entry_detail_base.html 2014-12-16 22:52:40 +0000
1432+++ templates/zinnia/_entry_detail_base.html 2015-11-17 14:32:37 +0000
1433@@ -1,4 +1,4 @@
1434-{% load i18n zinnia_tags %}
1435+{% load i18n zinnia %}
1436 <article class="row no-border no-padding-bottom post {% if object.featured %} featured{% endif %}">
1437 <div class="eight-col">
1438 {% block entry-header %}
1439@@ -70,4 +70,4 @@
1440 </aside>
1441 {% endblock entry-info %}
1442 </div>
1443-</article>
1444\ No newline at end of file
1445+</article>
1446
1447=== modified file 'templates/zinnia/base.html'
1448--- templates/zinnia/base.html 2015-01-14 22:38:55 +0000
1449+++ templates/zinnia/base.html 2015-11-17 14:32:37 +0000
1450@@ -1,5 +1,5 @@
1451 {% extends "base.html" %}
1452-{% load zinnia_tags i18n %}
1453+{% load zinnia i18n %}
1454 {% load cms_tags sekizai_tags menu_tags static %}
1455
1456 {% block meta-keywords %}{% get_tags as entry_tags %}{{ entry_tags|join:", "}}{% endblock meta-keywords %}
1457
1458=== modified file 'templates/zinnia/category_list.html'
1459--- templates/zinnia/category_list.html 2015-01-16 21:02:45 +0000
1460+++ templates/zinnia/category_list.html 2015-11-17 14:32:37 +0000
1461@@ -1,5 +1,6 @@
1462 {% extends "zinnia/base.html" %}
1463-{% load i18n mptt_tags %}
1464+
1465+{% load i18n %}
1466
1467 {% block meta-description %}{% trans "Category list" %}{% endblock meta-description %}
1468
1469
1470=== modified file 'templates/zinnia/entry_detail_base.html'
1471--- templates/zinnia/entry_detail_base.html 2015-01-16 21:02:45 +0000
1472+++ templates/zinnia/entry_detail_base.html 2015-11-17 14:32:37 +0000
1473@@ -1,5 +1,5 @@
1474 {% extends "zinnia/base.html" %}
1475-{% load i18n comments zinnia_tags %}
1476+{% load i18n comments zinnia %}
1477 {% load cycle from future %}
1478
1479 {% block title %}{{ object.title }} | {{ block.super }}{% endblock title%}
1480
1481=== modified file 'templates/zinnia/entry_list.html'
1482--- templates/zinnia/entry_list.html 2014-12-17 10:51:06 +0000
1483+++ templates/zinnia/entry_list.html 2015-11-17 14:32:37 +0000
1484@@ -1,5 +1,5 @@
1485 {% extends "zinnia/base.html" %}
1486-{% load i18n zinnia_tags %}
1487+{% load i18n zinnia %}
1488
1489 {% block meta-description %}{% trans "Latest entries for" %} {% if category %}{% trans "the category" %} {{ category }}{% if category.description %}: {{ category.description|striptags|safe }}{% endif %}{% endif %}{% if tag %}{% trans "the tag" %} {{ tag }}{% endif %}{% if author %}{% trans "the author" %} {{ author }}{% endif %}{% endblock meta-description %}
1490

Subscribers

People subscribed via source and target branches