Projet

Général

Profil

0002-manager-select-sections-in-site-export-46895.patch

Valentin Deniaud, 03 novembre 2020 17:08

Télécharger (5,82 ko)

Voir les différences:

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(-)
combo/data/utils.py
47 47
        return _('Missing groups: %s') % ', '.join(self.names)
48 48

  
49 49

  
50
def export_site():
50
def export_site(pages=True, cartography=True, pwa=True, assets=True, payment=True):
51 51
    '''Dump site objects to JSON-dumpable dictionnary'''
52
    return {'pages': Page.export_all_for_json(),
53
            'map-layers': MapLayer.export_all_for_json(),
54
            'assets': Asset.export_all_for_json(),
55
            'pwa': {
56
                'settings': PwaSettings.export_for_json(),
57
                'navigation': PwaNavigationEntry.export_all_for_json(),
58
            },
59
            'payment': {
60
                'backends': PaymentBackend.export_all_for_json(),
61
                'regies': Regie.export_all_for_json(),
62
            }
63
           }
52
    export = {}
53
    if pages:
54
        export['pages'] = Page.export_all_for_json()
55
    if cartography:
56
        export['map-layers'] = MapLayer.export_all_for_json()
57
    if assets:
58
        export['assets'] = Asset.export_all_for_json()
59
    if pwa:
60
        export['pwa'] = {
61
            'settings': PwaSettings.export_for_json(),
62
            'navigation': PwaNavigationEntry.export_all_for_json(),
63
        }
64
    if payment:
65
        export['payment'] = {
66
            'backends': PaymentBackend.export_all_for_json(),
67
            'regies': Regie.export_all_for_json(),
68
        }
69
    return export
64 70

  
65 71

  
66 72
def import_site(data, if_empty=False, clean=False, request=None):
......
118 124
            raise ImportSiteError(_('Unknown page "%s".') % page_slug)
119 125

  
120 126

  
121
def export_site_tar(fd):
127
def export_site_tar(fd, export_kwargs=None):
122 128
    tar = tarfile.open(mode='w', fileobj=fd)
123
    data = export_site()
129
    data = export_site(**(export_kwargs or {}))
124 130
    del data['assets']
125 131
    add_tar_content(tar, '_site.json', json.dumps(data, indent=2))
126 132
    tar_assets_files(tar)
combo/manager/forms.py
269 269

  
270 270

  
271 271
class SiteExportForm(forms.Form):
272
    include_asset = forms.BooleanField(label=_('Include assets into the export'), required=False)
272
    pages = forms.BooleanField(label=_('Pages'), required=False, initial=True)
273
    cartography = forms.BooleanField(label=_('Cartography'), required=False, initial=True)
274
    pwa = forms.BooleanField(label=_('Mobile application (PWA)'), required=False, initial=True)
275
    assets = forms.BooleanField(label=_('Assets (declarations)'), required=False, initial=True)
276
    asset_files = forms.BooleanField(label=_('Assets (files)'), required=False, initial=False)
277
    payment = forms.BooleanField(label=_('Online Payment'), required=False, initial=True)
combo/manager/views.py
68 68
    form_class = SiteExportForm
69 69
    template_name = 'combo/site_export.html'
70 70

  
71
    def post(self, request, *args, **kwargs):
72
        if request.POST.get('include_asset'):
71
    def form_valid(self, form):
72
        asset_files = form.cleaned_data.pop('asset_files')
73
        if asset_files:
73 74
            fd = BytesIO()
74
            export_site_tar(fd)
75
            export_site_tar(fd, export_kwargs=form.cleaned_data)
75 76
            response = HttpResponse(content=fd.getvalue(), content_type='application/x-tar')
76 77
            response['Content-Disposition'] = 'attachment; filename="site-export.tar"'
77 78
        else:
78 79
            response = HttpResponse(content_type='application/json')
79 80
            response['Content-Disposition'] = 'attachment; filename="site-export.json"'
80
            json.dump(export_site(), response, indent=2)
81
            json.dump(export_site(**form.cleaned_data), response, indent=2)
81 82
        return response
82 83

  
83 84

  
tests/test_manager.py
771 771
    assert LinkCell.objects.get(page__slug='one').link_page.slug == 'two'
772 772
    assert LinkCell.objects.get(page__slug='two').link_page.slug == 'one'
773 773

  
774
    resp = app.get('/manage/')
775
    resp = resp.click('Export Site')
776
    resp.form['pages'] = False
777
    resp = resp.form.submit()
778
    site_export = resp.body
779

  
780
    site_json = json.loads(site_export)
781
    assert 'pages' not in site_json
782
    assert 'pwa' in site_json
783

  
784
    Page.objects.all().delete()
785
    resp = app.get('/manage/')
786
    resp = resp.click('Import Site')
787
    resp.form['site_file'] = Upload('site-export.json', site_export, 'application/json')
788
    assert Page.objects.count() == 0
789

  
774 790
    # check with invalid file
775 791
    resp = app.get('/manage/')
776 792
    resp = resp.click('Import Site')
......
792 808
    app = login(app)
793 809
    resp = app.get('/manage/')
794 810
    resp = resp.click('Export Site')
795
    resp.form['include_asset'] = True
811
    resp.form['asset_files'] = True
796 812
    resp = resp.form.submit()
797 813
    assert resp.headers['content-type'] == 'application/x-tar'
798 814
    site_export = resp.body
799
-