]> git.0d.be Git - panikdb.git/blob - panikdb/stats/management/commands/load-piwik-stats.py
044655dfa4f7f20c417bc05593dffd1d78f6962a
[panikdb.git] / panikdb / stats / management / commands / load-piwik-stats.py
1 import datetime
2 import json
3 import urllib2
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         request = urllib2.Request(url)
22         request.add_header('Accept', 'application/json')
23         if self.verbose:
24             print 'calling piwik'
25         result = json.load(urllib2.urlopen(request))
26         if self.verbose:
27             print 'collecting results'
28         for day in result:
29             day_datetime = datetime.datetime.strptime(day, '%Y-%m-%d')
30             for stat_segment in result.get(day):
31                 if stat_segment.get('segment') != 'eventAction==Play':
32                     continue
33                 for entry in stat_segment.get('subtable'):
34                     sound_id = entry.get('label').split(':')[0]
35                     try:
36                         soundfile = SoundFile.objects.get(id=sound_id)
37                     except (SoundFile.DoesNotExist, ValueError):
38                         if self.verbose:
39                             print 'failed to process', entry.get('label')
40                         continue
41                     try:
42                         stat = DailyStat.objects.get(soundfile=soundfile,
43                                 day=day_datetime)
44                     except DailyStat.DoesNotExist:
45                         stat = DailyStat(soundfile=soundfile, day=day_datetime)
46                     for attribute in ('nb_events', 'nb_visits'):
47                         setattr(stat, attribute, entry.get(attribute))
48                     stat.save()