manager: select sections in site export (#46895)

This commit is contained in:
Valentin Deniaud 2020-11-03 17:03:09 +01:00
parent fcc41caa81
commit 3918e5f8ec
4 changed files with 54 additions and 23 deletions

View File

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

View File

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

View File

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

View File

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