forumstracker.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. from misago.readtracker.models import ForumRead
  7. __all__ = ['make_read_aware', 'sync_record']
  8. def make_read_aware(user, forums):
  9. if not hasattr(forums, '__iter__'):
  10. forums = [forums]
  11. if user.is_anonymous():
  12. make_read(forums)
  13. return None
  14. forums_dict = {}
  15. for forum in forums:
  16. forum.last_read_on = user.reads_cutoff
  17. forum.is_read = not is_date_tracked(forum.last_post_on, user)
  18. if not forum.is_read:
  19. forums_dict[forum.pk] = forum
  20. if forums_dict:
  21. for record in user.forumread_set.filter(forum__in=forums_dict.keys()):
  22. forum = forums_dict[record.forum_id]
  23. forum.last_read_on = record.last_read_on
  24. forum.is_read = forum.last_read_on >= forum.last_post_on
  25. def make_read(forums):
  26. now = timezone.now()
  27. for forum in forums:
  28. forum.last_read_on = now
  29. forum.is_read = True
  30. def sync_record(user, forum):
  31. cutoff_date = user.reads_cutoff
  32. try:
  33. forum_record = user.forumread_set.get(forum=forum)
  34. if forum_record.last_read_on > cutoff_date:
  35. cutoff_date = forum_record.last_read_on
  36. except ForumRead.DoesNotExist:
  37. forum_record = None
  38. recorded_threads = forum.thread_set.filter(last_post_on__gt=cutoff_date)
  39. recorded_threads = exclude_invisible_threads(recorded_threads, user, forum)
  40. all_threads_count = recorded_threads.count()
  41. read_threads = user.threadread_set.filter(
  42. forum=forum, last_read_on__gt=cutoff_date)
  43. read_threads_count = read_threads.filter(
  44. thread__last_post_on__lte=F("last_read_on")).count()
  45. forum_is_read = read_threads_count == all_threads_count
  46. if forum_is_read:
  47. signals.forum_read.send(sender=user, forum=forum)
  48. if forum_record:
  49. if forum_is_read:
  50. forum_record.last_read_on = forum_record.last_read_on
  51. else:
  52. forum_record.last_read_on = cutoff_date
  53. forum_record.save(update_fields=['last_read_on'])
  54. else:
  55. if forum_is_read:
  56. last_read_on = timezone.now()
  57. else:
  58. last_read_on = cutoff_date
  59. forum_record = user.forumread_set.create(
  60. forum=forum,
  61. last_read_on=last_read_on)
  62. def read_forum(user, forum):
  63. try:
  64. forum_record = user.forumread_set.get(forum=forum)
  65. forum_record.last_read_on = timezone.now()
  66. forum_record.save(update_fields=['last_read_on'])
  67. except ForumRead.DoesNotExist:
  68. user.forumread_set.create(forum=forum, last_read_on=timezone.now())
  69. signals.forum_read.send(sender=user, forum=forum)