From 25f1ed18666229fa6bbf087907d44422678e5e68 Mon Sep 17 00:00:00 2001 From: Stefan Koegl Date: Sat, 5 Jun 2010 21:42:38 +0200 Subject: [PATCH] aggregated download of episode actions (bug 1030) --- mygpo/api/advanced/__init__.py | 25 ++++++++++++++++++++----- mygpo/utils.py | 7 +++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/mygpo/api/advanced/__init__.py b/mygpo/api/advanced/__init__.py index b5027ce4..4255ca46 100644 --- a/mygpo/api/advanced/__init__.py +++ b/mygpo/api/advanced/__init__.py @@ -25,7 +25,7 @@ from time import mktime, gmtime, strftime from datetime import datetime, timedelta import dateutil.parser from mygpo.log import log -from mygpo.utils import parse_time +from mygpo.utils import parse_time, parse_bool from django.db import IntegrityError import re from django.views.decorators.csrf import csrf_exempt @@ -177,6 +177,7 @@ def episodes(request, username, version=1): podcast_url= request.GET.get('podcast', None) device_uid = request.GET.get('device', None) since_ = request.GET.get('since', None) + aggregated = parse_bool(request.GET.get('aggregated', False)) since = datetime.fromtimestamp(float(since_)) if since_ else None @@ -186,14 +187,19 @@ def episodes(request, username, version=1): except: raise Http404 - return JsonResponse(get_episode_changes(request.user, podcast, device, since, now, version)) + print aggregated + + return JsonResponse(get_episode_changes(request.user, podcast, device, since, now, aggregated, version)) else: return HttpResponseNotAllowed(['POST', 'GET']) -def get_episode_changes(user, podcast, device, since, until, version): - actions = [] +def get_episode_changes(user, podcast, device, since, until, aggregated, version): + if aggregated: + actions = {} + else: + actions = [] eactions = EpisodeAction.objects.filter(user=user, timestamp__lte=until) if podcast: @@ -205,6 +211,9 @@ def get_episode_changes(user, podcast, device, since, until, version): if since: # we can't use None with __gt eactions = eactions.filter(timestamp__gt=since) + if aggregated: + eactions = eactions.order_by('timestamp') + for a in eactions: action = { 'podcast': a.episode.podcast.url, @@ -222,10 +231,16 @@ def get_episode_changes(user, podcast, device, since, until, version): action['started'] = int(a.started) action['total'] = int(a.total) - actions.append(action) + if aggregated: + actions[a.episode] = action + else: + actions.append(action) until_ = int(mktime(until.timetuple())) + if aggregated: + actions = list(actions.itervalues()) + return {'actions': actions, 'timestamp': until_} diff --git a/mygpo/utils.py b/mygpo/utils.py index 59d04bef..77eb8fa3 100644 --- a/mygpo/utils.py +++ b/mygpo/utils.py @@ -65,3 +65,10 @@ def parse_time(value): return int(value) +def parse_bool(val): + if isinstance(val, bool): + return val + if val.lower() == 'true': + return True + return False + -- 2.11.4.GIT