Newer
Older
from __future__ import unicode_literals, print_function
try:
from django.apps import apps
get_model = apps.get_model
except:
from django.db.models.loading import get_model
try:
from cms.models.placeholdermodel import Placeholder
from cms.api import add_plugin
except ImportError:
with_cms = False
else:
with_cms = True
# array of available NewsTypes
# for each NewsType, we define a subarray with the model to use and
# default fields values in "overwrites" which is a subarray too :
# - inherit is a list of other NewsTypes to get default fields.from their conf
# - key 0 is the default values for all news
# - keys 1 to N is an array with values to overwrite for news 1 to N.
# Can also contain a "languages" list with language code for translations.
# Only used for I18N Models. Translations are in "translations" variable.
newsTypes = {
'myapp.News': {
'overwrites': {
'inherit': [],
# 0 is for base values
0: {
'newsbox_slug': 'news-%(i)d',
'newsbox_title': 'News %(i)d',
'newsbox_date': None,
'newsbox_publication_start_date': '2014-03-%(i)02dT10:00:00+02:00',
'newsbox_published': True,
'newsbox_summary': 'Summary of the news %(i)d',
'newsbox_body': 'Body of the news %(i)d',
1: {},
2: {'newsbox_published': False},
3: {'newsbox_publication_start_date': '2020-01-01T10:00:00+02:00'},
4: {'newsbox_body': ''},
5: {'newsbox_published': False},
6: {'newsbox_date': '2028-01-01T10:00:00+02:00',
'newsbox_publication_start_date': '2005-07-15T10:00:00+02:00'},
7: {'newsbox_date': '1985-07-02T10:00:00+02:00'},
},
'myapp.NewsExpired': {
'overwrites': {
'inherit': ['myapp.News', ],
5: {
'newsbox_published': True,
'newsbox_publication_end_date': '2014-06-01T10:00:00+02:00',
},
'myapp.NewsSEO': {
'overwrites': {
'inherit': ['myapp.News', ],
0: {
'newsbox_indexed': True,
'newsbox_meta_description': 'Meta description of the news %(i)d',
'newsbox_meta_keywords': 'keyword1, keyword2, news-%(i)d',
6: {
'newsbox_indexed': False,
},
'myapp.NewsComplete': {
'overwrites': {
'inherit': ['myapp.NewsExpired', 'myapp.NewsSEO'],
},
'myapp.NewsExtended': {
'overwrites': {
'inherit': ['myapp.NewsComplete'],
0: {
'general_field': 'Test',
'content_field': 'Extra content of the news %(i)d',
'seo_field': 'Extra SEO of the news %(i)d',
}
},
# I18N Models
'myapp_i18n.News': {
'languages': ['en', 'fr', ],
'overwrites': {
'inherit': ['myapp.News', ],
},
'myapp_i18n.NewsComplete': {
'languages': ['en', 'fr', ],
'overwrites': {
'inherit': ['myapp.NewsComplete', 'myapp_i18n.News'],
},
'myapp_i18n.NewsExtended': {
'languages': ['en', 'fr', ],
'overwrites': {
'inherit': ['myapp.NewsExtended', 'myapp_i18n.NewsComplete'],
},
}
if with_cms:
newsTypes.update({
# CMS Models
'myapp_cms.News': {
'inherit': ['myapp.News', ],
0: {
'newsbox_summary': '<p>Summary of the news %(i)d</p>',
'newsbox_body': '<p>Body of the news %(i)d</p>',
},
'myapp_cms.NewsComplete': {
'inherit': ['myapp.NewsComplete', 'myapp_cms.News'],
'myapp_cms.NewsExtended': {
'inherit': ['myapp_cms.NewsComplete'],
'inherit': ['myapp.News', ],
'newsbox_summary': '<p>Summary of the news %(i)d</p>',
'newsbox_body': '<p>Body of the news %(i)d</p>',
'myapp_all.NewsComplete': {
'inherit': ['myapp.NewsComplete', 'myapp_all.News'],
'myapp_all.NewsExtended': {
'inherit': ['myapp.NewsExtended', 'myapp_all.NewsComplete'],
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
})
def get_fields_values(newsTypes, newsType, i, inherited):
fields_values = {}
if newsType in inherited:
return fields_values
inherited.append(newsType)
for inheritedType in newsTypes[newsType]['overwrites']['inherit']:
fields_values.update(get_fields_values(newsTypes, inheritedType, i, []))
if i in newsTypes[newsType]['overwrites']:
fields_values.update(newsTypes[newsType]['overwrites'][i])
return fields_values
def create_tests_data(app=None, verbosity=0):
# Translations of translatable fields
translations = {
'en': {
# default content is already in english
},
'fr': {
'newsbox_slug': 'actualite-%(i)d',
'newsbox_title': 'Actualité %(i)d',
'newsbox_summary': 'Résumé de l\'actualité %(i)d',
'newsbox_body': 'Corps de l\'actualité %(i)d',
'newsbox_meta_description': 'Meta description de l\'actualité %(i)d',
'newsbox_meta_keywords': 'motclef1, motclef2, actualite-%(i)d',
'content_field': 'Contenu additionnel de l\'actualité %(i)d',
'seo_field': 'SEO additionnel de l\'actualité %(i)d',
},
translatable_fields = translations['fr'].keys()
nb_news_a_creer = len(newsTypes['myapp.News']['overwrites'])-2
app_label, model_name = newsType.split('.')
if app and app != app_label:
model = get_model(app_label, model_name)
if with_cms:
# Transform field into placeholders if needed
ph_names = getattr(model._meta, 'placeholder_field_names')
base_kwargs = get_fields_values(newsTypes, newsType, 0, [])
if verbosity >= 2:
print('\n%s\n' % newsType + '-' * len(newsType))
for lang in infos['languages']:
kwargs = base_kwargs.copy()
kwargs.update(get_fields_values(newsTypes, newsType, i, []))
if lang and lang in translations and translations[lang]:
for k in translations[lang]:
if kwargs[k][0:3] == '<p>':
kwargs[k] = '<p>'+translations[lang][k]+'</p>'
else:
kwargs[k] = translations[lang][k]
if isinstance(kwargs[k], type('')):
kwargs[k] = kwargs[k] % {'i': i}
if with_cms and ph_names:
try:
for ph_name in ph_names:
if ph_name not in kwargs:
continue
ph = Placeholder.objects.create(slot=ph_name)
add_plugin(ph, 'TextPlugin', lang if lang is not None else 'en',
body=kwargs[ph_name])
kwargs[ph_name] = ph
except AttributeError:
pass
translatable_values = {k: v for k, v in kwargs.items()
if k in translatable_fields}
untranslatable_fields = list(set(kwargs) - set(translatable_fields))
untranslatable_values = {k: v for k, v in kwargs.items()
if k in untranslatable_fields}
if verbosity >= 2:
langstr = ' (%s)' % lang if lang else ''
print(' - %d%s : %s' % (i, langstr, kwargs['newsbox_title']))
if not lang or lang == infos['languages'][0]:
news = model(**untranslatable_values)
news.save()
news.create_translation(lang, **translatable_values)
else:
for field, value in translatable_values.items():
setattr(news, field, value)
news.save()
def delete_tests_data(app=None, verbosity=0):
for newsType, infos in newsTypes.items():
app_label, model_name = newsType.split('.')
if app and app != app_label:
continue
model = get_model(app_label, model_name)
# delete one by one to be sure to call signals or save method
for obj in model.objects.all():
obj.delete()