Skip to content

Commit ff87d6d

Browse files
committed
Add faqpage migrations for django-fluent-pages 0.9 support
The SEO fields are now translatable instead of abstract, so the fields are no longer part of the ``FaqPage`` model.
1 parent 70b847b commit ff87d6d

File tree

2 files changed

+259
-0
lines changed

2 files changed

+259
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
# -*- coding: utf-8 -*-
2+
from django.core.exceptions import ObjectDoesNotExist
3+
from south.utils import datetime_utils as datetime
4+
from south.db import db
5+
from south.v2 import DataMigration
6+
from django.db import models
7+
from fluent_faq import appsettings
8+
9+
10+
class Migration(DataMigration):
11+
depends_on = (
12+
("fluent_pages", "0014_add_seo_translations"),
13+
)
14+
15+
def forwards(self, orm):
16+
UrlNode_Translation = orm['fluent_pages.UrlNode_Translation']
17+
HtmlPageTranslation = orm['fluent_pages.HtmlPageTranslation']
18+
default_choices = ('en', 'en-us', appsettings.FLUENT_FAQ_DEFAULT_LANGUAGE_CODE)
19+
20+
for faqpage in orm['faqpage.FaqPage'].objects.all():
21+
available_languages = list(UrlNode_Translation.objects.filter(master_id=faqpage.pk).values_list('language_code', flat=True))
22+
23+
# Find the first language that is usable.
24+
# Move the fields to the translation of that language.
25+
lang = next((code for code in default_choices if code in available_languages), available_languages[0])
26+
HtmlPageTranslation.objects.create(
27+
master_id=faqpage.pk,
28+
language_code=lang,
29+
meta_keywords=faqpage.meta_keywords,
30+
meta_description=faqpage.meta_description,
31+
meta_title=faqpage.meta_title,
32+
)
33+
34+
def backwards(self, orm):
35+
# Convert all fields back to the single-language table.
36+
for faqpage in orm['faqpage.FaqPage'].objects.all():
37+
translations = orm['fluent_pages.HtmlPageTranslation'].objects.filter(master_id=faqpage.pk)
38+
try:
39+
# Try default translation
40+
translation = translations.get(language_code=appsettings.FLUENT_FAQ_DEFAULT_LANGUAGE_CODE)
41+
except ObjectDoesNotExist:
42+
try:
43+
# Try internal fallback
44+
translation = translations.get(language_code__in=('en-us', 'en'))
45+
except ObjectDoesNotExist:
46+
# Hope there is a single translation
47+
translation = translations.get()
48+
49+
faqpage.meta_keywords = translation.meta_keywords
50+
faqpage.meta_description = translation.meta_description
51+
faqpage.meta_title = translation.meta_title
52+
faqpage.save() # As intended: doesn't call UrlNode.save() but Model.save() only.
53+
54+
models = {
55+
u'auth.group': {
56+
'Meta': {'object_name': 'Group'},
57+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
58+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
59+
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
60+
},
61+
u'auth.permission': {
62+
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
63+
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
64+
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
65+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
66+
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
67+
},
68+
u'auth.user': {
69+
'Meta': {'object_name': 'User'},
70+
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
71+
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
72+
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
73+
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
74+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
75+
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
76+
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
77+
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
78+
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
79+
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
80+
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
81+
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
82+
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
83+
},
84+
u'contenttypes.contenttype': {
85+
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
86+
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
87+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
88+
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
89+
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
90+
},
91+
u'faqpage.faqpage': {
92+
'Meta': {'object_name': 'FaqPage', 'db_table': "'pagetype_faqpage_faqpage'"},
93+
'meta_description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
94+
'meta_keywords': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
95+
'meta_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
96+
u'urlnode_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['fluent_pages.UrlNode']", 'unique': 'True', 'primary_key': 'True'})
97+
},
98+
'fluent_pages.htmlpagetranslation': {
99+
'Meta': {'unique_together': "[(u'language_code', u'master')]", 'object_name': 'HtmlPageTranslation', 'db_table': "u'fluent_pages_htmlpage_translation'"},
100+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
101+
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
102+
u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'seo_translations'", 'null': 'True', 'to': "orm['fluent_pages.UrlNode']"}),
103+
'meta_description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
104+
'meta_keywords': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
105+
'meta_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
106+
},
107+
'fluent_pages.urlnode': {
108+
'Meta': {'ordering': "('tree_id', 'lft')", 'unique_together': "(('parent_site', 'key'),)", 'object_name': 'UrlNode'},
109+
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
110+
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
111+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
112+
'in_navigation': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
113+
'in_sitemaps': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
114+
'key': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
115+
u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
116+
u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
117+
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
118+
'parent': ('fluent_pages.models.fields.PageTreeForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['fluent_pages.UrlNode']"}),
119+
'parent_site': ('django.db.models.fields.related.ForeignKey', [], {'default': '10', 'to': u"orm['sites.Site']"}),
120+
'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_fluent_pages.urlnode_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}),
121+
'publication_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
122+
'publication_end_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
123+
u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
124+
'status': ('django.db.models.fields.CharField', [], {'default': "'d'", 'max_length': '1', 'db_index': 'True'}),
125+
u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
126+
},
127+
'fluent_pages.urlnode_translation': {
128+
'Meta': {'unique_together': "(('language_code', 'master'),)", 'object_name': 'UrlNode_Translation'},
129+
'_cached_url': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '300', 'null': 'True', 'blank': 'True'}),
130+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
131+
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
132+
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': "orm['fluent_pages.UrlNode']"}),
133+
'override_url': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}),
134+
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
135+
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
136+
},
137+
u'sites.site': {
138+
'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"},
139+
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
140+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
141+
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
142+
}
143+
}
144+
145+
complete_apps = ['faqpage']
146+
symmetrical = True
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# -*- coding: utf-8 -*-
2+
from south.utils import datetime_utils as datetime
3+
from south.db import db
4+
from south.v2 import SchemaMigration
5+
from django.db import models
6+
7+
8+
class Migration(SchemaMigration):
9+
10+
def forwards(self, orm):
11+
# Deleting field 'FaqPage.meta_description'
12+
db.delete_column('pagetype_faqpage_faqpage', 'meta_description')
13+
14+
# Deleting field 'FaqPage.meta_title'
15+
db.delete_column('pagetype_faqpage_faqpage', 'meta_title')
16+
17+
# Deleting field 'FaqPage.meta_keywords'
18+
db.delete_column('pagetype_faqpage_faqpage', 'meta_keywords')
19+
20+
21+
def backwards(self, orm):
22+
# Adding field 'FaqPage.meta_description'
23+
db.add_column('pagetype_faqpage_faqpage', 'meta_description',
24+
self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True),
25+
keep_default=False)
26+
27+
# Adding field 'FaqPage.meta_title'
28+
db.add_column('pagetype_faqpage_faqpage', 'meta_title',
29+
self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True),
30+
keep_default=False)
31+
32+
# Adding field 'FaqPage.meta_keywords'
33+
db.add_column('pagetype_faqpage_faqpage', 'meta_keywords',
34+
self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True),
35+
keep_default=False)
36+
37+
38+
models = {
39+
u'auth.group': {
40+
'Meta': {'object_name': 'Group'},
41+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
42+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
43+
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
44+
},
45+
u'auth.permission': {
46+
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
47+
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
48+
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
49+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
50+
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
51+
},
52+
u'auth.user': {
53+
'Meta': {'object_name': 'User'},
54+
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
55+
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
56+
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
57+
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
58+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59+
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
60+
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
61+
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
62+
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
63+
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
64+
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
65+
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
66+
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
67+
},
68+
u'contenttypes.contenttype': {
69+
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
70+
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
71+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
72+
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
73+
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
74+
},
75+
u'faqpage.faqpage': {
76+
'Meta': {'ordering': "('tree_id', 'lft')", 'object_name': 'FaqPage', 'db_table': "'pagetype_faqpage_faqpage'", '_ormbases': ['fluent_pages.HtmlPage']},
77+
u'urlnode_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['fluent_pages.UrlNode']", 'unique': 'True', 'primary_key': 'True'})
78+
},
79+
'fluent_pages.htmlpage': {
80+
'Meta': {'ordering': "('tree_id', 'lft')", 'object_name': 'HtmlPage', 'db_table': "'pagetype_fluent_pages_urlnode'", '_ormbases': ['fluent_pages.Page'], 'proxy': 'True'}
81+
},
82+
'fluent_pages.page': {
83+
'Meta': {'ordering': "('tree_id', 'lft')", 'object_name': 'Page', 'db_table': "u'fluent_pages_urlnode'", '_ormbases': ['fluent_pages.UrlNode'], 'proxy': 'True'}
84+
},
85+
'fluent_pages.urlnode': {
86+
'Meta': {'ordering': "('tree_id', 'lft')", 'unique_together': "(('parent_site', 'key'),)", 'object_name': 'UrlNode'},
87+
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
88+
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
89+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
90+
'in_navigation': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
91+
'in_sitemaps': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
92+
'key': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
93+
u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
94+
u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
95+
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
96+
'parent': ('fluent_pages.models.fields.PageTreeForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['fluent_pages.UrlNode']"}),
97+
'parent_site': ('django.db.models.fields.related.ForeignKey', [], {'default': '10', 'to': u"orm['sites.Site']"}),
98+
'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_fluent_pages.urlnode_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}),
99+
'publication_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
100+
'publication_end_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
101+
u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
102+
'status': ('django.db.models.fields.CharField', [], {'default': "'d'", 'max_length': '1', 'db_index': 'True'}),
103+
u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
104+
},
105+
u'sites.site': {
106+
'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"},
107+
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
108+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
109+
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
110+
}
111+
}
112+
113+
complete_apps = ['faqpage']

0 commit comments

Comments
 (0)