poststracker.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from django.db import transaction
  2. from django.utils import timezone
  3. from .dates import get_cutoff_date
  4. from .models import PostRead
  5. def make_read_aware(user, target):
  6. if not target:
  7. return
  8. if hasattr(target, '__iter__'):
  9. make_posts_read_aware(user, target)
  10. else:
  11. make_posts_read_aware(user, [target])
  12. def make_posts_read_aware(user, posts):
  13. make_read(posts)
  14. if user.is_anonymous:
  15. return
  16. cutoff_date = get_cutoff_date(user)
  17. unresolved_posts = {}
  18. for post in posts:
  19. if post.posted_on > cutoff_date:
  20. post.is_read = False
  21. post.is_new = True
  22. unresolved_posts[post.pk] = post
  23. if unresolved_posts:
  24. queryset = user.postread_set.filter(post__in=unresolved_posts)
  25. for post_id in queryset.values_list('post_id', flat=True):
  26. unresolved_posts[post_id].is_read = True
  27. unresolved_posts[post_id].is_new = False
  28. def make_read(posts):
  29. for post in posts:
  30. post.is_read = True
  31. post.is_new = False
  32. def save_read(user, post):
  33. user.postread_set.create(
  34. category=post.category,
  35. thread=post.thread,
  36. post=post,
  37. )
  38. def delete_reads(post):
  39. post.postread_set.all().delete()