export_import: rebuild page positions after import (#86627)
gitea/combo/pipeline/head This commit looks good Details

This commit is contained in:
Lauréline Guérin 2024-02-15 12:15:16 +01:00
parent 741efc0e35
commit 21407807ad
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 658 additions and 4 deletions

View File

@ -195,8 +195,6 @@ class ApplicationAsyncJob(models.Model):
self.save()
def process_bundle(self, install=True):
from combo.data.utils import import_site
page_type = 'portal-agent-pages' if is_portal_agent() else 'pages'
pages = []
tar_io = io.BytesIO(self.bundle.read())
@ -221,12 +219,126 @@ class ApplicationAsyncJob(models.Model):
self.application_elements = set()
# install pages
if install and pages:
import_site({'pages': pages}, job=self)
self._import_site(pages)
# create application elements
self.link_objects(pages, increment=not install)
# remove obsolete application elements
self.unlink_obsolete_objects()
def _import_site(self, pages):
from combo.data.models import Page
from combo.data.utils import import_site
# keep pages positions (order and parent) before import
initial_positions = {
str(p.uuid): (str(p.parent.uuid) if p.parent else None, p.order) for p in Page.objects.all()
}
# keep positions (order and parent) of imported pages
imported_positions = {
p['fields']['uuid']: (
p['fields']['parent'][0] if p['fields']['parent'] else None,
p['fields']['order'],
)
for p in pages
}
# import pages
import_site({'pages': pages}, job=self)
# rebuild page positions: first set parents, and then set orders
objects_by_uuid = {str(p.uuid): p for p in Page.objects.all()}
objects_by_uuid[None] = None
# set parents of imported pages
for page_uuid, (parent_uuid, order) in imported_positions.items():
if page_uuid in initial_positions:
# page was already deployed, keep parent initially set on this instance
objects_by_uuid[page_uuid].parent = objects_by_uuid[initial_positions[page_uuid][0]]
objects_by_uuid[page_uuid].save()
continue
# page is newly deployed, set parent
# search siblings in the application
siblings = [k for k, v in imported_positions.items() if k != page_uuid and v[0] == parent_uuid]
# look at siblings parents before the import, but only parents outside in the application
parents = {
v[0] for k, v in initial_positions.items() if k in siblings and v[0] not in imported_positions
}
if not parents or len(parents) > 1:
# no parents outside the application: no change, parent is already correctly set by the import
# more than one parent outside the application: can not decide which one to take; no change, keep parents set by the import
continue
# all siblings at the same place, set page under siblings parent
parent = list(parents)[0]
objects_by_uuid[page_uuid].parent = objects_by_uuid[parent]
objects_by_uuid[page_uuid].save()
# and set orders
objects_by_uuid.pop(None)
# find imported pages and orders from initials
existing_positions = {k: v[1] for k, v in initial_positions.items() if k in imported_positions}
# find not imported pages and orders from initials
not_imported_positions = {
k: v[1] for k, v in initial_positions.items() if k not in imported_positions
}
def order_children(parent):
# find children of the parent
children = [k for k, v in objects_by_uuid.items() if v.parent == parent]
# find children and positions in the application
application_children = {k: imported_positions[k][1] for k in children if k in imported_positions}
# find imported children and initial positions
children_existing_positions = {
k: v for k, v in existing_positions.items() if k in application_children
}
# find not imported children and initial positions
children_not_imported_positions = {
k: v
for k, v in not_imported_positions.items()
if k not in application_children and k in children
}
# determine position of application pages
application_position = None
if children_existing_positions:
application_position = min(children_existing_positions.values())
# all children placed before application pages
before_positions = {
k: v
for k, v in children_not_imported_positions.items()
if application_position is None or v < application_position
}
# all children placed after application pages
after_positions = {
k: v
for k, v in children_not_imported_positions.items()
if application_position is not None and v >= application_position
}
# sort children
ordered_children = [
objects_by_uuid[u] for u in sorted(before_positions, key=lambda a: before_positions[a])
]
ordered_children += [
objects_by_uuid[u]
for u in sorted(application_children, key=lambda a: application_children[a])
]
ordered_children += [
objects_by_uuid[u] for u in sorted(after_positions, key=lambda a: after_positions[a])
]
for child in ordered_children:
# yield child
yield child
# and children of this child
yield from order_children(child)
ordered_pages = list(order_children(None))
order = 1
for page in ordered_pages:
page.order = order
page.save()
order += 1
def import_bundle(self):
self.process_bundle()

View File

@ -271,7 +271,6 @@ def bundle(app, john_doe):
def test_bundle_import(app, john_doe):
Page.objects.all().delete()
app.authorization = ('Basic', (john_doe.username, john_doe.username))
bundles = []
@ -349,6 +348,549 @@ def test_bundle_import(app, john_doe):
assert last_snapshot.application_version == '42.1'
def test_bundle_import_pages_position(app, john_doe):
app.authorization = ('Basic', (john_doe.username, john_doe.username))
page1 = Page.objects.create(
slug='test1',
title='Test Page 1',
template_name='standard',
)
page11 = Page.objects.create(
slug='test11',
title='Test Page 11',
template_name='standard',
parent=page1,
)
page12 = Page.objects.create(
slug='test12',
title='Test Page 12',
template_name='standard',
parent=page1,
)
page121 = Page.objects.create(
slug='test121',
title='Test Page 121',
template_name='standard',
parent=page12,
)
page13 = Page.objects.create(
slug='test13',
title='Test Page 13',
template_name='standard',
parent=page1,
)
page2 = Page.objects.create(
slug='test2',
title='Test Page 2',
template_name='standard',
)
bundle = create_bundle(
[
{'type': 'pages', 'slug': f'{page1.uuid}', 'name': 'Test Page 1', 'auto-dependency': False},
{'type': 'pages', 'slug': f'{page11.uuid}', 'name': 'Test Page 11', 'auto-dependency': False},
{'type': 'pages', 'slug': f'{page12.uuid}', 'name': 'Test Page 12', 'auto-dependency': False},
{'type': 'pages', 'slug': f'{page121.uuid}', 'name': 'Test Page 121', 'auto-dependency': False},
{'type': 'pages', 'slug': f'{page13.uuid}', 'name': 'Test Page 13', 'auto-dependency': False},
{'type': 'pages', 'slug': f'{page2.uuid}', 'name': 'Test Page 2', 'auto-dependency': False},
],
(f'pages/{page1.uuid}', page1),
(f'pages/{page11.uuid}', page11),
(f'pages/{page12.uuid}', page12),
(f'pages/{page121.uuid}', page121),
(f'pages/{page13.uuid}', page13),
(f'pages/{page2.uuid}', page2),
)
# delete pages
Page.objects.all().delete()
# and create other pages
page3 = Page.objects.create(
slug='test3',
title='Test Page 3',
template_name='standard',
)
page4 = Page.objects.create(
slug='test4',
title='Test Page 4',
template_name='standard',
)
page41 = Page.objects.create(
slug='test41',
title='Test Page 41',
template_name='standard',
parent=page4,
)
# import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# pages from application are placed at the end
assert Page.objects.all().count() == 9
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page4.uuid).order == 2
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 3
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page1.uuid).order == 4
assert Page.objects.get(uuid=page1.uuid).parent is None
assert Page.objects.get(uuid=page11.uuid).order == 5
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page12.uuid).order == 6
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page121.uuid).order == 7
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page12.uuid
assert Page.objects.get(uuid=page13.uuid).order == 8
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page2.uuid).order == 9
assert Page.objects.get(uuid=page2.uuid).parent is None
# delete pages
Page.objects.all().delete()
# create only page2, page3, page4, page41 in this order
page2 = Page.objects.create(slug='test2', title='Test Page 2', template_name='standard', uuid=page2.uuid)
page3 = Page.objects.create(
slug='test3',
title='Test Page 3',
template_name='standard',
)
page4 = Page.objects.create(
slug='test4',
title='Test Page 4',
template_name='standard',
)
page41 = Page.objects.create(
slug='test41',
title='Test Page 41',
template_name='standard',
parent=page4,
)
# import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# pages from application are placed before page3
assert Page.objects.all().count() == 9
assert Page.objects.get(uuid=page1.uuid).order == 1
assert Page.objects.get(uuid=page1.uuid).parent is None
assert Page.objects.get(uuid=page11.uuid).order == 2
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page12.uuid).order == 3
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page121.uuid).order == 4
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page12.uuid
assert Page.objects.get(uuid=page13.uuid).order == 5
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page2.uuid).order == 6
assert Page.objects.get(uuid=page2.uuid).parent is None
assert Page.objects.get(uuid=page3.uuid).order == 7
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page4.uuid).order == 8
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 9
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
# delete pages
Page.objects.all().delete()
# create only page3, page2, page4, page41 in this order
page3 = Page.objects.create(
slug='test3',
title='Test Page 3',
template_name='standard',
)
page2 = Page.objects.create(slug='test2', title='Test Page 2', template_name='standard', uuid=page2.uuid)
page4 = Page.objects.create(
slug='test4',
title='Test Page 4',
template_name='standard',
)
page41 = Page.objects.create(
slug='test41',
title='Test Page 41',
template_name='standard',
parent=page4,
)
# import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# pages from application are placed between page3 and page4
assert Page.objects.all().count() == 9
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page1.uuid).order == 2
assert Page.objects.get(uuid=page1.uuid).parent is None
assert Page.objects.get(uuid=page11.uuid).order == 3
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page12.uuid).order == 4
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page121.uuid).order == 5
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page12.uuid
assert Page.objects.get(uuid=page13.uuid).order == 6
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page2.uuid).order == 7
assert Page.objects.get(uuid=page2.uuid).parent is None
assert Page.objects.get(uuid=page4.uuid).order == 8
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 9
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
# delete pages
Page.objects.all().delete()
# create only page3, page4, page41, page2 in this order
page3 = Page.objects.create(
slug='test3',
title='Test Page 3',
template_name='standard',
)
page4 = Page.objects.create(
slug='test4',
title='Test Page 4',
template_name='standard',
)
page41 = Page.objects.create(
slug='test41',
title='Test Page 41',
template_name='standard',
parent=page4,
)
page2 = Page.objects.create(slug='test2', title='Test Page 2', template_name='standard', uuid=page2.uuid)
# import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# pages from application are placed after page4
assert Page.objects.all().count() == 9
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page4.uuid).order == 2
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 3
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page1.uuid).order == 4
assert Page.objects.get(uuid=page1.uuid).parent is None
assert Page.objects.get(uuid=page11.uuid).order == 5
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page12.uuid).order == 6
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page121.uuid).order == 7
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page12.uuid
assert Page.objects.get(uuid=page13.uuid).order == 8
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page2.uuid).order == 9
assert Page.objects.get(uuid=page2.uuid).parent is None
# delete pages
Page.objects.all().delete()
# create page3, page4, page41, page42 and place page2 under page3
page3 = Page.objects.create(
slug='test3',
title='Test Page 3',
template_name='standard',
)
page2 = Page.objects.create(
slug='test2',
title='Test Page 2',
template_name='standard',
uuid=page2.uuid,
parent=page3,
)
page4 = Page.objects.create(
slug='test4',
title='Test Page 4',
template_name='standard',
)
page41 = Page.objects.create(
slug='test41',
title='Test Page 41',
template_name='standard',
parent=page4,
)
page42 = Page.objects.create(
slug='test42',
title='Test Page 42',
template_name='standard',
parent=page4,
)
# import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# pages from application are placed under page3
assert Page.objects.all().count() == 10
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page1.uuid).order == 2
assert Page.objects.get(uuid=page1.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page11.uuid).order == 3
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page12.uuid).order == 4
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page121.uuid).order == 5
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page12.uuid
assert Page.objects.get(uuid=page13.uuid).order == 6
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page2.uuid).order == 7
assert Page.objects.get(uuid=page2.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page4.uuid).order == 8
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 9
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page42.uuid).order == 10
assert Page.objects.get(uuid=page42.uuid).parent.uuid == page4.uuid
# delete pages
Page.objects.all().delete()
# create page3, page4, page41, page42 and place page2 under page3, and page12 between page41 and page42
page3 = Page.objects.create(
slug='test3',
title='Test Page 3',
template_name='standard',
)
page2 = Page.objects.create(
slug='test2',
title='Test Page 2',
template_name='standard',
uuid=page2.uuid,
parent=page3,
)
page4 = Page.objects.create(
slug='test4',
title='Test Page 4',
template_name='standard',
)
page41 = Page.objects.create(
slug='test41',
title='Test Page 41',
template_name='standard',
parent=page4,
)
page12 = Page.objects.create(
slug='test12',
title='Test Page 12',
template_name='standard',
uuid=page12.uuid,
parent=page4,
)
page42 = Page.objects.create(
slug='test42',
title='Test Page 42',
template_name='standard',
parent=page4,
)
# import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# page1 is placed under page3, pages 11, 12, 121, 13 are placed between page41 and page42
assert Page.objects.all().count() == 10
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page1.uuid).order == 2
assert Page.objects.get(uuid=page1.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page2.uuid).order == 3
assert Page.objects.get(uuid=page2.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page4.uuid).order == 4
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 5
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page11.uuid).order == 6
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page12.uuid).order == 7
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page121.uuid).order == 8
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page12.uuid
assert Page.objects.get(uuid=page13.uuid).order == 9
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page42.uuid).order == 10
assert Page.objects.get(uuid=page42.uuid).parent.uuid == page4.uuid
# again, import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# no changes
assert Page.objects.all().count() == 10
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page1.uuid).order == 2
assert Page.objects.get(uuid=page1.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page2.uuid).order == 3
assert Page.objects.get(uuid=page2.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page4.uuid).order == 4
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 5
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page11.uuid).order == 6
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page12.uuid).order == 7
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page121.uuid).order == 8
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page12.uuid
assert Page.objects.get(uuid=page13.uuid).order == 9
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page42.uuid).order == 10
assert Page.objects.get(uuid=page42.uuid).parent.uuid == page4.uuid
# delete pages
Page.objects.all().delete()
# create page3, page4, page41, page42 and place page2 under page3, page11 between page41 and page42 and page121 under page2
page3 = Page.objects.create(
slug='test3',
title='Test Page 3',
template_name='standard',
)
page2 = Page.objects.create(
slug='test2',
title='Test Page 2',
template_name='standard',
uuid=page2.uuid,
parent=page3,
)
page121 = Page.objects.create(
slug='test121',
title='Test Page 121',
template_name='standard',
uuid=page121.uuid,
parent=page2,
)
page4 = Page.objects.create(
slug='test4',
title='Test Page 4',
template_name='standard',
)
page41 = Page.objects.create(
slug='test41',
title='Test Page 41',
template_name='standard',
parent=page4,
)
page11 = Page.objects.create(
slug='test11',
title='Test Page 11',
template_name='standard',
uuid=page11.uuid,
parent=page4,
)
page42 = Page.objects.create(
slug='test42',
title='Test Page 42',
template_name='standard',
parent=page4,
)
# import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# page1 is placed under page3, pages 11, 12, 13 are placed between page41 and page42, page 121 stays under page2
assert Page.objects.all().count() == 10
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page1.uuid).order == 2
assert Page.objects.get(uuid=page1.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page2.uuid).order == 3
assert Page.objects.get(uuid=page2.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page121.uuid).order == 4
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page2.uuid
assert Page.objects.get(uuid=page4.uuid).order == 5
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 6
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page11.uuid).order == 7
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page12.uuid).order == 8
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page13.uuid).order == 9
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page42.uuid).order == 10
assert Page.objects.get(uuid=page42.uuid).parent.uuid == page4.uuid
# again, import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# no changes
assert Page.objects.all().count() == 10
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page1.uuid).order == 2
assert Page.objects.get(uuid=page1.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page2.uuid).order == 3
assert Page.objects.get(uuid=page2.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page121.uuid).order == 4
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page2.uuid
assert Page.objects.get(uuid=page4.uuid).order == 5
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page41.uuid).order == 6
assert Page.objects.get(uuid=page41.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page11.uuid).order == 7
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page12.uuid).order == 8
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page13.uuid).order == 9
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page42.uuid).order == 10
assert Page.objects.get(uuid=page42.uuid).parent.uuid == page4.uuid
# delete pages
Page.objects.all().delete()
# create page3, page4, place page12 under page3, page11 under page4
page3 = Page.objects.create(
slug='test3',
title='Test Page 3',
template_name='standard',
)
page12 = Page.objects.create(
slug='test12',
title='Test Page 12',
template_name='standard',
uuid=page12.uuid,
parent=page3,
)
page4 = Page.objects.create(
slug='test4',
title='Test Page 4',
template_name='standard',
)
page11 = Page.objects.create(
slug='test11',
title='Test Page 11',
template_name='standard',
uuid=page11.uuid,
parent=page4,
)
# import bundle
resp = app.put('/api/export-import/bundle-import/', bundle)
assert resp.json['err'] == 0
# page1 and page2 are placed after page4, but can not decide if page13 should be place next to page11 or page12.
assert Page.objects.all().count() == 8
assert Page.objects.get(uuid=page3.uuid).order == 1
assert Page.objects.get(uuid=page3.uuid).parent is None
assert Page.objects.get(uuid=page12.uuid).order == 2
assert Page.objects.get(uuid=page12.uuid).parent.uuid == page3.uuid
assert Page.objects.get(uuid=page121.uuid).order == 3
assert Page.objects.get(uuid=page121.uuid).parent.uuid == page12.uuid
assert Page.objects.get(uuid=page4.uuid).order == 4
assert Page.objects.get(uuid=page4.uuid).parent is None
assert Page.objects.get(uuid=page11.uuid).order == 5
assert Page.objects.get(uuid=page11.uuid).parent.uuid == page4.uuid
assert Page.objects.get(uuid=page1.uuid).order == 6
assert Page.objects.get(uuid=page1.uuid).parent is None
assert Page.objects.get(uuid=page13.uuid).order == 7
assert Page.objects.get(uuid=page13.uuid).parent.uuid == page1.uuid
assert Page.objects.get(uuid=page2.uuid).order == 8
assert Page.objects.get(uuid=page2.uuid).parent is None
def test_bundle_declare(app, john_doe):
app.authorization = ('Basic', (john_doe.username, john_doe.username))