threads.py 2.3 KB

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