forumstracker.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from django.db.models import F
  2. from django.utils import timezone
  3. from misago.threads.permissions import exclude_invisible_threads
  4. from misago.readtracker import signals
  5. from misago.readtracker.dates import is_date_tracked
  6. __all__ = ['make_read_aware', 'sync_record']
  7. def make_read_aware(user, forums):
  8. if user.is_anonymous():
  9. make_read(forums)
  10. return None
  11. forums_dict = {}
  12. for forum in forums:
  13. forum.is_read = not is_date_tracked(forum.last_post_on, user)
  14. forums_dict[forum.pk] = forum
  15. for record in user.forumread_set.filter(forum__in=forums_dict.keys()):
  16. if not forum.is_read and record.forum_id in forums_dict:
  17. forum = forums_dict[record.forum_id]
  18. forum.is_read = record.last_read_on >= forum.last_post_on
  19. def make_read(forums):
  20. for forum in forums:
  21. forum.is_read = True
  22. def sync_record(user, forum):
  23. recorded_threads = forum.thread_set.filter(
  24. last_post_on__gt=user.reads_cutoff)
  25. recorded_threads = exclude_invisible_threads(recorded_threads, user, forum)
  26. all_threads_count = recorded_threads.count()
  27. read_threads = user.threadread_set.filter(
  28. forum=forum, last_read_on__gt=user.joined_on)
  29. read_threads_count = read_threads.filter(
  30. thread__last_post_on__lte=F("last_read_on")).count()
  31. forum_is_read = read_threads_count == all_threads_count
  32. if forum_is_read:
  33. signals.forum_read.send(sender=user, forum=forum)
  34. try:
  35. forum_record = user.forumread_set.filter(forum=forum).all()[0]
  36. if forum_is_read:
  37. forum_record.last_read_on = forum_record.last_read_on
  38. else:
  39. forum_record.last_read_on = user.reads_cutoff
  40. forum_record.save(update_fields=['last_read_on'])
  41. except IndexError:
  42. if forum_is_read:
  43. last_read_on = timezone.now()
  44. else:
  45. last_read_on = user.joined_on
  46. forum_record = user.forumread_set.create(
  47. forum=forum,
  48. last_read_on=last_read_on)