]> git.0d.be Git - panikdb.git/blob - panikdb/stats/management/commands/load-piwik-stats.py
load-piwik-stats: make request using requests module
[panikdb.git] / panikdb / stats / management / commands / load-piwik-stats.py
1 import datetime
2 import json
3 import requests
4
5 from django.conf import settings
6 from django.core.management.base import BaseCommand, CommandError
7
8 from panikdb.stats.models import SoundFile, DailyStat
9
10 class Command(BaseCommand):
11     def handle(self, verbosity, **kwargs):
12         self.verbose = (verbosity > 1)
13
14         piwik_api_href = settings.PIWIK_API_HREF
15         piwik_token_auth = settings.PIWIK_TOKEN_AUTH
16         piwik_site_id = settings.PIWIK_SITE_ID
17         url = '%(piwik_api_href)s?module=API&method=Events.getAction&'\
18               'secondaryDimension=eventName&idSite=%(piwik_site_id)s&'\
19               'period=day&date=last2&format=json&'\
20               'token_auth=%(piwik_token_auth)s&expanded=1' % locals()
21         if self.verbose:
22             print('calling piwik')
23         response = requests.get(url, headers={'Accept': 'application/json'})
24         result = response.json()
25         if self.verbose:
26             print('collecting results')
27         for day in result:
28             day_datetime = datetime.datetime.strptime(day, '%Y-%m-%d')
29             for stat_segment in result.get(day):
30                 if stat_segment.get('segment') != 'eventAction==Play':
31                     continue
32                 for entry in stat_segment.get('subtable'):
33                     sound_id = entry.get('label').split(':')[0]
34                     try:
35                         soundfile = SoundFile.objects.get(id=sound_id)
36                     except (SoundFile.DoesNotExist, ValueError):
37                         if self.verbose:
38                             print('failed to process', entry.get('label'))
39                         continue
40                     try:
41                         stat = DailyStat.objects.get(soundfile=soundfile,
42                                 day=day_datetime)
43                     except DailyStat.DoesNotExist:
44                         stat = DailyStat(soundfile=soundfile, day=day_datetime)
45                     for attribute in ('nb_events', 'nb_visits'):
46                         setattr(stat, attribute, entry.get(attribute))
47                     stat.save()