manager: select sections in site export (#46895)
This commit is contained in:
parent
fcc41caa81
commit
3918e5f8ec
|
@ -47,20 +47,26 @@ class MissingGroups(ImportSiteError):
|
|||
return _('Missing groups: %s') % ', '.join(self.names)
|
||||
|
||||
|
||||
def export_site():
|
||||
def export_site(pages=True, cartography=True, pwa=True, assets=True, payment=True):
|
||||
'''Dump site objects to JSON-dumpable dictionnary'''
|
||||
return {'pages': Page.export_all_for_json(),
|
||||
'map-layers': MapLayer.export_all_for_json(),
|
||||
'assets': Asset.export_all_for_json(),
|
||||
'pwa': {
|
||||
'settings': PwaSettings.export_for_json(),
|
||||
'navigation': PwaNavigationEntry.export_all_for_json(),
|
||||
},
|
||||
'payment': {
|
||||
'backends': PaymentBackend.export_all_for_json(),
|
||||
'regies': Regie.export_all_for_json(),
|
||||
}
|
||||
}
|
||||
export = {}
|
||||
if pages:
|
||||
export['pages'] = Page.export_all_for_json()
|
||||
if cartography:
|
||||
export['map-layers'] = MapLayer.export_all_for_json()
|
||||
if assets:
|
||||
export['assets'] = Asset.export_all_for_json()
|
||||
if pwa:
|
||||
export['pwa'] = {
|
||||
'settings': PwaSettings.export_for_json(),
|
||||
'navigation': PwaNavigationEntry.export_all_for_json(),
|
||||
}
|
||||
if payment:
|
||||
export['payment'] = {
|
||||
'backends': PaymentBackend.export_all_for_json(),
|
||||
'regies': Regie.export_all_for_json(),
|
||||
}
|
||||
return export
|
||||
|
||||
|
||||
def import_site(data, if_empty=False, clean=False, request=None):
|
||||
|
@ -118,9 +124,9 @@ def import_site(data, if_empty=False, clean=False, request=None):
|
|||
raise ImportSiteError(_('Unknown page "%s".') % page_slug)
|
||||
|
||||
|
||||
def export_site_tar(fd):
|
||||
def export_site_tar(fd, export_kwargs=None):
|
||||
tar = tarfile.open(mode='w', fileobj=fd)
|
||||
data = export_site()
|
||||
data = export_site(**(export_kwargs or {}))
|
||||
del data['assets']
|
||||
add_tar_content(tar, '_site.json', json.dumps(data, indent=2))
|
||||
tar_assets_files(tar)
|
||||
|
|
|
@ -269,4 +269,9 @@ class SiteImportForm(forms.Form):
|
|||
|
||||
|
||||
class SiteExportForm(forms.Form):
|
||||
include_asset = forms.BooleanField(label=_('Include assets into the export'), required=False)
|
||||
pages = forms.BooleanField(label=_('Pages'), required=False, initial=True)
|
||||
cartography = forms.BooleanField(label=_('Cartography'), required=False, initial=True)
|
||||
pwa = forms.BooleanField(label=_('Mobile application (PWA)'), required=False, initial=True)
|
||||
assets = forms.BooleanField(label=_('Assets (declarations)'), required=False, initial=True)
|
||||
asset_files = forms.BooleanField(label=_('Assets (files)'), required=False, initial=False)
|
||||
payment = forms.BooleanField(label=_('Online Payment'), required=False, initial=True)
|
||||
|
|
|
@ -68,16 +68,20 @@ class SiteExportView(FormView):
|
|||
form_class = SiteExportForm
|
||||
template_name = 'combo/site_export.html'
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
if request.POST.get('include_asset'):
|
||||
def form_valid(self, form):
|
||||
today = datetime.date.today()
|
||||
filename = 'site_export_%s' % today.strftime('%Y%m%d')
|
||||
|
||||
asset_files = form.cleaned_data.pop('asset_files')
|
||||
if asset_files:
|
||||
fd = BytesIO()
|
||||
export_site_tar(fd)
|
||||
export_site_tar(fd, export_kwargs=form.cleaned_data)
|
||||
response = HttpResponse(content=fd.getvalue(), content_type='application/x-tar')
|
||||
response['Content-Disposition'] = 'attachment; filename="site-export.tar"'
|
||||
response['Content-Disposition'] = 'attachment; filename="%s.tar"' % filename
|
||||
else:
|
||||
response = HttpResponse(content_type='application/json')
|
||||
response['Content-Disposition'] = 'attachment; filename="site-export.json"'
|
||||
json.dump(export_site(), response, indent=2)
|
||||
response['Content-Disposition'] = 'attachment; filename="%s.json"' % filename
|
||||
json.dump(export_site(**form.cleaned_data), response, indent=2)
|
||||
return response
|
||||
|
||||
|
||||
|
|
|
@ -771,6 +771,22 @@ def test_site_export_import_json(app, admin_user):
|
|||
assert LinkCell.objects.get(page__slug='one').link_page.slug == 'two'
|
||||
assert LinkCell.objects.get(page__slug='two').link_page.slug == 'one'
|
||||
|
||||
resp = app.get('/manage/')
|
||||
resp = resp.click('Export Site')
|
||||
resp.form['pages'] = False
|
||||
resp = resp.form.submit()
|
||||
site_export = resp.body
|
||||
|
||||
site_json = json.loads(site_export.decode())
|
||||
assert 'pages' not in site_json
|
||||
assert 'pwa' in site_json
|
||||
|
||||
Page.objects.all().delete()
|
||||
resp = app.get('/manage/')
|
||||
resp = resp.click('Import Site')
|
||||
resp.form['site_file'] = Upload('site-export.json', site_export, 'application/json')
|
||||
assert Page.objects.count() == 0
|
||||
|
||||
# check with invalid file
|
||||
resp = app.get('/manage/')
|
||||
resp = resp.click('Import Site')
|
||||
|
@ -792,7 +808,7 @@ def test_site_export_import_tar(app, admin_user):
|
|||
app = login(app)
|
||||
resp = app.get('/manage/')
|
||||
resp = resp.click('Export Site')
|
||||
resp.form['include_asset'] = True
|
||||
resp.form['asset_files'] = True
|
||||
resp = resp.form.submit()
|
||||
assert resp.headers['content-type'] == 'application/x-tar'
|
||||
site_export = resp.body
|
||||
|
|
Loading…
Reference in New Issue