From 057ba283a79b3b589edf3541d8e8ad606529b18b Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 3 Nov 2020 17:03:09 +0100 Subject: [PATCH 2/2] manager: select sections in site export (#46895) --- combo/data/utils.py | 36 +++++++++++++++++++++--------------- combo/manager/forms.py | 7 ++++++- combo/manager/views.py | 9 +++++---- tests/test_manager.py | 18 +++++++++++++++++- 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/combo/data/utils.py b/combo/data/utils.py index 9bb0094a..f70237bd 100644 --- a/combo/data/utils.py +++ b/combo/data/utils.py @@ -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) diff --git a/combo/manager/forms.py b/combo/manager/forms.py index 2d2a67d7..ba5b01ae 100644 --- a/combo/manager/forms.py +++ b/combo/manager/forms.py @@ -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) diff --git a/combo/manager/views.py b/combo/manager/views.py index 80e3e35a..1e382202 100644 --- a/combo/manager/views.py +++ b/combo/manager/views.py @@ -68,16 +68,17 @@ 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): + 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"' else: response = HttpResponse(content_type='application/json') response['Content-Disposition'] = 'attachment; filename="site-export.json"' - json.dump(export_site(), response, indent=2) + json.dump(export_site(**form.cleaned_data), response, indent=2) return response diff --git a/tests/test_manager.py b/tests/test_manager.py index 9d046385..b0f9966c 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -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) + 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 -- 2.20.1