export_import: rebuild page positions after import (#86627)
gitea/combo/pipeline/head This commit looks good
Details
gitea/combo/pipeline/head This commit looks good
Details
This commit is contained in:
parent
741efc0e35
commit
21407807ad
|
@ -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()
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
Loading…
Reference in New Issue