post.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from django.shortcuts import get_object_or_404
  2. from misago.acl import add_acl
  3. from ..permissions.threads import exclude_invisible_posts
  4. class ViewModel(object):
  5. def __init__(self, request, thread, pk, select_for_update=False):
  6. model = self.get_post(request, thread, pk, select_for_update)
  7. add_acl(request.user, model)
  8. self._model = model
  9. self._thread = model.thread
  10. self._category = model.category
  11. @property
  12. def model(self):
  13. return self._model
  14. @property
  15. def thread(self):
  16. return self._thread
  17. @property
  18. def category(self):
  19. return self._category
  20. def get_post(self, request, thread, pk, select_for_update=False):
  21. queryset = self.get_queryset(request, thread.model)
  22. if select_for_update:
  23. queryset = queryset.select_for_update()
  24. else:
  25. queryset = queryset.select_related(
  26. 'poster',
  27. 'poster__rank',
  28. 'poster__ban_cache'
  29. )
  30. post = get_object_or_404(queryset, pk=pk)
  31. post.thread = thread.model
  32. post.category = thread.category
  33. return post
  34. def get_queryset(self, request, thread):
  35. return exclude_invisible_posts(request.user, thread.category, thread.post_set)
  36. class ThreadPost(ViewModel):
  37. pass