Skip to content
Snippets Groups Projects
utils.py 9.61 KiB
Newer Older
Olivier Le Brouster's avatar
Olivier Le Brouster committed
# -*- coding: utf-8 -*-
Dylann Cordel's avatar
Dylann Cordel committed

Olivier Le Brouster's avatar
Olivier Le Brouster committed
from __future__ import unicode_literals
Dylann Cordel's avatar
Dylann Cordel committed

Olivier Le Brouster's avatar
Olivier Le Brouster committed
from myapp.models import News, NewsExpired, NewsSEO, NewsComplete, NewsExtended
Dylann Cordel's avatar
Dylann Cordel committed
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
Olivier Le Brouster's avatar
Olivier Le Brouster committed
from cms.models.placeholdermodel import Placeholder
from cms.api import add_plugin

Dylann Cordel's avatar
Dylann Cordel committed

Olivier Le Brouster's avatar
Olivier Le Brouster committed
def get_fields_values(newsTypes, newsType, i, inherited):
Dylann Cordel's avatar
Dylann Cordel committed
    fields_values = {}
    if newsType in inherited:
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        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

Dylann Cordel's avatar
Dylann Cordel committed

Olivier Le Brouster's avatar
Olivier Le Brouster committed
def create_tests_data(app=None):
Dylann Cordel's avatar
Dylann Cordel committed
    # Translations of translatable fields
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    translations = {
Dylann Cordel's avatar
Dylann Cordel committed
        'en': {
            # default content is already in english
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        },
Dylann Cordel's avatar
Dylann Cordel committed
        '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',
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        },
    }
    translatable_fields = translations['fr'].keys()
Dylann Cordel's avatar
Dylann Cordel committed
    # 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 :
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    #   - 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.
Dylann Cordel's avatar
Dylann Cordel committed
    # Only used for I18N Models. Translations are in "translations" variable.
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    newsTypes = {
Dylann Cordel's avatar
Dylann Cordel committed
        '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',
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                },
Dylann Cordel's avatar
Dylann Cordel committed
                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'},
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        'NewsExpired': {
            'model': NewsExpired,
            'overwrites': {
                'inherit': ['News', ],
                5: {
                    'newsbox_published': True,
                    'newsbox_publication_end_date': '2000-01-01T10:00:00+02:00',
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                },
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        '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',
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                },
Dylann Cordel's avatar
Dylann Cordel committed
                6: {
                    'newsbox_indexed': False,
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                },
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        'NewsComplete': {
            'model': NewsComplete,
            'overwrites': {
                'inherit': ['NewsExpired', 'NewsSEO'],
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        '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',
Dylann Cordel's avatar
Dylann Cordel committed
        # 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>',
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                },
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        'cms_NewsComplete': {
            'model': cms_NewsComplete,
            'overwrites': {
                'inherit': ['NewsComplete', 'cms_News'],
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        'cms_NewsExtended': {
            'model': cms_NewsExtended,
            'overwrites': {
                'inherit': ['cms_NewsComplete'],
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        # I18N Models
        'i18n_News': {
            'languages': ['en', 'fr', ],
            'model': i18n_News,
            'overwrites': {
                'inherit': ['News', ],
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        'i18n_NewsComplete': {
            'languages': ['en', 'fr', ],
            'model': i18n_NewsComplete,
            'overwrites': {
                'inherit': ['NewsComplete', 'i18n_News'],
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        'i18n_NewsExtended': {
            'languages': ['en', 'fr', ],
            'model': i18n_NewsExtended,
            'overwrites': {
                'inherit': ['NewsExtended', 'i18n_NewsComplete'],
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        # 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>',
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                },
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        'all_NewsComplete': {
            'languages': ['en', 'fr', ],
            'model': all_NewsComplete,
            'overwrites': {
                'inherit': ['NewsComplete', 'all_News'],
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
Dylann Cordel's avatar
Dylann Cordel committed
        'all_NewsExtended': {
            'languages': ['en', 'fr', ],
            'model': all_NewsExtended,
            'overwrites': {
                'inherit': ['NewsExtended', 'all_NewsComplete'],
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            },
        },
    }
    nb_news_a_creer = len(newsTypes['News']['overwrites'])-2
    for newsType, infos in newsTypes.items():
Dylann Cordel's avatar
Dylann Cordel committed
        if app and (app + '_') not in newsType:
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            continue
        base_kwargs = get_fields_values(newsTypes, newsType, 0, [])

        print '\n%s\n' % newsType + '-' * len(newsType)
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        for i in range(1, nb_news_a_creer+1):
Dylann Cordel's avatar
Dylann Cordel committed
            if 'languages' not in infos:
                infos['languages'] = [None, ]
Olivier Le Brouster's avatar
Olivier Le Brouster committed

            for lang in infos['languages']:
                kwargs = base_kwargs.copy()
                kwargs.update(get_fields_values(newsTypes, newsType, i, []))
Dylann Cordel's avatar
Dylann Cordel committed
                # Retrieve translated values if a lang is specified
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                if lang and lang in translations and translations[lang]:
                    for k in translations[lang]:
Dylann Cordel's avatar
Dylann Cordel committed
                        if k in kwargs:
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                            if kwargs[k][0:3] == '<p>':
                                kwargs[k] = '<p>'+translations[lang][k]+'</p>'
                            else:
                                kwargs[k] = translations[lang][k]

Dylann Cordel's avatar
Dylann Cordel committed
                # Add the "nth" informations for fields which need it
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                for k in kwargs:
                    if type(kwargs[k]) in (str, unicode) and '%d' in kwargs[k]:
                        kwargs[k] = kwargs[k] % i
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                try:
Dylann Cordel's avatar
Dylann Cordel committed
                    # Transform field into placeholders if needed
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                    ph_names = getattr(infos['model']._meta, 'placeholder_field_names')
                    for ph_name in ph_names:
Dylann Cordel's avatar
Dylann Cordel committed
                        if ph_name not in kwargs:
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                            continue
                        ph = Placeholder.objects.create(slot=ph_name)
Dylann Cordel's avatar
Dylann Cordel committed
                        add_plugin(ph, 'TextPlugin', lang if lang is not None else 'en',
                                   body=kwargs[ph_name])
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                        kwargs[ph_name] = ph
                except AttributeError:
                    pass

Dylann Cordel's avatar
Dylann Cordel committed
                translatable_values = {k: v for k, v in kwargs.items()
                                       if k in translatable_fields}
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                untranslatable_fields = list(set(kwargs) - set(translatable_fields))
Dylann Cordel's avatar
Dylann Cordel committed
                untranslatable_values = {k: v for k, v in kwargs.items()
                                         if k in untranslatable_fields}
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                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)

Dylann Cordel's avatar
Dylann Cordel committed
                if lang:
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                    news.translate(lang)
                for k in translatable_values:
                    setattr(news, k, translatable_values[k])
                news.save()