Projet

Général

Profil

0001-import-form-error-if-cell-s-related-page-not-found-4.patch

Lauréline Guérin, 08 septembre 2020 14:21

Télécharger (6,66 ko)

Voir les différences:

Subject: [PATCH] import: form error if cell's related page not found (#44666)

 combo/data/utils.py    | 25 ++++++++++++++++++-------
 combo/manager/views.py |  6 +++---
 tests/test_manager.py  | 41 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 10 deletions(-)
combo/data/utils.py
18 18
import tarfile
19 19

  
20 20
from django.contrib.auth.models import Group
21
from django.core.serializers.base import DeserializationError
21 22
from django.db import transaction
22 23
from django.utils import six
23 24
from django.utils.encoding import python_2_unicode_compatible
......
88 89
            PwaSettings.objects.all().delete()
89 90
            PwaNavigationEntry.objects.all().delete()
90 91

  
91
        MapLayer.load_serialized_objects(data.get('map-layers') or [])
92
        Asset.load_serialized_objects(data.get('assets') or [])
93
        Page.load_serialized_pages(data.get('pages') or [], request=request)
94

  
95
        if data.get('pwa'):
96
            PwaSettings.load_serialized_settings(data['pwa'].get('settings'))
97
            PwaNavigationEntry.load_serialized_objects(data['pwa'].get('navigation'))
92
        try:
93
            MapLayer.load_serialized_objects(data.get('map-layers') or [])
94
            Asset.load_serialized_objects(data.get('assets') or [])
95
            Page.load_serialized_pages(data.get('pages') or [], request=request)
96

  
97
            if data.get('pwa'):
98
                PwaSettings.load_serialized_settings(data['pwa'].get('settings'))
99
                PwaNavigationEntry.load_serialized_objects(data['pwa'].get('navigation'))
100
        except DeserializationError as e:
101
            message = str(e)
102
            if not message.startswith('Page matching query does not exist.'):
103
                raise ImportSiteError(message)
104
            try:
105
                page_slug = message.split("'['")[1].split("']'")[0]
106
            except IndexError:
107
                raise ImportSiteError(message)
108
            raise ImportSiteError(_('Unknown page "%s".') % page_slug)
98 109

  
99 110

  
100 111
def export_site_tar(fd):
combo/manager/views.py
40 40
from combo.data.models import Page, CellBase, ParentContentCell, PageSnapshot, LinkListCell
41 41
from combo.data.library import get_cell_class
42 42
from combo.data.utils import (
43
    export_site, export_site_tar, import_site, import_site_tar, MissingGroups)
43
    export_site, export_site_tar, import_site, import_site_tar, ImportSiteError)
44 44
from combo import plugins
45 45

  
46 46
from .forms import (PageAddForm, PageEditTitleForm, PageVisibilityForm, SiteImportForm, SiteExportForm,
......
93 93
        fd = self.request.FILES['site_file'].file
94 94
        try:
95 95
            tarfile.open(mode='r', fileobj=fd)
96
        except tarfile.TarError as e:
96
        except tarfile.TarError:
97 97
            try:
98 98
                fd.seek(0)
99 99
                json_site = json.loads(force_text(fd.read()))
......
110 110
                import_site(json_site, request=self.request)
111 111
            else:
112 112
                import_site_tar(fd, request=self.request)
113
        except MissingGroups as e:
113
        except ImportSiteError as e:
114 114
            form.add_error('site_file', force_text(e))
115 115
            return self.form_invalid(form)
116 116

  
tests/test_manager.py
8 8

  
9 9
from django.core.files import File
10 10
from django.core.files.storage import default_storage
11
from django.core.serializers.base import DeserializationError
11 12
from django.urls import reverse
12 13
from django.conf import settings
13 14
from django.contrib.auth.models import Group
......
849 850
    assert 'Unknown parent for page "One"; parent has been reset and page was excluded from navigation.' in resp.text
850 851

  
851 852

  
853
def test_site_export_import_unknown_page(app, admin_user):
854
    page = Page.objects.create(title='One', slug='one')
855
    page2 = Page.objects.create(title='Two', slug='two')
856
    MenuCell.objects.create(root_page=page2, page=page, order=0, slug='carrousel', placeholder='content')
857

  
858
    app = login(app)
859
    resp = app.get('/manage/site-export')
860
    resp = resp.form.submit()
861
    payload = json.loads(force_str(resp.body))
862
    payload['pages'][0]['cells'][0]['fields']['root_page'] = ['unknown-parent']
863
    Page.objects.all().delete()
864

  
865
    resp = app.get('/manage/site-import')
866
    resp.form['site_file'] = Upload('site-export.json', force_bytes(json.dumps(payload)), 'application/json')
867
    resp = resp.form.submit()
868
    assert resp.context['form'].errors['site_file'] == ['Unknown page "unknown-parent".']
869
    assert Page.objects.count() == 0
870

  
871
    resp = app.get('/manage/site-import')
872
    resp.form['site_file'] = Upload('site-export.json', force_bytes(json.dumps(payload)), 'application/json')
873
    with mock.patch('combo.data.models.Page.load_serialized_pages') as mock_load:
874
        mock_load.side_effect = DeserializationError('foo bar')
875
        resp = resp.form.submit()
876
    assert resp.context['form'].errors['site_file'] == ['foo bar']
877

  
878
    resp = app.get('/manage/site-import')
879
    resp.form['site_file'] = Upload('site-export.json', force_bytes(json.dumps(payload)), 'application/json')
880
    with mock.patch('combo.data.models.Page.load_serialized_pages') as mock_load:
881
        mock_load.side_effect = DeserializationError("Page matching query does not exist.")
882
        resp = resp.form.submit()
883
    assert resp.context['form'].errors['site_file'] == ['Page matching query does not exist.']
884

  
885
    resp = app.get('/manage/site-import')
886
    resp.form['site_file'] = Upload('site-export.json', force_bytes(json.dumps(payload)), 'application/json')
887
    with mock.patch('combo.data.models.Page.load_serialized_pages') as mock_load:
888
        mock_load.side_effect = DeserializationError("Page matching query does not exist. '['blah")
889
        resp = resp.form.submit()
890
    assert resp.context['form'].errors['site_file'] == ['Unknown page "blah".']
891

  
892

  
852 893
def test_invalid_cell_report(app, admin_user):
853 894
    app = login(app)
854 895
    resp = app.get('/manage/cells/invalid-report/')
855
-