# -*- coding: utf-8 -*- 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': { 'overwrites': { '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': { 'overwrites': { 'inherit': ['myapp.NewsComplete', 'myapp_cms.News'], }, }, 'myapp_cms.NewsExtended': { 'overwrites': { 'inherit': ['myapp_cms.NewsComplete'], }, }, # ALL Models 'myapp_all.News': { 'languages': ['en', 'fr', ], 'overwrites': { '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_all.NewsComplete': { 'languages': ['en', 'fr', ], 'overwrites': { 'inherit': ['myapp.NewsComplete', 'myapp_all.News'], }, }, 'myapp_all.NewsExtended': { 'languages': ['en', 'fr', ], 'overwrites': { 'inherit': ['myapp.NewsExtended', 'myapp_all.NewsComplete'], }, }, }) 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 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) 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 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 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) if lang: 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()