0002-data-fix-get_by_natural_key-for-page-60018.patch
combo/data/models.py | ||
---|---|---|
161 | 161 | |
162 | 162 |
def get_by_natural_key(self, path): |
163 | 163 |
parts = [x for x in path.strip('/').split('/') if x] or ['index'] |
164 |
return self.get(slug=parts[-1])
|
|
164 |
return self.get_from_hierarchy(page_slugs=parts)
|
|
165 | 165 | |
166 | 166 |
def get_queryset(self): |
167 | 167 |
queryset = super().get_queryset() |
combo/data/query.py | ||
---|---|---|
58 | 58 |
WITH RECURSIVE __tree ( |
59 | 59 |
"tree_depth", |
60 | 60 |
"tree_path", |
61 |
"tree_path_slugs", |
|
61 | 62 |
"tree_ordering", |
62 | 63 |
"tree_pk" |
63 | 64 |
) AS ( |
64 | 65 |
SELECT |
65 | 66 |
0 AS tree_depth, |
66 | 67 |
array[T.id] AS tree_path, |
68 |
array[T.slug]::varchar(50)[] AS tree_path_slugs, |
|
67 | 69 |
array["order"] AS tree_ordering, |
68 | 70 |
T.id |
69 | 71 |
FROM data_page T |
... | ... | |
74 | 76 |
SELECT |
75 | 77 |
__tree.tree_depth + 1 AS tree_depth, |
76 | 78 |
__tree.tree_path || T.id, |
79 |
(__tree.tree_path_slugs || T.slug)::varchar(50)[], |
|
77 | 80 |
__tree.tree_ordering || "order", |
78 | 81 |
T.id |
79 | 82 |
FROM data_page T |
... | ... | |
87 | 90 |
select={ |
88 | 91 |
'tree_depth': '__tree.tree_depth', |
89 | 92 |
'tree_path': '__tree.tree_path', |
93 |
'tree_path_slugs': '__tree.tree_path_slugs', |
|
90 | 94 |
'tree_ordering': '__tree.tree_ordering', |
91 | 95 |
}, |
92 | 96 |
select_params=None, |
... | ... | |
121 | 125 |
return queryset.exclude(pk=page.pk) |
122 | 126 |
return queryset |
123 | 127 | |
128 |
def get_from_hierarchy(self, page_slugs): |
|
129 |
return ( |
|
130 |
self.with_tree_fields() |
|
131 |
.extra(where=['tree_path_slugs = %s::varchar(50)[]'], params=[page_slugs]) |
|
132 |
.get() |
|
133 |
) |
|
134 | ||
124 | 135 | |
125 | 136 |
TreeManager = models.Manager.from_queryset(TreeQuerySet) |
tests/test_import_export.py | ||
---|---|---|
561 | 561 |
import_site(data=json.loads(output)) |
562 | 562 |
assert Page.objects.count() == 3 |
563 | 563 |
assert Page.objects.filter(parent__isnull=True).count() == 2 |
564 | ||
565 | ||
566 |
def test_import_export_duplicated_subpages_slugs(): |
|
567 |
one = Page.objects.create(title='One', slug='one') |
|
568 |
dup_one = Page.objects.create(title='Dup', slug='dup', parent=one) |
|
569 |
sub_dup_one = Page.objects.create(title='Sub dup one', slug='sub_dup_one', parent=dup_one) |
|
570 |
two = Page.objects.create(title='Two', slug='two') |
|
571 |
dup_two = Page.objects.create(title='Dup', slug='dup', parent=two) |
|
572 |
sub_dup_two = Page.objects.create(title='Sub dup two', slug='sub_dup_two', parent=dup_two) |
|
573 | ||
574 |
output = get_output_of_command('export_site') |
|
575 |
Page.objects.all().delete() |
|
576 |
import_site(data=json.loads(output)) |
|
577 |
assert Page.objects.count() == 6 |
tests/test_manager.py | ||
---|---|---|
937 | 937 |
resp.form['site_file'] = Upload('site-export.json', site_export, 'application/json') |
938 | 938 |
with CaptureQueriesContext(connection) as ctx: |
939 | 939 |
resp = resp.form.submit() |
940 |
assert len(ctx.captured_queries) == 273
|
|
940 |
assert len(ctx.captured_queries) == 278
|
|
941 | 941 |
assert set(Page.objects.get(slug='one').related_cells['cell_types']) == {'data_textcell', 'data_linkcell'} |
942 | 942 |
assert Page.objects.count() == 4 |
943 | 943 |
assert LinkCell.objects.count() == 2 |
944 |
- |