importing/exporting tools improved: sub plugins correctly retreived
This commit is contained in:
parent
a56b3882cc
commit
b664910ece
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
Reference in New Issue