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

Proposed by Daniel Holbach
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
David Callé Pending
Michael Hall 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.
Revision history for this message
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
Revision history for this message
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/

Revision history for this message
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

merged trunk

164. By David Callé

Fix importer commands

165. By David Callé

Fix diverged branches

166. By Daniel Holbach

update various packages

167. By Daniel Holbach

django 1.8.6 is not on pypi yet

168. By Daniel Holbach

fix djangocms_link migrations path

169. By Daniel Holbach

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

170. By Daniel Holbach

merge trunk

Revision history for this message
Daniel Holbach (dholbach) wrote :

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

Revision history for this message
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

merge trunk

172. By Daniel Holbach

update permissions model changes

173. By Daniel Holbach

merge trunk

174. By Daniel Holbach

update migrations accordingly

175. By Daniel Holbach

remove non-existing migration dependency

176. By Daniel Holbach

update Makefile target for migration

177. By Daniel Holbach

update pip components and migration script

178. By Daniel Holbach

avoid breakage with some newer components

Revision history for this message
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

remove comments

Revision history for this message
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