post.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from django.shortcuts import get_object_or_404
  2. from misago.acl import add_acl
  3. from misago.core.viewmodel import ViewModel as BaseViewModel
  4. from misago.threads.permissions.threads import exclude_invisible_posts
  5. __all__ = ['ThreadPost']
  6. class ViewModel(BaseViewModel):
  7. def __init__(self, request, thread, pk, select_for_update=False):
  8. model = self.get_post(request, thread, pk, select_for_update)
  9. add_acl(request.user, model)
  10. self._model = model
  11. def get_post(self, request, thread, pk, select_for_update=False):
  12. try:
  13. thread_model = thread.unwrap()
  14. except AttributeError:
  15. thread_model = thread
  16. queryset = self.get_queryset(request, thread_model)
  17. if select_for_update:
  18. queryset = queryset.select_for_update()
  19. else:
  20. queryset = queryset.select_related(
  21. 'poster',
  22. 'poster__rank',
  23. 'poster__ban_cache'
  24. )
  25. post = get_object_or_404(queryset, pk=pk)
  26. post.thread = thread_model
  27. post.category = thread.category
  28. return post
  29. def get_queryset(self, request, thread):
  30. return exclude_invisible_posts(
  31. request.user, thread.category, thread.post_set)
  32. class ThreadPost(ViewModel):
  33. pass