| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- from django.shortcuts import render
- from counter.models import Counter,Reset
- from babel.dates import format_timedelta, format_datetime
- from datetime import datetime,timedelta
- from django import forms
- from django.http import HttpResponseRedirect
- from django.core import serializers
- from graphos.renderers import gchart
- from graphos.sources.simple import SimpleDataSource
- from graphos.sources.model import ModelDataSource
- import random
- import math
- from django.utils import timezone
- class resetCounterForm(forms.ModelForm):
- class Meta:
- model = Reset
- fields = ['reason','counter']
- def home(request):
- #JSS above this limit will not be displayed on the col graph
- JSS_limit = 7
- #Display counters
- counters = Counter.objects.all()
- lastResets = []
- #Calculates infos for each counter
- maxJSS = 0
- timezero = timedelta(0)
- for counter in counters:
- lastReset = Reset.objects.filter(counter=counter).order_by('-timestamp')
- if (lastReset.count() == 0):
- counter.lastReset = Reset()
- counter.lastReset.delta = timezero
- counter.lastReset.noSeum = True
- counter.CSSclass = "warning"
- else:
- counter.lastReset = lastReset[0]
- counter.lastReset.noSeum = False
- counter.lastReset.delta = datetime.now()-counter.lastReset.timestamp.replace(tzinfo=None)
- if ((counter.lastReset.delta.total_seconds())/(24*3600)<JSS_limit):
- #If more thant 7 JSS do not display on graph
- lastResets.append([counter.trigramme,{'v' : (counter.lastReset.delta.total_seconds())/(24*3600), 'f' : str(round((counter.lastReset.delta.total_seconds())/(24*3600),1))} ])
- counter.CSSclass = "primary"
- if (counter.lastReset.delta.total_seconds())/(24*3600) > maxJSS:
- maxJSS = (counter.lastReset.delta.total_seconds())/(24*3600)
- else:
- counter.CSSclass = "primary"
- counter.opacity = 0.3 + 0.7*math.exp(-(counter.lastReset.delta.total_seconds())/(7*24*3600))
- counter.lastReset.formatted_delta = format_timedelta(counter.lastReset.delta,locale='fr',threshold=1)
- counter.isHidden = "hidden"
- counters = sorted(counters,key=lambda t: t.lastReset.delta)
- #Column graph
- if (len(lastResets) ==0):
- noGraph = True
- col_chart = None
- else:
- noGraph = False
- lastResets.sort(key=lambda x: x[1]['v'])
- lastResets.insert(0,['Trigramme','Jours sans seum'])
- col_data = SimpleDataSource(lastResets)
- col_chart = gchart.ColumnChart(col_data,options={
- 'title' : '',
- 'legend' : 'none',
- 'vAxis' : {
- 'viewWindow' : {
- 'max' : max(maxJSS,1) ,
- 'min' : 0
- },
- 'ticks' : [1,2,3,4,5,6,7],
- 'title' : 'Jours sans seum'
- },
- 'hAxis' : {'title' : 'Trigramme' },
- })
- ###Timeline graph
- #Data pre-processing
- resets = Reset.objects.filter(timestamp__gte=timezone.now() - timedelta(days=1))
- if (resets.count() == 0):
- noTimeline = True
- line_chart = None
- else:
- noTimeline = False
- for reset in resets:
- reset.timestamp={
- 'v' : reset.timestamp.timestamp(),
- 'f' : "Il y a "+format_timedelta(datetime.now()-reset.timestamp.replace(tzinfo=None),locale='fr',threshold=1)
- }
- reset.Seum={'v' : 0, 'f' : reset.counter.trigramme+" : "+reset.reason}
- #Drawing the graph
- line_data = ModelDataSource(resets,fields=['timestamp','Seum'])
- line_chart = gchart.LineChart(line_data, options={
- 'lineWidth' : 0,
- 'pointSize' : 10,
- 'title' : '',
- 'vAxis' : { 'ticks' : []},
- 'hAxis' : {
- 'ticks' : [
- {'v' : (datetime.now() - timedelta(days=1)).timestamp(), 'f' : 'Il y a 24 h' },
- { 'v' :datetime.now().timestamp(), 'f' : 'Présent'}
- ]
- },
- 'legend' : 'none',
- 'height' : 90
- })
- return render(request,'homeTemplate.html', {
- 'counters' : counters,
- 'col_chart' : col_chart,
- 'line_chart' : line_chart,
- 'noTimeline' : noTimeline,
- 'noGraph' : noGraph
- })
- def resetCounter(request):
- #Update Form counter
- if (request.method == 'POST'):
- # create a form instance and populate it with data from the request:
- data = dict(request.POST)
- counter = Counter.objects.get(pk=int(data['counter'][0]))
- reset = Reset()
- reset.counter = counter
- reset.reason = data['reason'][0]
- reset.timestamp = datetime.now()
- reset.save()
- # check whether it's valid
- return HttpResponseRedirect(data['redirect'][0])
- def counter(request, id_counter):
- counter = Counter.objects.get(pk=id_counter)
- resets = Reset.objects.filter(counter=counter).order_by('-timestamp')
- timezero = timedelta(0)
- #Display
- if (resets.count() == 0):
- counter.lastReset = Reset()
- counter.lastReset.delta = timezero
- counter.lastReset.noSeum = True
- else:
- counter.lastReset = resets[0]
- counter.lastReset.noSeum = False
- counter.lastReset.delta = datetime.now()-counter.lastReset.timestamp.replace(tzinfo=None)
- counter.lastReset.formatted_delta = format_timedelta(counter.lastReset.delta,locale='fr',threshold=1)
- for reset in resets:
- reset.date = format_datetime(reset.timestamp,locale='fr',format="EEEE dd MMMM Y 'à' HH:mm:ss").capitalize()
- ###Timeline graph
- #Data pre-processing
- resets_graph=resets
- for reset in resets_graph:
- reset.timestamp={'v' : reset.timestamp.timestamp(), 'f' : "Il y a "+format_timedelta(datetime.now()-reset.timestamp.replace(tzinfo=None),locale='fr',threshold=1) }
- reset.Seum={'v' : 0, 'f' : reset.reason}
- #Drawing the graph
- data = ModelDataSource(resets,fields=['timestamp','Seum'])
- chart = gchart.LineChart(data, options={
- 'lineWidth' : 0,
- 'pointSize' : 10,
- 'title' : '',
- 'vAxis' : { 'ticks' : []},
- 'hAxis' : {'ticks' : [{'v' : datetime(2016,3,9,23,0,0,0).timestamp(), 'f' : 'ADD des X2013' }, { 'v' :datetime.now().timestamp(), 'f' : 'Présent'}]},
- 'legend' : 'none',
- 'height' : 90
- })
- return render(request,'counterTemplate.html', { 'counter' : counter, 'chart' : chart, 'resets' : resets })
|