Ingen beskrivning

views.py 6.4KB

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