Projet

Général

Profil

0002-dataviz-improve-queries-on-statistics-list-update-50.patch

Valentin Deniaud, 17 février 2021 11:47

Télécharger (3,56 ko)

Voir les différences:

Subject: [PATCH 2/4] dataviz: improve queries on statistics list update
 (#50891)

 combo/apps/dataviz/utils.py | 58 +++++++++++++++++++++++++++++--------
 1 file changed, 46 insertions(+), 12 deletions(-)
combo/apps/dataviz/utils.py
1
from collections import OrderedDict
2

  
3
import django
1 4
from django.conf import settings
2 5
from django.utils import timezone
3 6

  
......
10 13
    if not settings.KNOWN_SERVICES:
11 14
        return
12 15

  
16
    results = []
13 17
    start_update = timezone.now()
14 18
    for provider in settings.STATISTICS_PROVIDERS:
15 19
        if isinstance(provider, dict):
......
36 40
                result = result['data']  # detect new api
37 41

  
38 42
            for stat in result:
39
                Statistic.objects.update_or_create(
40
                    slug=stat.get('slug') or stat['id'],
41
                    site_slug=site_key,
42
                    service_slug=provider,
43
                    defaults={
44
                        'label': stat['name'],
45
                        'url': stat.get('data-url') or stat['url'],
46
                        'site_title': site_dict.get('title', ''),
47
                        'filters': stat.get('filters', []),
48
                        'available': True,
49
                    },
43
                results.append(
44
                    Statistic(
45
                        slug=stat.get('slug') or stat['id'],
46
                        site_slug=site_key,
47
                        service_slug=provider,
48
                        label=stat['name'],
49
                        url=stat.get('data-url') or stat['url'],
50
                        site_title=site_dict.get('title', ''),
51
                        filters=stat.get('filters', []),
52
                        available=True,
53
                    )
50 54
                )
51
    Statistic.objects.filter(last_update__lt=start_update).update(available=False)
55

  
56
    update_fields = ('label', 'url', 'site_title', 'filters', 'available')
57
    all_statistics = {stat.natural_key(): stat for stat in Statistic.objects.all()}
58
    statistics_to_create = []
59
    statistics_to_update = {}
60
    for stat in results:
61
        existing_stat = all_statistics.get(stat.natural_key())
62
        if existing_stat:
63
            for field in update_fields:
64
                new_value = getattr(stat, field)
65
                if getattr(existing_stat, field) != new_value:
66
                    setattr(existing_stat, field, new_value)
67
                    statistics_to_update[existing_stat.pk] = existing_stat
68
        else:
69
            statistics_to_create.append(stat)
70

  
71
    Statistic.objects.bulk_create(statistics_to_create)
72
    if django.VERSION < (2, 2, 0):
73
        for statistic in statistics_to_update.values():
74
            Statistic.objects.filter(pk=statistic.pk).update(
75
                **{field: getattr(statistic, field) for field in update_fields}
76
            )
77
    else:
78
        Statistic.objects.bulk_update(statistics_to_update.values(), update_fields)
79

  
80
    available_stats = Statistic.objects.filter(available=True)
81
    for stat in results:
82
        available_stats = available_stats.exclude(
83
            slug=stat.slug, site_slug=stat.site_slug, service_slug=stat.service_slug
84
        )
85
    available_stats.update(available=False)
52
-