post.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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 ..permissions.threads import exclude_invisible_posts
  5. class ViewModel(BaseViewModel):
  6. def __init__(self, request, thread, pk, select_for_update=False):
  7. model = self.get_post(request, thread, pk, select_for_update)
  8. add_acl(request.user, model)
  9. self._model = model
  10. def get_post(self, request, thread, pk, select_for_update=False):
  11. try:
  12. thread_model = thread.unwrap()
  13. except AttributeError:
  14. thread_model = thread
  15. queryset = self.get_queryset(request, thread_model)
  16. if select_for_update:
  17. queryset = queryset.select_for_update()
  18. else:
  19. queryset = queryset.select_related(
  20. 'poster',
  21. 'poster__rank',
  22. 'poster__ban_cache'
  23. )
  24. post = get_object_or_404(queryset, pk=pk)
  25. post.thread = thread_model
  26. post.category = thread.category
  27. return post
  28. def get_queryset(self, request, thread):
  29. return exclude_invisible_posts(
  30. request.user, thread.category, thread.post_set)
  31. class ThreadPost(ViewModel):
  32. pass