暂无描述

counter.py 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. from datetime import datetime, timedelta
  2. import copy
  3. from django.contrib.auth.decorators import login_required
  4. from django.core.mail import EmailMessage
  5. from django.core.urlresolvers import reverse
  6. from django.http import HttpResponseRedirect
  7. from django.shortcuts import render
  8. from django.template.loader import render_to_string
  9. from django.utils.translation import ugettext as _, get_language
  10. import arrow
  11. from babel.dates import format_timedelta, format_datetime
  12. from graphos.renderers import gchart
  13. from graphos.sources.model import ModelDataSource
  14. from counter.models import *
  15. from counter.utils import parseSeumReason
  16. @login_required
  17. def get(request, id_counter):
  18. try:
  19. myCounter = Counter.objects.get(user__id=request.user.id)
  20. except Counter.DoesNotExist:
  21. return HttpResponseRedirect(reverse('login'))
  22. counter = Counter.objects.prefetch_related('resets', 'resets__likes').get(pk=id_counter)
  23. resets = counter.resets.order_by('-timestamp')
  24. timezero = timedelta(0)
  25. # Display
  26. if resets.count() == 0:
  27. counter.lastReset = Reset()
  28. counter.lastReset.delta = timezero
  29. counter.lastReset.noSeum = True
  30. seumFrequency = _('unknown')
  31. else:
  32. firstReset = resets.reverse()[0]
  33. counter.lastReset = resets[0]
  34. counter.lastReset.noSeum = False
  35. if counter.lastReset.who is None or counter.lastReset.who == counter:
  36. counter.lastReset.selfSeum = True
  37. else:
  38. counter.lastReset.selfSeum = False
  39. counter.lastReset.formatted_delta = arrow.Arrow.fromdatetime(counter.lastReset.timestamp).humanize(locale=get_language())
  40. counter.seumCount = counter.resets.count()
  41. seumFrequency = format_timedelta((datetime.now() - firstReset.timestamp.replace(tzinfo=None)) / counter.seumCount,
  42. locale=get_language(), threshold=1)
  43. counter.lastLikes = list(counter.lastReset.likes.all())
  44. counter.alreadyLiked = myCounter.id in [l.liker.id for l in counter.lastLikes]
  45. counter.likeCount = len(counter.lastLikes)
  46. if counter.likeCount > 0:
  47. counter.likersString = ", ".join(like.liker.trigramme for like in counter.lastLikes)
  48. for reset in resets:
  49. if reset.who is None or reset.who == reset.counter:
  50. reset.selfSeum = True
  51. else:
  52. reset.selfSeum = False
  53. reset.date = reset.timestamp
  54. reset.likeCount = reset.likes.count()
  55. # Timeline graph
  56. # Data pre-processing
  57. if not counter.lastReset.noSeum:
  58. resets_graph = resets
  59. for reset in resets_graph:
  60. reset.timestamp = {
  61. 'v': reset.timestamp.timestamp(),
  62. 'f': arrow.Arrow.fromdatetime(reset.timestamp).humanize(locale=get_language())
  63. }
  64. if reset.selfSeum:
  65. reset.Seum = {'v': 0, 'f': reset.reason}
  66. else:
  67. reset.Seum = {'v': 0, 'f': _('From %(who)s: %(reason)s') % {'who': reset.who.trigramme, 'reason': reset.reason}}
  68. # Drawing the graph
  69. data = ModelDataSource(resets, fields=['timestamp', 'Seum'])
  70. chart = gchart.LineChart(data, options={
  71. 'lineWidth': 0,
  72. 'pointSize': 10,
  73. 'title': '',
  74. 'vAxis': {'ticks': []},
  75. 'hAxis': {'ticks': [{
  76. 'v': firstReset.timestamp.timestamp(),
  77. 'f': arrow.Arrow.fromdatetime(firstReset.timestamp).humanize(locale=get_language())
  78. }, {
  79. 'v': datetime.now().timestamp(),
  80. 'f': 'Présent'}
  81. ]},
  82. 'legend': 'none',
  83. 'height': 90
  84. })
  85. else:
  86. chart = None
  87. return render(request, 'counterTemplate.html', {
  88. 'counter': counter,
  89. 'chart': chart,
  90. 'resets': resets,
  91. 'seumFrequency': seumFrequency,
  92. 'myCounter': myCounter,
  93. })
  94. @login_required
  95. def reset_counter(request):
  96. # Update Form counter
  97. if request.method == 'POST':
  98. # create a form instance and populate it with data from the request:
  99. data = dict(request.POST)
  100. who = Counter.objects.get(pk=int(data['who'][0]))
  101. reason = data['reason'][0]
  102. if 'counter' in data.keys():
  103. counter = Counter.objects.get(pk=int(data['counter'][0]))
  104. else:
  105. try:
  106. counter = Counter.objects.get(trigramme=data['trigramme'][0])
  107. except Counter.DoesNotExist:
  108. return HttpResponseRedirect(data['redirect'][0])
  109. reset = Reset(counter=counter, who=who, reason=data['reason'][0])
  110. # we check that the seumer is the autenticated user
  111. if reset.who.user is None or reset.who.user != request.user:
  112. return HttpResponseRedirect(data['redirect'][0])
  113. reset.save()
  114. # Now we deal with the hashtags
  115. keywords = parseSeumReason(reason)
  116. Hashtag.objects.bulk_create([Hashtag(reset=reset, keyword=keyword) for keyword in keywords])
  117. # We send the emails only to those who want
  118. emails = [u['email'] for u in Counter.objects.filter(email_notifications=True).values('email')]
  119. # Now send emails to everyone
  120. if reset.who is None or reset.who == counter:
  121. selfSeum = True
  122. else:
  123. selfSeum = False
  124. text_of_email = render_to_string(
  125. 'seumEmail.txt', {'reason': data['reason'][0],
  126. 'name': counter.name,
  127. 'who': reset.who,
  128. 'selfSeum': selfSeum,
  129. })
  130. email_to_send = EmailMessage(
  131. '[SeumBook] ' + counter.trigramme + ' a le seum',
  132. text_of_email,
  133. 'SeumMan <seum@merigoux.ovh>', emails, [],
  134. reply_to=emails)
  135. email_to_send.send(fail_silently=True)
  136. return HttpResponseRedirect(data['redirect'][0])