forums.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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.dates import cutoff_date, is_date_tracked
  5. __all__ = ['make_forums_read_aware', 'make_forums_read', 'sync_forum_record']
  6. def make_forums_read_aware(user, forums):
  7. if user.is_anonymous():
  8. make_forums_read(forums)
  9. return None
  10. forums_dict = {}
  11. for forum in forums:
  12. forum.is_read = not is_date_tracked(forum.last_post_on)
  13. forums_dict[forum.pk] = forum
  14. for record in user.forumread_set.filter(forum__in=forums_dict.keys()):
  15. if record.forum_id in forums_dict:
  16. forum = forums_dict[record.forum_id]
  17. forum.is_read = record.last_cleared_on >= forum.last_post_on
  18. def make_forums_read(forums):
  19. for forum in forums:
  20. forum.is_read = True
  21. def sync_forum_record(user, forum):
  22. recorded_threads = forum.thread_set.filter(last_post_on__gt=cutoff_date())
  23. recorded_threads = exclude_invisible_threads(user, forum, recorded_threads)
  24. all_threads_count = recorded_threads.count()
  25. read_threads = user.threadread_set.filter(
  26. forum=forum, last_read_on__gt=cutoff_date())
  27. read_threads_count = read_threads.filter(
  28. thread__last_post_on__lte=F("last_read_on")).count()
  29. forum_is_read = read_threads_count == all_threads_count
  30. try:
  31. forum_record = user.forumread_set.filter(forum=forum).all()[0]
  32. forum_record.last_updated_on = timezone.now()
  33. if forum_is_read:
  34. forum_record.last_cleared_on = forum_record.last_updated_on
  35. forum_record.save(update_fields=['last_updated_on', 'last_cleared_on'])
  36. except IndexError:
  37. if forum_is_read:
  38. cleared_on = timezone.now()
  39. else:
  40. cleared_on = cutoff_date()
  41. forum_record = user.forumread_set.create(
  42. forum=forum,
  43. last_updated_on=timezone.now(),
  44. last_cleared_on=cleared_on)