52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
import json
|
|
from optparse import make_option
|
|
from django.core.management.base import BaseCommand
|
|
from django.core.serializers.json import DjangoJSONEncoder
|
|
|
|
from cms.models import Page, CMSPlugin
|
|
from django.core import serializers
|
|
from pprint import pprint
|
|
|
|
exclude_attrs = {'Page': ('parent', 'site',
|
|
'reverse_id', 'publisher_public'),
|
|
'Placeholder': (),
|
|
'CMSPlugin': ('placeholder', 'parent',),
|
|
'Title': ('page', )
|
|
}
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Dumps CMS page and its content(if required)'
|
|
args = 'output.json'
|
|
|
|
option_list = BaseCommand.option_list + (
|
|
make_option('--page', action='store', default=1),
|
|
make_option('--lang', action='store', default='fr'),
|
|
make_option('--output', action='store', default='dump.json')
|
|
)
|
|
|
|
def _serialize(self, data, natural_key):
|
|
obj_type = data._meta.object_name
|
|
raw_data = serializers.serialize('python', [data])[0]
|
|
|
|
raw_data.pop('pk')
|
|
# remove useless key
|
|
map(lambda attr: raw_data['fields'].pop(attr), exclude_attrs[obj_type])
|
|
raw_data.update(natural_key)
|
|
return raw_data #json.dumps(raw_data, cls=DjangoJSONEncoder)
|
|
|
|
def serialize_page(self, page):
|
|
key = {'pk': page.get_path(self.options['lang'])}
|
|
title = page.title_set.get(language=self.options['lang'])
|
|
return [self._serialize(page, key), self._serialize(title, key)]
|
|
|
|
def serialize_placeholders(self, placeholders):
|
|
return serializers.serialize('python', placeholders)
|
|
# return json.dumps(raw_data, cls=DjangoJSONEncoder)
|
|
|
|
def handle(self, *args, **options):
|
|
self.options = options
|
|
page = Page.objects.get(pk=options['page'])
|
|
data = self.serialize_page(page) + self.serialize_placeholders(page.placeholders.all())
|
|
with open(options.get('output'), 'w') as output:
|
|
json.dump(data, output, cls=DjangoJSONEncoder)
|