Bez popisu

views.py 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 EmailMessage
  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. email_to_send = EmailMessage( 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,[],reply_to=emails)
  128. email_to_send.send()
  129. return HttpResponseRedirect(data['redirect'][0])
  130. def counter(request, id_counter):
  131. counter = Counter.objects.get(pk=id_counter)
  132. resets = Reset.objects.filter(counter=counter).order_by('-timestamp')
  133. timezero = timedelta(0)
  134. #Display
  135. if (resets.count() == 0):
  136. counter.lastReset = Reset()
  137. counter.lastReset.delta = timezero
  138. counter.lastReset.noSeum = True
  139. else:
  140. counter.lastReset = resets[0]
  141. counter.lastReset.noSeum = False
  142. counter.lastReset.delta = datetime.now()-counter.lastReset.timestamp.replace(tzinfo=None)
  143. counter.lastReset.formatted_delta = format_timedelta(counter.lastReset.delta,locale='fr',threshold=1)
  144. for reset in resets:
  145. reset.date = format_datetime(reset.timestamp,locale='fr',format="EEEE dd MMMM Y 'à' HH:mm:ss").capitalize()
  146. ###Timeline graph
  147. #Data pre-processing
  148. resets_graph=resets
  149. for reset in resets_graph:
  150. reset.timestamp={'v' : reset.timestamp.timestamp(), 'f' : "Il y a "+format_timedelta(datetime.now()-reset.timestamp.replace(tzinfo=None),locale='fr',threshold=1) }
  151. reset.Seum={'v' : 0, 'f' : reset.reason}
  152. #Drawing the graph
  153. data = ModelDataSource(resets,fields=['timestamp','Seum'])
  154. chart = gchart.LineChart(data, options={
  155. 'lineWidth' : 0,
  156. 'pointSize' : 10,
  157. 'title' : '',
  158. 'vAxis' : { 'ticks' : []},
  159. 'hAxis' : {'ticks' : [{'v' : datetime(2016,3,9,23,0,0,0).timestamp(), 'f' : 'ADD des X2013' }, { 'v' :datetime.now().timestamp(), 'f' : 'Présent'}]},
  160. 'legend' : 'none',
  161. 'height' : 90
  162. })
  163. return render(request,'counterTemplate.html', { 'counter' : counter, 'chart' : chart, 'resets' : resets })