Ei kuvausta

views.py 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. from django.shortcuts import render
  2. from counter.models import Counter,Reset
  3. from babel.dates import format_timedelta, format_datetime
  4. from datetime import datetime,timedelta
  5. from django import forms
  6. from django.http import HttpResponseRedirect
  7. from django.core import serializers
  8. from graphos.renderers import gchart
  9. from graphos.sources.simple import SimpleDataSource
  10. from graphos.sources.model import ModelDataSource
  11. import random
  12. import math
  13. from django.utils import timezone
  14. class resetCounterForm(forms.ModelForm):
  15. class Meta:
  16. model = Reset
  17. fields = ['reason','counter']
  18. def home(request):
  19. #JSS above this limit will not be displayed on the col graph
  20. JSS_limit = 7
  21. #Display counters
  22. counters = Counter.objects.all()
  23. lastResets = []
  24. #Calculates infos for each counter
  25. maxJSS = 0
  26. timezero = timedelta(0)
  27. for counter in counters:
  28. lastReset = Reset.objects.filter(counter=counter).order_by('-timestamp')
  29. if (lastReset.count() == 0):
  30. counter.lastReset = Reset()
  31. counter.lastReset.delta = timezero
  32. counter.lastReset.noSeum = True
  33. counter.CSSclass = "warning"
  34. else:
  35. counter.lastReset = lastReset[0]
  36. counter.lastReset.noSeum = False
  37. counter.lastReset.delta = datetime.now()-counter.lastReset.timestamp.replace(tzinfo=None)
  38. if ((counter.lastReset.delta.total_seconds())/(24*3600)<JSS_limit):
  39. #If more thant 7 JSS do not display on graph
  40. lastResets.append([counter.trigramme,{'v' : (counter.lastReset.delta.total_seconds())/(24*3600), 'f' : str(round((counter.lastReset.delta.total_seconds())/(24*3600),1))} ])
  41. counter.CSSclass = "primary"
  42. if (counter.lastReset.delta.total_seconds())/(24*3600) > maxJSS:
  43. maxJSS = (counter.lastReset.delta.total_seconds())/(24*3600)
  44. else:
  45. counter.CSSclass = "primary"
  46. counter.opacity = 0.3 + 0.7*math.exp(-(counter.lastReset.delta.total_seconds())/(7*24*3600))
  47. counter.lastReset.formatted_delta = format_timedelta(counter.lastReset.delta,locale='fr',threshold=1)
  48. counter.isHidden = "hidden"
  49. counters = sorted(counters,key=lambda t: t.lastReset.delta)
  50. #Column graph
  51. if (len(lastResets) ==0):
  52. noGraph = True
  53. col_chart = None
  54. else:
  55. noGraph = False
  56. lastResets.sort(key=lambda x: x[1]['v'])
  57. lastResets.insert(0,['Trigramme','Jours sans seum'])
  58. col_data = SimpleDataSource(lastResets)
  59. col_chart = gchart.ColumnChart(col_data,options={
  60. 'title' : '',
  61. 'legend' : 'none',
  62. 'vAxis' : {
  63. 'viewWindow' : {
  64. 'max' : max(maxJSS,1) ,
  65. 'min' : 0
  66. },
  67. 'ticks' : [1,2,3,4,5,6,7],
  68. 'title' : 'Jours sans seum'
  69. },
  70. 'hAxis' : {'title' : 'Trigramme' },
  71. })
  72. ###Timeline graph
  73. #Data pre-processing
  74. resets = Reset.objects.filter(timestamp__gte=timezone.now() - timedelta(days=1))
  75. if (resets.count() == 0):
  76. noTimeline = True
  77. line_chart = None
  78. else:
  79. noTimeline = False
  80. for reset in resets:
  81. reset.timestamp={
  82. 'v' : reset.timestamp.timestamp(),
  83. 'f' : "Il y a "+format_timedelta(datetime.now()-reset.timestamp.replace(tzinfo=None),locale='fr',threshold=1)
  84. }
  85. reset.Seum={'v' : 0, 'f' : reset.counter.trigramme+" : "+reset.reason}
  86. #Drawing the graph
  87. line_data = ModelDataSource(resets,fields=['timestamp','Seum'])
  88. line_chart = gchart.LineChart(line_data, options={
  89. 'lineWidth' : 0,
  90. 'pointSize' : 10,
  91. 'title' : '',
  92. 'vAxis' : { 'ticks' : []},
  93. 'hAxis' : {
  94. 'ticks' : [
  95. {'v' : (datetime.now() - timedelta(days=1)).timestamp(), 'f' : 'Il y a 24 h' },
  96. { 'v' :datetime.now().timestamp(), 'f' : 'Présent'}
  97. ]
  98. },
  99. 'legend' : 'none',
  100. 'height' : 90
  101. })
  102. return render(request,'homeTemplate.html', {
  103. 'counters' : counters,
  104. 'col_chart' : col_chart,
  105. 'line_chart' : line_chart,
  106. 'noTimeline' : noTimeline,
  107. 'noGraph' : noGraph
  108. })
  109. def resetCounter(request):
  110. #Update Form counter
  111. if (request.method == 'POST'):
  112. # create a form instance and populate it with data from the request:
  113. data = dict(request.POST)
  114. counter = Counter.objects.get(pk=int(data['counter'][0]))
  115. reset = Reset()
  116. reset.counter = counter
  117. reset.reason = data['reason'][0]
  118. reset.timestamp = datetime.now()
  119. reset.save()
  120. # check whether it's valid
  121. return HttpResponseRedirect(data['redirect'][0])
  122. def counter(request, id_counter):
  123. counter = Counter.objects.get(pk=id_counter)
  124. resets = Reset.objects.filter(counter=counter).order_by('-timestamp')
  125. timezero = timedelta(0)
  126. #Display
  127. if (resets.count() == 0):
  128. counter.lastReset = Reset()
  129. counter.lastReset.delta = timezero
  130. counter.lastReset.noSeum = True
  131. else:
  132. counter.lastReset = resets[0]
  133. counter.lastReset.noSeum = False
  134. counter.lastReset.delta = datetime.now()-counter.lastReset.timestamp.replace(tzinfo=None)
  135. counter.lastReset.formatted_delta = format_timedelta(counter.lastReset.delta,locale='fr',threshold=1)
  136. for reset in resets:
  137. reset.date = format_datetime(reset.timestamp,locale='fr',format="EEEE dd MMMM Y 'à' HH:mm:ss").capitalize()
  138. ###Timeline graph
  139. #Data pre-processing
  140. resets_graph=resets
  141. for reset in resets_graph:
  142. reset.timestamp={'v' : reset.timestamp.timestamp(), 'f' : "Il y a "+format_timedelta(datetime.now()-reset.timestamp.replace(tzinfo=None),locale='fr',threshold=1) }
  143. reset.Seum={'v' : 0, 'f' : reset.reason}
  144. #Drawing the graph
  145. data = ModelDataSource(resets,fields=['timestamp','Seum'])
  146. chart = gchart.LineChart(data, options={
  147. 'lineWidth' : 0,
  148. 'pointSize' : 10,
  149. 'title' : '',
  150. 'vAxis' : { 'ticks' : []},
  151. 'hAxis' : {'ticks' : [{'v' : datetime(2016,3,9,23,0,0,0).timestamp(), 'f' : 'ADD des X2013' }, { 'v' :datetime.now().timestamp(), 'f' : 'Présent'}]},
  152. 'legend' : 'none',
  153. 'height' : 90
  154. })
  155. return render(request,'counterTemplate.html', { 'counter' : counter, 'chart' : chart, 'resets' : resets })