|
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 |
|
-
|