categoriestracker.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from ..threads.models import Post, Thread
  2. from ..threads.permissions import exclude_invisible_posts, exclude_invisible_threads
  3. from .cutoffdate import get_cutoff_date
  4. def make_read_aware(request, categories):
  5. if not categories:
  6. return
  7. if not hasattr(categories, "__iter__"):
  8. categories = [categories]
  9. make_read(categories)
  10. if request.user.is_anonymous:
  11. return
  12. threads = Thread.objects.filter(category__in=categories)
  13. threads = exclude_invisible_threads(request.user_acl, categories, threads)
  14. queryset = (
  15. Post.objects.filter(
  16. category__in=categories,
  17. thread__in=threads,
  18. posted_on__gt=get_cutoff_date(request.settings, request.user),
  19. )
  20. .values_list("category", flat=True)
  21. .distinct()
  22. )
  23. queryset = queryset.exclude(id__in=request.user.postread_set.values("post"))
  24. queryset = exclude_invisible_posts(request.user_acl, categories, queryset)
  25. unread_categories = list(queryset)
  26. for category in categories:
  27. if category.pk in unread_categories:
  28. category.is_read = False
  29. category.is_new = True
  30. def make_read(threads):
  31. for thread in threads:
  32. thread.is_read = True
  33. thread.is_new = False