Sen descrición

views.py 6.9KB

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