threads.py 2.4 KB

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