Projet

Général

Profil

0002-misc-reduce-querysets-on-page-edition-page-39761.patch

Lauréline Guérin, 11 février 2020 21:27

Télécharger (10,7 ko)

Voir les différences:

Subject: [PATCH 2/2] misc: reduce querysets on page edition page (#39761)

 combo/apps/lingo/models.py                    | 24 ++++++++++---------
 combo/data/models.py                          |  3 ++-
 combo/manager/templatetags/cells.py           |  2 +-
 combo/manager/views.py                        |  3 ++-
 combo/public/templates/combo/menu.html        |  2 +-
 combo/public/templates/combo/placeholder.html |  2 +-
 combo/public/templatetags/combo.py            |  2 ++
 tests/test_manager.py                         | 13 ++++++----
 8 files changed, 30 insertions(+), 21 deletions(-)
combo/apps/lingo/models.py
148 148
            if self.pk:
149 149
                qs = qs.exclude(pk=self.pk)
150 150
            qs.update(is_default=False)
151
        elif self.__class__.objects.filter(is_default=True).count() == 0:
151
        elif not self.__class__.objects.filter(is_default=True).exists():
152 152
            self.is_default = True
153 153
        super(Regie, self).save(*args, **kwargs)
154 154

  
......
538 538

  
539 539
    @classmethod
540 540
    def is_enabled(cls):
541
        return Regie.objects.count() > 0
541
        return Regie.objects.exists()
542 542

  
543 543
    def is_relevant(self, context):
544 544
        if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated):
545 545
            return False
546
        return BasketItem.get_items_to_be_paid(context['request'].user).count() > 0
546
        return BasketItem.get_items_to_be_paid(context['request'].user).exists()
547 547

  
548 548
    def get_badge(self, context):
549 549
        if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated):
......
581 581

  
582 582
    @classmethod
583 583
    def is_enabled(cls):
584
        return Regie.objects.count() > 0
584
        return Regie.objects.exists()
585 585

  
586 586
    def is_relevant(self, context):
587 587
        if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated):
588 588
            return False
589
        transactions = Transaction.objects.filter(
589
        return (
590
            Transaction.objects.filter(
590 591
                user=context['request'].user,
591 592
                start_date__gte=timezone.now()-datetime.timedelta(days=7))
592
        return len(transactions) > 0
593
            .exists())
593 594

  
594 595
    def render(self, context):
595 596
        recent_transactions_template = template.loader.get_template(
......
610 611

  
611 612
    @classmethod
612 613
    def is_enabled(cls):
613
        return Regie.objects.count() > 0
614
        return Regie.objects.exists()
614 615

  
615 616
    def is_relevant(self, context):
616 617
        if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated):
617 618
            return False
618
        return BasketItem.get_items_to_be_paid(context['request'].user).count() > 0
619
        return BasketItem.get_items_to_be_paid(context['request'].user).exists()
619 620

  
620 621
    def render(self, context):
621 622
        if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated):
......
648 649

  
649 650
    @classmethod
650 651
    def is_enabled(cls):
651
        return Regie.objects.exclude(webservice_url='').count() > 0
652
        return Regie.objects.exclude(webservice_url='').exists()
652 653

  
653 654
    def is_relevant(self, context):
654 655
        return (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated)
......
656 657
    def get_default_form_class(self):
657 658
        fields = ['title', 'text']
658 659
        widgets = {}
659
        if Regie.objects.exclude(webservice_url='').count() > 1:
660
        regie_qs = Regie.objects.exclude(webservice_url='')
661
        if len(regie_qs) > 1:
660 662
            regies = [('', _('All'))]
661
            regies.extend([(r.slug, r.label) for r in Regie.objects.exclude(webservice_url='')])
663
            regies.extend([(r.slug, r.label) for r in regie_qs])
662 664
            widgets['regie'] = Select(choices=regies)
663 665
            fields.insert(0, 'regie')
664 666
        return model_forms.modelform_factory(self.__class__, fields=fields, widgets=widgets)
combo/data/models.py
316 316
            parenting[page.parent_id].append(page)
317 317
        def fill_list(object_sublist, level=0, parent=None):
318 318
            for page in object_sublist:
319
                if page.parent == parent:
319
                parent_id = parent.pk if parent else None
320
                if page.parent_id == parent_id:
320 321
                    page.level = level
321 322
                    reordered.append(page)
322 323
                    if page.id in parenting:
combo/manager/templatetags/cells.py
22 22
@register.simple_tag(takes_context=True)
23 23
def cell_form(context, cell):
24 24
    context['url'] = reverse('combo-manager-page-edit-cell', kwargs={
25
        'page_pk': cell.page.id, 'cell_reference': cell.get_reference()})
25
        'page_pk': cell.page_id, 'cell_reference': cell.get_reference()})
26 26
    form_class = cell.get_default_form_class()
27 27
    if form_class:
28 28
        context['form'] = form_class(instance=cell, prefix='c%s' % cell.get_reference())
combo/manager/views.py
261 261
        context['cell_type_groups'] = list(cell_type_groups.items())
262 262
        context['cell_type_groups'].sort(key=lambda x: x[0])
263 263

  
264
        cells = CellBase.get_cells(page_id=self.object.id)
264
        cells = CellBase.get_cells(page=self.object)
265
        self.object.prefeteched_cells = cells
265 266
        template = self.object.template_name
266 267
        placeholders = []
267 268
        optional_placeholders = []
combo/public/templates/combo/menu.html
2 2
<ul>
3 3
{% spaceless %}
4 4
{% for menuitem in menuitems %}
5
<li data-menu-page-id="{{ menuitem.page.id }}" class="menu-{{ menuitem.page.slug }} {% if menuitem.selected %}selected{% endif %}"><a
5
<li data-menu-page-id="{{ menuitem.page_id }}" class="menu-{{ menuitem.page.slug }} {% if menuitem.selected %}selected{% endif %}"><a
6 6
    href="{% page_absolute_url menuitem.page %}"><span>{{ menuitem.page.title }}</span></a>
7 7
  {% if depth > 1 %}
8 8
    {% show_menu current_page=menuitem.page level=-1 depth=depth reduce_depth=True ignore_visibility=ignore_visibility %}
combo/public/templates/combo/placeholder.html
6 6
{% for cell in cells %}
7 7
<div class="cell {{ cell.css_class_names }} {% if cell.slug %}{{cell.slug}}{% endif %} {% if cell|shown_because_admin:request %}shown-because-admin{% endif %}"
8 8
     {% if cell.slug and cell.use_slug_as_id %}id="{{ cell.slug }}"{% endif %}
9
     data-ajax-cell-url="{{ site_base }}{% url 'combo-public-ajax-page-cell' page_pk=cell.page.id cell_reference=cell.get_reference %}"
9
     data-ajax-cell-url="{{ site_base }}{% url 'combo-public-ajax-page-cell' page_pk=cell.page_id cell_reference=cell.get_reference %}"
10 10
     data-ajax-cell-loading-message="{{ cell.loading_message }}"
11 11
     data-ajax-cell-error-message="{% trans "Loading error" %}"
12 12
     {% if cell.ajax_refresh %}data-ajax-cell-refresh="{{ cell.ajax_refresh }}"{% endif %}
combo/public/templatetags/combo.py
64 64
        # page cells are not precomputed when rendering a single cell in an
65 65
        # ajax call
66 66
        page_cells = context.get('page_cells')
67
    elif 'page' in context and hasattr(context['page'], 'prefeteched_cells'):
68
        page_cells = context['page'].prefeteched_cells
67 69
    elif not context.get('render_skeleton'):
68 70
        page_cells = context['page'].get_cells() if 'page' in context else []
69 71
    context['cells'] = [x for x in page_cells if
tests/test_manager.py
334 334
        )
335 335

  
336 336
    app = login(app)
337
    app.get('/manage/pages/%s/' % page.pk)  # load once to populate caches
337 338
    with CaptureQueriesContext(connection) as ctx:
338 339
        app.get('/manage/pages/%s/' % page.pk)
339
        assert len(ctx.captured_queries) == 89
340
        assert len(ctx.captured_queries) == 29
340 341

  
341 342

  
342 343
def test_delete_page(app, admin_user):
......
471 472
    assert resp.headers['content-type'] == 'application/json'
472 473
    assert resp.json['pages'][0].get('fields').get('slug') == 'one'
473 474

  
475

  
474 476
def test_export_page_order():
475 477
    Page.objects.all().delete()
476
    page1 = Page(title='One', slug='one', template_name='standard')
477
    page2 = Page(title='Two', slug='two', parent=page1, template_name='standard')
478
    page3 = Page(title='Three', slug='three', parent=page2, template_name='standard')
479
    page4 = Page(title='Four', slug='four', parent=page1, template_name='standard')
478
    page1 = Page.objects.create(title='One', slug='one', template_name='standard')
479
    page2 = Page.objects.create(title='Two', slug='two', parent=page1, template_name='standard')
480
    page3 = Page.objects.create(title='Three', slug='three', parent=page2, template_name='standard')
481
    page4 = Page.objects.create(title='Four', slug='four', parent=page1, template_name='standard')
480 482
    random_list = [page3, page4, page1, page2]
481 483
    ordered_list = Page.get_as_reordered_flat_hierarchy(random_list)
482 484
    assert ordered_list[0] == page1
......
484 486
    assert ordered_list[2] == page2
485 487
    assert ordered_list[3] == page3
486 488

  
489

  
487 490
def test_site_export_import(app, admin_user):
488 491
    Page.objects.all().delete()
489 492
    page1 = Page(title='One', slug='one', template_name='standard')
490
-