threads.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from misago.acl import add_acl
  2. from misago.conf import settings
  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.serializers import FeedSerializer
  7. from misago.threads.utils import add_categories_to_items, add_likes_to_posts
  8. from misago.threads.viewmodels import ThreadsRootCategory
  9. class UserThreads(object):
  10. def __init__(self, request, profile, page=0):
  11. root_category = ThreadsRootCategory(request)
  12. threads_categories = [root_category.unwrap()] + root_category.subcategories
  13. threads_queryset = self.get_threads_queryset(request, threads_categories, profile)
  14. posts_queryset = self.get_posts_queryset(request.user, profile, threads_queryset).filter(
  15. is_event=False, is_hidden=False, is_unapproved=False
  16. ).order_by('-id')
  17. list_page = paginate(
  18. posts_queryset, page, settings.MISAGO_POSTS_PER_PAGE, settings.MISAGO_POSTS_TAIL
  19. )
  20. paginator = pagination_dict(list_page)
  21. posts = list(list_page.object_list)
  22. threads = []
  23. for post in posts:
  24. threads.append(post.thread)
  25. add_categories_to_items(root_category.unwrap(), threads_categories, posts + threads)
  26. add_acl(request.user, threads)
  27. add_acl(request.user, posts)
  28. threadstracker.make_threads_read_aware(request.user, threads)
  29. for post in posts:
  30. threadstracker.make_posts_read_aware(request.user, post.thread, [post])
  31. add_likes_to_posts(request.user, posts)
  32. self._user = request.user
  33. self.posts = posts
  34. self.paginator = paginator
  35. def get_threads_queryset(self, request, threads_categories, profile):
  36. return exclude_invisible_threads(request.user, threads_categories, profile.thread_set)
  37. def get_posts_queryset(self, user, profile, threads_queryset):
  38. return profile.post_set.select_related('thread', 'poster').filter(
  39. id__in=threads_queryset.values('first_post_id')
  40. )
  41. def get_frontend_context(self):
  42. context = {
  43. 'results': UserFeedSerializer(self.posts, many=True, context={'user': self._user}).data
  44. }
  45. context.update(self.paginator)
  46. return context
  47. def get_template_context(self):
  48. return {'posts': self.posts, 'paginator': self.paginator}
  49. UserFeedSerializer = FeedSerializer.exclude_fields('poster')