diff options
Diffstat (limited to 'meetingtools/apps/stats/views.py')
-rw-r--r-- | meetingtools/apps/stats/views.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/meetingtools/apps/stats/views.py b/meetingtools/apps/stats/views.py index 252b827..60628a2 100644 --- a/meetingtools/apps/stats/views.py +++ b/meetingtools/apps/stats/views.py @@ -3,10 +3,12 @@ Created on Jan 16, 2012 @author: leifj """ +import logging from django.contrib.auth.decorators import login_required from django.contrib.humanize.templatetags.humanize import naturalday from django.http import HttpResponseForbidden, HttpResponseBadRequest +from meetingtools.apps.stats.models import UserMeetingTransaction from meetingtools.ac import ac_api_client from iso8601 import iso8601 from time import mktime @@ -19,6 +21,9 @@ def _iso2datesimple(iso): (date,rest) = iso.split("T") return date +def _dt2ts(dt): + return mktime(dt.timetuple())*1000 + def _iso2ts(iso): return mktime(iso8601.parse_date(iso).timetuple())*1000 @@ -126,6 +131,7 @@ def user_minutes_api(request,username=None): #logging.debug("midnight: %d (%d)" % (ts_date_ts,ts_closed)) ms = (ts_closed - ts_date_ts) #logging.debug("nms: %d" % ms) + if curdate is not None and ms > 0: series.append([_date_ts(curdate),int(ms/60000)]) @@ -133,6 +139,85 @@ def user_minutes_api(request,username=None): return json_response({'data': sorted(series,key=lambda x: x[0]), 'rooms': len(rc.keys()), 'minutes': int(t_ms/60000)},request) @login_required +def tagged_minutes_api(request): + form = StatCaledarForm(request.GET) # convenient way to parse dates + if not form.is_valid(): + return HttpResponseBadRequest() + + tags = filter(lambda x: bool(x), form.cleaned_data['tags'].strip().split("+")) + sco = form.cleaned_data['sco'] + begin = form.cleaned_data['begin'] + end = form.cleaned_data['end'] + user = form.cleaned_data['user'] + + qs = UserMeetingTransaction.objects + + if user: + qs = qs.filter(user=user) + if sco: + qs = qs.filter(sco=sco) + if begin: + qs = qs.filter(date_created__gt=begin) + if end: + qs = qs.filter(date_closed__lt=end) + + if len(tags) > 0: + qs = UserMeetingTransaction.tagged.with_all(tags,qs) + + series = [] + d_created = None + d_closed = None + ms = 0 + curdate = None + t_ms = 0 + rc = {} + uc = {} + + for tx in qs.all().prefetch_related("sco").prefetch_related("user"): + rc[tx.sco.id] = True + uc[tx.user.username] = True + ts_created = _dt2ts(tx.date_created) + ts_closed = _dt2ts(tx.date_closed) + + d1 = tx.date_created + if d_created is None: + d_created = d1 + + d2 = tx.date_closed + if d_closed is None: + d_closed = d2 + + if curdate is None: + curdate = d1 + + if curdate != d1: + series.append([_dt2ts(curdate),int(ms/60)]) + ms = 0 + curdate = d1 + + if d1 == d2: #same date + diff = (ts_closed - ts_created) + ms += diff + t_ms += diff + else: # meeting spanned midnight + ts_date_ts = _dt2ts(d2) + ms += ts_date_ts - ts_created + series.append([_dt2ts(d1),int(ms/60)]) + t_ms += ms + curdate = d2 + ms = (ts_closed - ts_date_ts) + + if curdate is not None and ms > 0: + series.append([_date_ts(curdate),int(ms/60)]) + + return json_response({'data': sorted(series,key=lambda x: x[0]), + 'rooms': len(rc.keys()), + 'begin': naturalday(begin), + 'end': naturalday(end), + 'users': len(uc.keys()), + 'minutes': int(t_ms/60)},request) + +@login_required def domain_minutes_api(request,domain): with ac_api_client(request) as api: p = {'sort': 'asc','sort1': 'date-created','filter-type': 'meeting'} |