Projet

Général

Profil

0002-data-fix-get_by_natural_key-for-page-60018.patch

Valentin Deniaud, 11 janvier 2022 11:17

Télécharger (4,27 ko)

Voir les différences:

Subject: [PATCH 2/2] data: fix get_by_natural_key for page (#60018)

 combo/data/models.py        |  2 +-
 combo/data/query.py         | 11 +++++++++++
 tests/test_import_export.py | 14 ++++++++++++++
 tests/test_manager.py       |  2 +-
 4 files changed, 27 insertions(+), 2 deletions(-)
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
-