forumstracker.py 2.7 KB

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