Sin descripción

counter.py 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from datetime import datetime, timedelta
  2. import copy
  3. from django.contrib.auth.decorators import login_required
  4. from django.core.urlresolvers import reverse
  5. from django.http import HttpResponseRedirect
  6. from django.shortcuts import render
  7. from django.utils.translation import ugettext as _, get_language
  8. import arrow
  9. from babel.dates import format_timedelta, format_datetime
  10. from graphos.renderers import gchart
  11. from graphos.sources.model import ModelDataSource
  12. from counter.models import *
  13. @login_required
  14. def get(request, id_counter):
  15. try:
  16. myCounter = Counter.objects.get(user__id=request.user.id)
  17. except Counter.DoesNotExist:
  18. return HttpResponseRedirect(reverse('login'))
  19. counter = Counter.objects.prefetch_related('resets', 'resets__likes').get(pk=id_counter)
  20. resets = counter.resets.order_by('-timestamp')
  21. timezero = timedelta(0)
  22. # Display
  23. if resets.count() == 0:
  24. counter.lastReset = Reset()
  25. counter.lastReset.delta = timezero
  26. counter.lastReset.noSeum = True
  27. seumFrequency = _('unknown')
  28. else:
  29. firstReset = resets.reverse()[0]
  30. counter.lastReset = resets[0]
  31. counter.lastReset.noSeum = False
  32. if counter.lastReset.who is None or counter.lastReset.who == counter:
  33. counter.lastReset.selfSeum = True
  34. else:
  35. counter.lastReset.selfSeum = False
  36. counter.lastReset.formatted_delta = arrow.Arrow.fromdatetime(counter.lastReset.timestamp).humanize(locale=get_language())
  37. counter.seumCount = counter.resets.count()
  38. seumFrequency = format_timedelta((datetime.now() - firstReset.timestamp.replace(tzinfo=None)) / counter.seumCount,
  39. locale=get_language(), threshold=1)
  40. counter.lastLikes = list(counter.lastReset.likes.all())
  41. counter.alreadyLiked = myCounter.id in [l.liker.id for l in counter.lastLikes]
  42. counter.likeCount = len(counter.lastLikes)
  43. if counter.likeCount > 0:
  44. counter.likersString = ", ".join(like.liker.trigramme for like in counter.lastLikes)
  45. for reset in resets:
  46. if reset.who is None or reset.who == reset.counter:
  47. reset.selfSeum = True
  48. else:
  49. reset.selfSeum = False
  50. reset.date = reset.timestamp
  51. reset.likeCount = reset.likes.count()
  52. # Timeline graph
  53. # Data pre-processing
  54. if not counter.lastReset.noSeum:
  55. resets_graph = resets
  56. for reset in resets_graph:
  57. reset.timestamp = {
  58. 'v': reset.timestamp.timestamp(),
  59. 'f': arrow.Arrow.fromdatetime(reset.timestamp).humanize(locale=get_language())
  60. }
  61. if reset.selfSeum:
  62. reset.Seum = {'v': 0, 'f': reset.reason}
  63. else:
  64. reset.Seum = {'v': 0, 'f': _('From %(who)s: %(reason)s') % {'who': reset.who.trigramme, 'reason': reset.reason}}
  65. # Drawing the graph
  66. data = ModelDataSource(resets, fields=['timestamp', 'Seum'])
  67. chart = gchart.LineChart(data, options={
  68. 'lineWidth': 0,
  69. 'pointSize': 10,
  70. 'title': '',
  71. 'vAxis': {'ticks': []},
  72. 'hAxis': {'ticks': [{
  73. 'v': firstReset.timestamp.timestamp(),
  74. 'f': arrow.Arrow.fromdatetime(firstReset.timestamp).humanize(locale=get_language())
  75. }, {
  76. 'v': datetime.now().timestamp(),
  77. 'f': 'Présent'}
  78. ]},
  79. 'legend': 'none',
  80. 'height': 90
  81. })
  82. else:
  83. chart = None
  84. return render(request, 'counterTemplate.html', {
  85. 'counter': counter,
  86. 'chart': chart,
  87. 'resets': resets,
  88. 'seumFrequency': seumFrequency,
  89. 'myCounter': myCounter,
  90. })