summaryrefslogtreecommitdiff
path: root/meetingtools/apps/stats/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'meetingtools/apps/stats/views.py')
-rw-r--r--meetingtools/apps/stats/views.py85
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'}