From b664910eceab08bb7a9291f12ff4542691a16948 Mon Sep 17 00:00:00 2001 From: Serghei MIHAI Date: Tue, 22 Apr 2014 17:32:59 +0200 Subject: [PATCH] importing/exporting tools improved: sub plugins correctly retreived --- .../management/commands/exportpage.py | 20 ++++++--- .../management/commands/importpage.py | 43 ++++++++++++------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/portail_citoyen/management/commands/exportpage.py b/portail_citoyen/management/commands/exportpage.py index 3bf8888..3a79be5 100644 --- a/portail_citoyen/management/commands/exportpage.py +++ b/portail_citoyen/management/commands/exportpage.py @@ -10,7 +10,7 @@ from django.core import serializers exclude_attrs = {'Page': ('site', 'id'), 'Placeholder': ('id', ), 'CMSPlugin': (), - 'Title': () + 'Title': (), } def title_natural_key(self): @@ -40,9 +40,18 @@ class Command(BaseCommand): def _serialize(self, data): model_name = data.__class__.__name__ model_fields = [field[0].name for field in data._meta.get_fields_with_model()] - fields = set(model_fields) - set(exclude_attrs[model_name]) + if exclude_attrs.get(model_name): + fields = set(model_fields) - set(exclude_attrs[model_name]) + else: + fields = set(model_fields) return serializers.serialize('python', (data,), use_natural_keys=True, fields=fields) + def _serialize_plugin(self, plugin): + instance, model = plugin.get_plugin_instance() + data = self._serialize(instance) + data[0]['fields'].update(self._serialize(plugin)[0]['fields']) + return data + def serialize_page(self, page): """ serialize the page and its title @@ -63,16 +72,17 @@ class Command(BaseCommand): for placeholder in placeholders: [serialized_placeholder] = self._serialize(placeholder) serialized_placeholder['fields']['page'] = placeholder.page.natural_key() - data += [serialized_placeholder] + self.serialize_plugins(placeholder.cmsplugin_set.all()) + data += [serialized_placeholder] + self.serialize_cmsplugins(placeholder.cmsplugin_set.all()) return data - def serialize_plugins(self, plugins): + def serialize_cmsplugins(self, plugins): """ serialize plugins and sub plugins """ data = [] for plugin in plugins: - data += self._serialize(plugin) + self.serialize_plugins(plugin.cmsplugin_set.filter(parent__isnull=True)) + # data += self._serialize_plugin(plugin) + data += self._serialize_plugin(plugin) + self.serialize_cmsplugins(plugin.cmsplugin_set.filter(parent__isnull=True)) return data def handle(self, *args, **options): diff --git a/portail_citoyen/management/commands/importpage.py b/portail_citoyen/management/commands/importpage.py index 46465bd..8622ac0 100644 --- a/portail_citoyen/management/commands/importpage.py +++ b/portail_citoyen/management/commands/importpage.py @@ -1,5 +1,6 @@ import json from optparse import make_option +import re from django.core.management.base import BaseCommand from django.db.models.loading import get_model @@ -24,8 +25,33 @@ class Command(BaseCommand): def load_object(self, obj): model = obj['model'].split('.')[1] - getattr(self, 'load_%s' % model)(obj['fields']) - # return json.loads(dump) + try: + getattr(self, 'load_%s' % model)(obj['fields']) + except AttributeError: + self.load_plugin(obj) + + def load_plugin(self, obj): + model = self._get_model(obj['model']) + parent = obj['fields'].pop('parent') + placeholder = obj['fields'].pop('placeholder') + placeholder = Placeholder.objects.get(slot=placeholder[1], + page__title_set__path__in=(placeholder[0],), + page__publisher_draft__isnull=True) + obj['fields']['placeholder'] = placeholder + if parent: + parent = CMSPlugin.objects.get(position=parent[3], + plugin_type=parent[2], + placeholder=placeholder) + instance, klass = parent.get_plugin_instance() + obj['fields']['parent'] = parent + new_obj = model(**obj['fields']) + new_obj.save(no_signals=True) + + # update child's id in parent's body + if parent and hasattr(instance, 'body'): + instance.body = re.sub('plugin_obj_\d+', + 'plugin_obj_%s' % new_obj.id, instance.body) + instance.save() def get_page_parent(self, page_path): @@ -69,19 +95,6 @@ class Command(BaseCommand): title = Title(**obj) title.save() - def load_cmsplugin(self, obj): - parent = obj.pop('parent') - placeholder = obj.pop('placeholder') - obj['placeholder'] = Placeholder.objects.get(slot=placeholder[1], - page__title_set__path__in=(placeholder[0],), - page__publisher_draft__isnull=True) - if parent: - obj['parent'] = CMSPlugin.objects.get(position=parent[3], - plugin_type=parent[2], - placeholder=obj['placeholder']) - plugin = CMSPlugin(**obj) - plugin.save(no_signals=True) - def handle(self, *args, **options): with open(options.get('dump')) as dump: data = json.load(dump)