importing/exporting tools improved: sub plugins correctly retreived

This commit is contained in:
Serghei Mihai 2014-04-22 17:32:59 +02:00
parent a56b3882cc
commit b664910ece
2 changed files with 43 additions and 20 deletions

View File

@ -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):

View File

@ -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)