trackers.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from datetime import timedelta
  2. from django.conf import settings
  3. from django.utils import timezone
  4. from misago.readstracker.models import ForumRecord, ThreadRecord
  5. from misago.threads.models import Thread
  6. class ForumsTracker(object):
  7. def __init__(self, user):
  8. self.user = user
  9. self.cutoff = timezone.now() - timedelta(days=settings.READS_TRACKER_LENGTH)
  10. self.forums = {}
  11. if user.is_authenticated() and settings.READS_TRACKER_LENGTH > 0:
  12. if user.join_date > self.cutoff:
  13. self.cutoff = user.join_date
  14. for forum in ForumRecord.objects.filter(user=user).filter(updated__gte=self.cutoff).values('id', 'forum_id', 'updated', 'cleared'):
  15. self.forums[forum['forum_id']] = forum
  16. def is_read(self, forum):
  17. if not self.user.is_authenticated() or not forum.last_thread_date:
  18. return True
  19. try:
  20. print '===='
  21. print forum.last_thread_date
  22. print self.forums[forum.pk]['cleared']
  23. return forum.last_thread_date <= self.cutoff or forum.last_thread_date <= self.forums[forum.pk]['cleared']
  24. except KeyError:
  25. return False
  26. class ThreadsTracker(object):
  27. def __init__(self, request, forum):
  28. self.need_sync = False
  29. self.need_create = []
  30. self.need_update = []
  31. self.need_delete = []
  32. self.request = request
  33. self.forum = forum
  34. self.cutoff = timezone.now() - timedelta(days=settings.READS_TRACKER_LENGTH)
  35. if request.user.is_authenticated():
  36. if request.user.join_date > self.cutoff:
  37. self.cutoff = request.user.join_date
  38. try:
  39. self.record = ForumRecord.objects.get(user=request.user, forum=forum)
  40. if self.record.cleared > self.cutoff:
  41. self.cutoff = self.record.cleared
  42. except ForumRecord.DoesNotExist:
  43. self.record = ForumRecord(user=request.user, forum=forum, cleared=self.cutoff)
  44. self.threads = self.record.get_threads()
  45. def get_read_date(self, thread):
  46. if not self.request.user.is_authenticated():
  47. return timezone.now()
  48. try:
  49. if self.threads[thread.pk].updated > self.cutoff:
  50. return self.threads[thread.pk].updated
  51. except KeyError:
  52. pass
  53. return self.cutoff
  54. def is_read(self, thread):
  55. if not self.request.user.is_authenticated():
  56. return True
  57. try:
  58. return thread.last <= self.cutoff or thread.last <= self.threads[thread.pk].updated
  59. except KeyError:
  60. return False
  61. def set_read(self, thread, post):
  62. if self.request.user.is_authenticated() and post.date > self.cutoff:
  63. try:
  64. self.threads[thread.pk].updated = post.date
  65. self.need_update = thread
  66. except KeyError:
  67. self.need_create = thread
  68. def sync(self):
  69. now = timezone.now()
  70. if self.need_create:
  71. new_record = ThreadRecord(
  72. user=self.request.user,
  73. thread=self.need_create,
  74. forum=self.forum,
  75. updated=now
  76. )
  77. new_record.save(force_insert=True)
  78. self.threads[new_record.thread_id] = new_record
  79. if self.need_update:
  80. need_update.updated = now
  81. need_update.save(force_update=True)
  82. if self.need_create or self.need_delete or self.need_update:
  83. unread_threads = 0
  84. for thread in self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set.filter(last__gte=self.record.cleared)):
  85. if not self.is_read(thread):
  86. unread_threads += 1
  87. if not unread_threads:
  88. self.record.cleared = now
  89. self.record.updated = now
  90. if self.record.pk:
  91. self.record.save(force_update=True)
  92. else:
  93. self.record.save(force_insert=True)