post.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from django.shortcuts import get_object_or_404
  2. from misago.acl import add_acl
  3. from ..permissions.threads import allow_see_post, exclude_invisible_posts
  4. class ViewModel(object):
  5. def __init__(self, request, thread, pk, select_for_update=False):
  6. post = self.get_post(request, thread, pk, select_for_update)
  7. add_acl(request.user, post)
  8. self.post = post
  9. def get_post(self, request, thread, pk, select_for_update=False):
  10. queryset = self.get_queryset(request, thread.thread)
  11. if select_for_update:
  12. queryset = queryset.select_for_update()
  13. else:
  14. queryset = queryset.select_related(
  15. 'poster',
  16. 'poster__rank',
  17. 'poster__ban_cache'
  18. )
  19. post = get_object_or_404(queryset, pk=pk, is_event=False)
  20. post.category = thread.category
  21. allow_see_post(request.user, post)
  22. return post
  23. def get_queryset(self, request, thread):
  24. return exclude_invisible_posts(request.user, thread.category, thread.post_set)
  25. class ThreadPost(ViewModel):
  26. pass