posts.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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.threadstracker import make_posts_read_aware
  5. from misago.users.online.utils import make_users_status_aware
  6. from ..permissions.threads import exclude_invisible_posts
  7. from ..serializers import PostSerializer
  8. from ..utils import add_likes_to_posts
  9. __all__ = ['ThreadPosts']
  10. class ViewModel(object):
  11. def __init__(self, request, thread, page):
  12. try:
  13. thread_model = thread.unwrap()
  14. except AttributeError:
  15. thread_model = thread
  16. posts_queryset = self.get_queryset(request, thread_model)
  17. list_page = paginate(
  18. posts_queryset, page, settings.MISAGO_POSTS_PER_PAGE, settings.MISAGO_POSTS_TAIL)
  19. paginator = pagination_dict(list_page, include_page_range=False)
  20. posts = list(list_page.object_list)
  21. posters = []
  22. for post in posts:
  23. post.category = thread.category
  24. post.thread = thread_model
  25. if post.poster:
  26. posters.append(post.poster)
  27. add_acl(request.user, posts)
  28. make_posts_read_aware(request.user, thread_model, posts)
  29. make_users_status_aware(request.user, posters)
  30. if thread.category.acl['can_see_posts_likes']:
  31. add_likes_to_posts(request.user, posts)
  32. self._user = request.user
  33. self.posts = posts
  34. self.paginator = paginator
  35. def get_queryset(self, request, thread):
  36. queryset = thread.post_set.select_related(
  37. 'poster',
  38. 'poster__rank',
  39. 'poster__ban_cache',
  40. 'poster__online_tracker'
  41. ).order_by('id')
  42. return exclude_invisible_posts(request.user, thread.category, queryset)
  43. def get_frontend_context(self):
  44. context = {
  45. 'results': PostSerializer(self.posts, many=True, context={'user': self._user}).data
  46. }
  47. context.update(self.paginator)
  48. return context
  49. def get_template_context(self):
  50. return {
  51. 'posts': self.posts,
  52. 'paginator': self.paginator
  53. }
  54. class ThreadPosts(ViewModel):
  55. pass