# -*- coding: utf-8 -*- from __future__ import unicode_literals from myapp.models import News, NewsExpired, NewsSEO, NewsComplete, NewsExtended from myapp_cms.models import News as cms_News from myapp_cms.models import NewsComplete as cms_NewsComplete from myapp_cms.models import NewsExtended as cms_NewsExtended from myapp_i18n.models import News as i18n_News from myapp_i18n.models import NewsComplete as i18n_NewsComplete from myapp_i18n.models import NewsExtended as i18n_NewsExtended from myapp_all.models import News as all_News from myapp_all.models import NewsComplete as all_NewsComplete from myapp_all.models import NewsExtended as all_NewsExtended from cms.models.placeholdermodel import Placeholder from cms.api import add_plugin 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): # Translations of translatable fields translations = { 'en': { # default content is already in english }, 'fr': { 'newsbox_slug': 'actualite-%d', 'newsbox_title': 'Actualité %d', 'newsbox_summary': 'Résumé de l\'actualité %d', 'newsbox_body': 'Corps de l\'actualité %d', 'newsbox_meta_description': 'Meta description de l\'actualité %d', 'newsbox_meta_keywords': 'motclef1, motclef2, actualite-%d', 'content_field': 'Contenu additionnel de l\'actualité %d', 'seo_field': 'SEO additionnel de l\'actualité %d', }, } translatable_fields = translations['fr'].keys() # 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 = { 'News': { 'model': News, 'overwrites': { 'inherit': [], # 0 is for base values 0: { 'newsbox_slug': 'news-%d', 'newsbox_title': 'News %d', 'newsbox_date': '2014-02-22T10:00:00+02:00', 'newsbox_publication_start_date': '1985-07-02T10:00:00+02:00', 'newsbox_published': True, 'newsbox_summary': 'Summary of the news %d', 'newsbox_body': 'Body of the news %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': '2005-07-15T10:00:00+02:00'}, 7: {'newsbox_date': '2020-01-01T10:00:00+02:00'}, }, }, 'NewsExpired': { 'model': NewsExpired, 'overwrites': { 'inherit': ['News', ], 5: { 'newsbox_published': True, 'newsbox_publication_end_date': '2000-01-01T10:00:00+02:00', }, }, }, 'NewsSEO': { 'model': NewsSEO, 'overwrites': { 'inherit': ['News', ], 0: { 'newsbox_indexed': True, 'newsbox_meta_description': 'Meta description of the news %d', 'newsbox_meta_keywords': 'keyword1, keyword2, news-%d', }, 6: { 'newsbox_indexed': False, }, }, }, 'NewsComplete': { 'model': NewsComplete, 'overwrites': { 'inherit': ['NewsExpired', 'NewsSEO'], }, }, 'NewsExtended': { 'model': NewsExtended, 'overwrites': { 'inherit': ['NewsComplete'], 0: { 'general_field': 'Test', 'content_field': 'Extra content of the news %d', 'seo_field': 'Extra SEO of the news %d', }, } }, # CMS Models 'cms_News': { 'model': cms_News, 'overwrites': { 'inherit': ['News', ], 0: { 'newsbox_summary': '<p>Summary of the news %d</p>', 'newsbox_body': '<p>Body of the news %d</p>', }, }, }, 'cms_NewsComplete': { 'model': cms_NewsComplete, 'overwrites': { 'inherit': ['NewsComplete', 'cms_News'], }, }, 'cms_NewsExtended': { 'model': cms_NewsExtended, 'overwrites': { 'inherit': ['cms_NewsComplete'], }, }, # I18N Models 'i18n_News': { 'languages': ['en', 'fr', ], 'model': i18n_News, 'overwrites': { 'inherit': ['News', ], }, }, 'i18n_NewsComplete': { 'languages': ['en', 'fr', ], 'model': i18n_NewsComplete, 'overwrites': { 'inherit': ['NewsComplete', 'i18n_News'], }, }, 'i18n_NewsExtended': { 'languages': ['en', 'fr', ], 'model': i18n_NewsExtended, 'overwrites': { 'inherit': ['NewsExtended', 'i18n_NewsComplete'], }, }, # ALL Models 'all_News': { 'languages': ['en', 'fr', ], 'model': all_News, 'overwrites': { 'inherit': ['News', ], 0: { 'newsbox_summary': '<p>Summary of the news %d</p>', 'newsbox_body': '<p>Body of the news %d</p>', }, }, }, 'all_NewsComplete': { 'languages': ['en', 'fr', ], 'model': all_NewsComplete, 'overwrites': { 'inherit': ['NewsComplete', 'all_News'], }, }, 'all_NewsExtended': { 'languages': ['en', 'fr', ], 'model': all_NewsExtended, 'overwrites': { 'inherit': ['NewsExtended', 'all_NewsComplete'], }, }, } nb_news_a_creer = len(newsTypes['News']['overwrites'])-2 for newsType, infos in newsTypes.items(): if app and (app + '_') not in newsType: continue base_kwargs = get_fields_values(newsTypes, newsType, 0, []) print '\n%s\n' % newsType + '-' * len(newsType) for i in range(1, nb_news_a_creer+1): if 'languages' not in infos: infos['languages'] = [None, ] for lang in infos['languages']: kwargs = base_kwargs.copy() kwargs.update(get_fields_values(newsTypes, newsType, i, [])) # Retrieve translated values if a lang is specified if lang and lang in translations and translations[lang]: for k in translations[lang]: if k in kwargs: if kwargs[k][0:3] == '<p>': kwargs[k] = '<p>'+translations[lang][k]+'</p>' else: kwargs[k] = translations[lang][k] # Add the "nth" informations for fields which need it for k in kwargs: if type(kwargs[k]) in (str, unicode) and '%d' in kwargs[k]: kwargs[k] = kwargs[k] % i try: # Transform field into placeholders if needed ph_names = getattr(infos['model']._meta, 'placeholder_field_names') 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} langstr = ' (%s)' % lang if lang else '' print ' - %d%s : %s' % (i, langstr, kwargs['newsbox_title']) if lang == infos['languages'][0]: news = infos['model'](**untranslatable_values) if lang: news.translate(lang) for k in translatable_values: setattr(news, k, translatable_values[k]) news.save()