diff options
author | Leif Johansson <leifj@sunet.se> | 2012-10-04 15:39:08 +0200 |
---|---|---|
committer | Leif Johansson <leifj@sunet.se> | 2012-10-04 15:39:08 +0200 |
commit | 2bdad0ae7a3a6e4ec5116becd39910388b679ed2 (patch) | |
tree | 5afdfba0a93c1af50d53bdc245d57cc4053e109a /meetingtools/apps/stats | |
parent | 873e7823970352d591deee5f67f47c5436ee0e84 (diff) |
restructure
Diffstat (limited to 'meetingtools/apps/stats')
-rw-r--r-- | meetingtools/apps/stats/__init__.py | 0 | ||||
-rw-r--r-- | meetingtools/apps/stats/forms.py | 11 | ||||
-rw-r--r-- | meetingtools/apps/stats/views.py | 273 |
3 files changed, 284 insertions, 0 deletions
diff --git a/meetingtools/apps/stats/__init__.py b/meetingtools/apps/stats/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/meetingtools/apps/stats/__init__.py diff --git a/meetingtools/apps/stats/forms.py b/meetingtools/apps/stats/forms.py new file mode 100644 index 0000000..d9cf555 --- /dev/null +++ b/meetingtools/apps/stats/forms.py @@ -0,0 +1,11 @@ +''' +Created on Jan 16, 2012 + +@author: leifj +''' +from django.forms.forms import Form +from django.forms.fields import DateTimeField + +class StatCaledarForm(Form): + begin = DateTimeField(required=False) + end = DateTimeField(required=False)
\ No newline at end of file diff --git a/meetingtools/apps/stats/views.py b/meetingtools/apps/stats/views.py new file mode 100644 index 0000000..b028d18 --- /dev/null +++ b/meetingtools/apps/stats/views.py @@ -0,0 +1,273 @@ +''' +Created on Jan 16, 2012 + +@author: leifj +''' +from django.contrib.auth.decorators import login_required +from django.http import HttpResponseForbidden, HttpResponseBadRequest +from meetingtools.ac import ac_api_client +from iso8601 import iso8601 +from time import mktime +from meetingtools.multiresponse import json_response, respond_to +from meetingtools.apps.stats.forms import StatCaledarForm +from django.shortcuts import get_object_or_404 +from meetingtools.apps.room.models import Room +import logging + +def _iso2datesimple(iso): + (date,rest) = iso.split("T") + return date + +def _iso2ts(iso): + return mktime(iso8601.parse_date(iso).timetuple())*1000 + +def _iso2dt(iso): + return iso8601.parse_date(iso); + +def _date_ts(date): + (y,m,d) = date.split("-") + return int(mktime((int(y),int(m),int(d),0,0,0,0,0,-1)))*1000 # midnight + +@login_required +def user(request,username=None): + if username == None: + username = request.user.username + (local,domain) = username.split('@') + return respond_to(request,{'text/html': 'apps/stats/user.html'},{'domain': domain,'username': username}) + +@login_required +def domain(request,domain): + (l,d) = request.user.username.split('@') + if d != domain: + return HttpResponseForbidden("You can only look at statistics for your own domain!") + + return respond_to(request,{'text/html': 'apps/stats/domain.html'},{'domain': domain}) + +@login_required +def room(request,rid): + room = get_object_or_404(Room,pk=rid) + if not room.creator == request.user: + return HttpResponseForbidden("You can only look at statistics for your own rooms!") + + return respond_to(request,{'text/html': 'apps/stats/room.html'},{'room': room}) + +@login_required +def user_minutes_api(request,username=None): + #if username and username != request.user.username: + # return HttpResponseForbidden("You can't spy on others!") + + if username == None: + username = request.user.username + + with ac_api_client(request) as api: + p = {'sort1-type': 'asc','sort2-type': 'asc','sort1': 'date-created','sort2': 'date-closed','filter-type': 'meeting','filter-login':username} + + form = StatCaledarForm(request.GET) + if not form.is_valid(): + return HttpResponseBadRequest() + + begin = form.cleaned_data['begin'] + end = form.cleaned_data['end'] + + if begin != None: + p['filter-gte-date-created'] = begin + if end != None: + p['filter-lt-date-created'] = end + r = api.request('report-bulk-consolidated-transactions',p) + + series = [] + d_created = None + d_closed = None + ms = 0 + curdate = None + t_ms = 0 + rc = {} + for row in r.et.xpath("//row"): + rc[row.get('sco-id')] = True + date_created_str = row.findtext("date-created") + ts_created = _iso2ts(date_created_str) + date_closed_str = row.findtext("date-closed") + ts_closed = _iso2ts(date_closed_str) + + d1 = _iso2datesimple(date_created_str) + if d_created == None: + d_created = d1 + + d2 = _iso2datesimple(date_closed_str) + if d_closed == None: + d_closed = d2 + + #duration = _iso2dt(date_closed_str) - _iso2dt(date_created_str) + #sdiff = duration.total_seconds() + + if curdate == None: + curdate = d1 + + if curdate != d1: + #logging.debug(" %s: %s - %s = %d %d" % (row.findtext("name"),date_created_str,date_closed_str,ms,sdiff*1000)) + series.append([_date_ts(curdate),int(ms/60000)]) + ms = 0 + curdate = d1 + + if d1 == d2: #same date + diff = (ts_closed - ts_created) + #logging.debug("ms:: %d + %d" % (ms,diff)) + ms = ms + diff + t_ms = t_ms + diff + else: # meeting spanned midnight + ts_date_ts = _date_ts(d2) + #logging.debug("ms: %d + %d" % (ms,(ts_date_ts - ts_created))) + ms = ms + (ts_date_ts - ts_created) + series.append([_date_ts(d1),int(ms/60000)]) + #logging.debug("* %s: %s - %s = %d %d" % (row.findtext("name"),date_created_str,date_closed_str,ms,sdiff*1000)) + t_ms = t_ms + ms + curdate = d2 + #logging.debug("midnight: %d (%d)" % (ts_date_ts,ts_closed)) + ms = (ts_closed - ts_date_ts) + #logging.debug("nms: %d" % ms) + + if curdate != None and ms > 0: + series.append([_date_ts(curdate),int(ms/60000)]) + + return json_response({'data': sorted(series,key=lambda x: x[0]), 'rooms': len(rc.keys()), 'minutes': int(t_ms/60000)},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'} + + form = StatCaledarForm(request.GET) + if not form.is_valid(): + return HttpResponseBadRequest() + + begin = form.cleaned_data['begin'] + end = form.cleaned_data['end'] + + if begin != None: + p['filter-gte-date-created'] = begin + if end != None: + p['filter-lt-date-created'] = end + r = api.request('report-bulk-consolidated-transactions',p) + + series = [] + d_created = None + d_closed = None + ms = 0 + curdate = None + t_ms = 0 + rc = {} + uc = {} + for row in r.et.xpath("//row"): + login = row.findtext("login") + if not login.endswith("@%s" % domain): + continue + + rc[row.get('sco-id')] = True + uc[row.get('principal-id')] = True + date_created_str = row.findtext("date-created") + ts_created = _iso2ts(date_created_str) + date_closed_str = row.findtext("date-closed") + ts_closed = _iso2ts(date_closed_str) + + d1 = _iso2datesimple(date_created_str) + if d_created == None: + d_created = d1 + + d2 = _iso2datesimple(date_closed_str) + if d_closed == None: + d_closed = d2 + + if curdate == None: + curdate = d1 + + if curdate != d1: + series.append([_date_ts(curdate),int(ms/60000)]) + ms = 0 + curdate = d1 + + if d1 == d2: #same date + diff = (ts_closed - ts_created) + ms = ms + diff + t_ms = t_ms + diff + else: # meeting spanned midnight + ts_date_ts = _date_ts(d2) + ms = ms + (ts_date_ts - ts_created) + series.append([_date_ts(d1),int(ms/60000)]) + t_ms = t_ms + ms + curdate = d2 + ms = (ts_closed - ts_date_ts) + + if curdate != None and ms > 0: + series.append([_date_ts(curdate),int(ms/60000)]) + + return json_response({'data': sorted(series,key=lambda x: x[0]), 'rooms': len(rc.keys()), 'users': len(uc.keys()), 'minutes': int(t_ms/60000)},request) + + +@login_required +def room_minutes_api(request,rid): + room = get_object_or_404(Room,pk=rid) + if not room.creator == request.user: + return HttpResponseForbidden("You can only look at statistics for your own rooms!") + + with ac_api_client(request) as api: + p = {'sort': 'asc','sort1': 'date-created','filter-type': 'meeting','filter-sco-id': room.sco_id} + + form = StatCaledarForm(request.GET) + if not form.is_valid(): + return HttpResponseBadRequest() + + begin = form.cleaned_data['begin'] + end = form.cleaned_data['end'] + + if begin != None: + p['filter-gte-date-created'] = begin + if end != None: + p['filter-lt-date-created'] = end + r = api.request('report-bulk-consolidated-transactions',p) + + series = [] + d_created = None + d_closed = None + ms = 0 + curdate = None + t_ms = 0 + uc = {} + for row in r.et.xpath("//row"): + uc[row.get('principal-id')] = True + date_created_str = row.findtext("date-created") + ts_created = _iso2ts(date_created_str) + date_closed_str = row.findtext("date-closed") + ts_closed = _iso2ts(date_closed_str) + + d1 = _iso2datesimple(date_created_str) + if d_created == None: + d_created = d1 + + d2 = _iso2datesimple(date_closed_str) + if d_closed == None: + d_closed = d2 + + if curdate == None: + curdate = d1 + + if curdate != d1: + series.append([_date_ts(curdate),int(ms/60000)]) + ms = 0 + curdate = d1 + + if d1 == d2: #same date + diff = (ts_closed - ts_created) + ms = ms + diff + t_ms = t_ms + diff + else: # meeting spanned midnight + ts_date_ts = _date_ts(d2) + ms = ms + (ts_date_ts - ts_created) + series.append([_date_ts(d1),int(ms/60000)]) + t_ms = t_ms + ms + curdate = d2 + ms = (ts_closed - ts_date_ts) + + if curdate != None and ms > 0: + series.append([_date_ts(curdate),int(ms/60000)]) + + return json_response({'data': sorted(series,key=lambda x: x[0]), 'users': len(uc.keys()), 'minutes': int(t_ms/60000)},request)
\ No newline at end of file |