Projet

Général

Profil

0007-data-import-site-performances-51472.patch

Lauréline Guérin, 01 mars 2021 11:22

Télécharger (4,58 ko)

Voir les différences:

Subject: [PATCH 7/7] data: import site performances (#51472)

 combo/data/models.py  | 44 ++++++++++++++++++++++++++++++++++++-------
 tests/test_manager.py |  6 +++---
 2 files changed, 40 insertions(+), 10 deletions(-)
combo/data/models.py
469 469
        return serialized_page
470 470

  
471 471
    @classmethod
472
    def load_serialized_page(cls, json_page, snapshot=None, request=None):
472
    def load_serialized_page(cls, json_page, page=None, snapshot=None, request=None):
473 473
        json_page['model'] = 'data.page'
474 474
        json_page['fields']['groups'] = [
475 475
            [x] for x in json_page['fields']['groups'] if isinstance(x, six.string_types)
476 476
        ]
477
        page, created = Page.objects.get_or_create(slug=json_page['fields']['slug'], snapshot=snapshot)
477
        created = None
478
        if page is None:
479
            page, created = Page.objects.get_or_create(slug=json_page['fields']['slug'], snapshot=snapshot)
478 480
        json_page['pk'] = page.id
479 481
        parent_slug = json_page['fields'].get('parent') or []
480 482
        if parent_slug and not Page.objects.filter(slug=parent_slug[0]).exists():
......
521 523

  
522 524
    @classmethod
523 525
    def load_serialized_pages(cls, json_site, request=None):
524
        cells = []
525
        for json_page in json_site:
526
            cls.load_serialized_page(json_page, request=request)
527
            cells.extend(json_page.get('cells'))
528
        cls.load_serialized_cells(cells)
526
        cells_to_load = []
527
        to_load = []
528
        to_build = []
529
        try:
530
            post_save.disconnect(cell_maintain_page_cell_cache)
531
            post_delete.disconnect(cell_maintain_page_cell_cache)
532

  
533
            for json_page in json_site:
534
                # pre-create pages
535
                page, created = Page.objects.get_or_create(slug=json_page['fields']['slug'])
536
                to_load.append((page, created, json_page))
537

  
538
            # delete cells of already existing pages
539
            to_clean = [p for p, created, j in to_load if not created]
540
            for klass in get_cell_classes():
541
                if klass is None:
542
                    continue
543
                klass.objects.filter(page__in=to_clean).delete()
544

  
545
            # now load pages
546
            for (page, created, json_page) in to_load:
547
                to_build.append(cls.load_serialized_page(json_page, page=page, request=request))
548
                cells_to_load.extend(json_page.get('cells'))
549

  
550
            # and cells
551
            cls.load_serialized_cells(cells_to_load)
552
        finally:
553
            post_save.connect(cell_maintain_page_cell_cache)
554
            post_delete.connect(cell_maintain_page_cell_cache)
555

  
556
        # build cache
557
        for page in to_build:
558
            page.build_cell_cache()
529 559

  
530 560
    @classmethod
531 561
    def export_all_for_json(cls):
tests/test_manager.py
832 832
    resp.form['site_file'] = Upload('site-export.json', site_export, 'application/json')
833 833
    with CaptureQueriesContext(connection) as ctx:
834 834
        resp = resp.form.submit()
835
        assert len(ctx.captured_queries) in [823, 824]
835
        assert len(ctx.captured_queries) in [268, 269]
836 836

  
837 837
    Page.objects.all().delete()
838 838
    assert LinkCell.objects.count() == 0
......
841 841
    resp.form['site_file'] = Upload('site-export.json', site_export, 'application/json')
842 842
    with CaptureQueriesContext(connection) as ctx:
843 843
        resp = resp.form.submit()
844
        assert len(ctx.captured_queries) == 364
844
        assert len(ctx.captured_queries) == 237
845 845
    assert set(Page.objects.get(slug='one').related_cells['cell_types']) == set(
846 846
        ['data_textcell', 'data_linkcell']
847 847
    )
......
2187 2187
    resp = resp.click('restore', index=6)
2188 2188
    with CaptureQueriesContext(connection) as ctx:
2189 2189
        resp = resp.form.submit().follow()
2190
        assert len(ctx.captured_queries) == 143
2190
        assert len(ctx.captured_queries) == 144
2191 2191

  
2192 2192
    resp2 = resp.click('See online')
2193 2193
    assert resp2.text.index('Foobar1') < resp2.text.index('Foobar2') < resp2.text.index('Foobar3')
2194
-