0001-import-form-error-if-cell-s-related-page-not-found-4.patch
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 |
- |