threads.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from django.conf import settings
  2. from misago.acl import add_acl
  3. from misago.core.shortcuts import paginate, pagination_dict
  4. from misago.readtracker import threadstracker
  5. from misago.threads.permissions import exclude_invisible_threads
  6. from misago.threads.threadtypes import trees_map
  7. from misago.threads.subscriptions import make_subscription_aware
  8. from misago.threads.utils import add_categories_to_items, add_likes_to_posts
  9. from misago.threads.viewmodels import ThreadsRootCategory
  10. from misago.users.online.utils import make_users_status_aware
  11. from ..serializers.userfeed import UserFeedSerializer
  12. class UserThreads(object):
  13. def __init__(self, request, profile, page=0):
  14. root_category = ThreadsRootCategory(request)
  15. threads_categories = [root_category.unwrap()] + root_category.subcategories
  16. threads_queryset = self.get_threads_queryset(
  17. request, threads_categories, profile)
  18. posts_queryset = self.get_posts_queryset(
  19. request.user, profile, threads_queryset
  20. ).filter(
  21. is_event=False,
  22. is_hidden=False,
  23. is_unapproved=False
  24. ).order_by('-pk')
  25. list_page = paginate(
  26. posts_queryset, page, settings.MISAGO_POSTS_PER_PAGE, settings.MISAGO_POSTS_TAIL)
  27. paginator = pagination_dict(list_page, include_page_range=False)
  28. posts = list(list_page.object_list)
  29. posters = []
  30. threads = []
  31. for post in posts:
  32. threads.append(post.thread)
  33. if post.poster:
  34. posters.append(post.poster)
  35. add_categories_to_items(
  36. root_category.unwrap(), threads_categories, posts + threads)
  37. add_acl(request.user, threads)
  38. add_acl(request.user, posts)
  39. threadstracker.make_threads_read_aware(request.user, threads)
  40. for post in posts:
  41. threadstracker.make_posts_read_aware(request.user, post.thread, [post])
  42. add_likes_to_posts(request.user, posts)
  43. make_users_status_aware(request.user, posters)
  44. self._user = request.user
  45. self.posts = posts
  46. self.paginator = paginator
  47. def get_threads_queryset(self, request, threads_categories, profile):
  48. return exclude_invisible_threads(
  49. request.user, threads_categories, profile.thread_set)
  50. def get_posts_queryset(self, user, profile, threads_queryset):
  51. return profile.post_set.select_related('thread').filter(
  52. id__in=threads_queryset.values('first_post_id')
  53. )
  54. def get_frontend_context(self):
  55. context = {
  56. 'results': UserFeedSerializer(self.posts, many=True, context={'user': self._user}).data
  57. }
  58. context.update(self.paginator)
  59. return context
  60. def get_template_context(self):
  61. return {
  62. 'posts': self.posts,
  63. 'paginator': self.paginator
  64. }