threads.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from django.core.paginator import EmptyPage, InvalidPage
  2. from django.http import Http404
  3. from ...acl.objectacl import add_acl_to_obj
  4. from ...core.cursorpagination import get_page
  5. from ...core.shortcuts import paginate, pagination_dict
  6. from ...threads.permissions import exclude_invisible_threads
  7. from ...threads.serializers import FeedSerializer
  8. from ...threads.utils import add_categories_to_items
  9. from ...threads.viewmodels import ThreadsRootCategory
  10. class UserThreads:
  11. def __init__(self, request, profile, start=0):
  12. root_category = ThreadsRootCategory(request)
  13. threads_categories = [root_category.unwrap()] + root_category.subcategories
  14. threads_queryset = self.get_threads_queryset(
  15. request, threads_categories, profile
  16. )
  17. posts_queryset = (
  18. self.get_posts_queryset(request.user, profile, threads_queryset)
  19. .filter(is_event=False, is_hidden=False, is_unapproved=False)
  20. .order_by("-id")
  21. )
  22. try:
  23. list_page = get_page(
  24. posts_queryset, "-id", request.settings.posts_per_page, start
  25. )
  26. except (EmptyPage, InvalidPage):
  27. raise Http404()
  28. posts = list(list_page.object_list)
  29. threads = []
  30. for post in posts:
  31. threads.append(post.thread)
  32. add_categories_to_items(
  33. root_category.unwrap(), threads_categories, posts + threads
  34. )
  35. add_acl_to_obj(request.user_acl, threads)
  36. add_acl_to_obj(request.user_acl, posts)
  37. self._user = request.user
  38. self.posts = posts
  39. self.list_page = list_page
  40. def get_threads_queryset(self, request, threads_categories, profile):
  41. return exclude_invisible_threads(
  42. request.user_acl, threads_categories, profile.thread_set
  43. )
  44. def get_posts_queryset(self, user, profile, threads_queryset):
  45. return profile.post_set.select_related("thread", "poster").filter(
  46. id__in=threads_queryset.values("first_post_id")
  47. )
  48. def get_frontend_context(self):
  49. return {
  50. "results": UserFeedSerializer(
  51. self.posts, many=True, context={"user": self._user}
  52. ).data,
  53. "next": self.list_page.next,
  54. }
  55. def get_template_context(self):
  56. return {"posts": self.posts, "next": self.list_page.next}
  57. UserFeedSerializer = FeedSerializer.exclude_fields("poster")