forumstracker.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 start_record(user, forum):
  31. user.forumread_set.create(forum=forum, last_read_on=user.reads_cutoff)
  32. def sync_record(user, forum):
  33. cutoff_date = user.reads_cutoff
  34. try:
  35. forum_record = user.forumread_set.get(forum=forum)
  36. if forum_record.last_read_on > cutoff_date:
  37. cutoff_date = forum_record.last_read_on
  38. except ForumRead.DoesNotExist:
  39. forum_record = None
  40. recorded_threads = forum.thread_set.filter(last_post_on__gt=cutoff_date)
  41. recorded_threads = exclude_invisible_threads(recorded_threads, user, forum)
  42. all_threads_count = recorded_threads.count()
  43. read_threads = user.threadread_set.filter(
  44. forum=forum, last_read_on__gt=cutoff_date)
  45. read_threads_count = read_threads.filter(
  46. thread__last_post_on__lte=F("last_read_on")).count()
  47. forum_is_read = read_threads_count == all_threads_count
  48. if forum_is_read:
  49. signals.forum_read.send(sender=user, forum=forum)
  50. if forum_record:
  51. if forum_is_read:
  52. forum_record.last_read_on = forum_record.last_read_on
  53. else:
  54. forum_record.last_read_on = cutoff_date
  55. forum_record.save(update_fields=['last_read_on'])
  56. else:
  57. if forum_is_read:
  58. last_read_on = timezone.now()
  59. else:
  60. last_read_on = cutoff_date
  61. forum_record = user.forumread_set.create(
  62. forum=forum,
  63. last_read_on=last_read_on)
  64. def read_forum(user, forum):
  65. try:
  66. forum_record = user.forumread_set.get(forum=forum)
  67. forum_record.last_read_on = timezone.now()
  68. forum_record.save(update_fields=['last_read_on'])
  69. except ForumRead.DoesNotExist:
  70. user.forumread_set.create(forum=forum, last_read_on=timezone.now())
  71. signals.forum_read.send(sender=user, forum=forum)