import: form error if cell's related page not found (#44666)
This commit is contained in:
parent
ff1b3c009f
commit
65eb33e06b
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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/')
|
||||
|
|
Loading…
Reference in New Issue