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

This commit is contained in:
Lauréline Guérin 2020-09-08 14:20:38 +02:00
parent ff1b3c009f
commit 65eb33e06b
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 61 additions and 9 deletions

View File

@ -18,6 +18,7 @@ import json
import tarfile
from django.contrib.auth.models import Group
from django.core.serializers.base import DeserializationError
from django.db import transaction
from django.utils import six
from django.utils.encoding import python_2_unicode_compatible
@ -88,13 +89,23 @@ def import_site(data, if_empty=False, clean=False, request=None):
PwaSettings.objects.all().delete()
PwaNavigationEntry.objects.all().delete()
MapLayer.load_serialized_objects(data.get('map-layers') or [])
Asset.load_serialized_objects(data.get('assets') or [])
Page.load_serialized_pages(data.get('pages') or [], request=request)
try:
MapLayer.load_serialized_objects(data.get('map-layers') or [])
Asset.load_serialized_objects(data.get('assets') or [])
Page.load_serialized_pages(data.get('pages') or [], request=request)
if data.get('pwa'):
PwaSettings.load_serialized_settings(data['pwa'].get('settings'))
PwaNavigationEntry.load_serialized_objects(data['pwa'].get('navigation'))
if data.get('pwa'):
PwaSettings.load_serialized_settings(data['pwa'].get('settings'))
PwaNavigationEntry.load_serialized_objects(data['pwa'].get('navigation'))
except DeserializationError as e:
message = str(e)
if not message.startswith('Page matching query does not exist.'):
raise ImportSiteError(message)
try:
page_slug = message.split("'['")[1].split("']'")[0]
except IndexError:
raise ImportSiteError(message)
raise ImportSiteError(_('Unknown page "%s".') % page_slug)
def export_site_tar(fd):

View File

@ -40,7 +40,7 @@ from django.views.generic import (RedirectView, DetailView,
from combo.data.models import Page, CellBase, ParentContentCell, PageSnapshot, LinkListCell
from combo.data.library import get_cell_class
from combo.data.utils import (
export_site, export_site_tar, import_site, import_site_tar, MissingGroups)
export_site, export_site_tar, import_site, import_site_tar, ImportSiteError)
from combo import plugins
from .forms import (PageAddForm, PageEditTitleForm, PageVisibilityForm, SiteImportForm, SiteExportForm,
@ -93,7 +93,7 @@ class SiteImportView(FormView):
fd = self.request.FILES['site_file'].file
try:
tarfile.open(mode='r', fileobj=fd)
except tarfile.TarError as e:
except tarfile.TarError:
try:
fd.seek(0)
json_site = json.loads(force_text(fd.read()))
@ -110,7 +110,7 @@ class SiteImportView(FormView):
import_site(json_site, request=self.request)
else:
import_site_tar(fd, request=self.request)
except MissingGroups as e:
except ImportSiteError as e:
form.add_error('site_file', force_text(e))
return self.form_invalid(form)

View File

@ -8,6 +8,7 @@ import shutil
from django.core.files import File
from django.core.files.storage import default_storage
from django.core.serializers.base import DeserializationError
from django.urls import reverse
from django.conf import settings
from django.contrib.auth.models import Group
@ -849,6 +850,46 @@ def test_site_export_import_unknown_parent(app, admin_user):
assert 'Unknown parent for page "One"; parent has been reset and page was excluded from navigation.' in resp.text
def test_site_export_import_unknown_page(app, admin_user):
page = Page.objects.create(title='One', slug='one')
page2 = Page.objects.create(title='Two', slug='two')
MenuCell.objects.create(root_page=page2, page=page, order=0, slug='carrousel', placeholder='content')
app = login(app)
resp = app.get('/manage/site-export')
resp = resp.form.submit()
payload = json.loads(force_str(resp.body))
payload['pages'][0]['cells'][0]['fields']['root_page'] = ['unknown-parent']
Page.objects.all().delete()
resp = app.get('/manage/site-import')
resp.form['site_file'] = Upload('site-export.json', force_bytes(json.dumps(payload)), 'application/json')
resp = resp.form.submit()
assert resp.context['form'].errors['site_file'] == ['Unknown page "unknown-parent".']
assert Page.objects.count() == 0
resp = app.get('/manage/site-import')
resp.form['site_file'] = Upload('site-export.json', force_bytes(json.dumps(payload)), 'application/json')
with mock.patch('combo.data.models.Page.load_serialized_pages') as mock_load:
mock_load.side_effect = DeserializationError('foo bar')
resp = resp.form.submit()
assert resp.context['form'].errors['site_file'] == ['foo bar']
resp = app.get('/manage/site-import')
resp.form['site_file'] = Upload('site-export.json', force_bytes(json.dumps(payload)), 'application/json')
with mock.patch('combo.data.models.Page.load_serialized_pages') as mock_load:
mock_load.side_effect = DeserializationError("Page matching query does not exist.")
resp = resp.form.submit()
assert resp.context['form'].errors['site_file'] == ['Page matching query does not exist.']
resp = app.get('/manage/site-import')
resp.form['site_file'] = Upload('site-export.json', force_bytes(json.dumps(payload)), 'application/json')
with mock.patch('combo.data.models.Page.load_serialized_pages') as mock_load:
mock_load.side_effect = DeserializationError("Page matching query does not exist. '['blah")
resp = resp.form.submit()
assert resp.context['form'].errors['site_file'] == ['Unknown page "blah".']
def test_invalid_cell_report(app, admin_user):
app = login(app)
resp = app.get('/manage/cells/invalid-report/')