thread.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from django.shortcuts import get_object_or_404
  2. from misago.acl import add_acl
  3. from misago.categories.models import Category
  4. from misago.core.shortcuts import validate_slug
  5. from misago.readtracker.threadstracker import make_read_aware
  6. from misago.threads.models import Thread
  7. from misago.threads.permissions.threads import allow_see_thread
  8. from misago.threads.serializers import ThreadSerializer
  9. from misago.threads.subscriptions import make_subscription_aware
  10. BASE_QUERYSET = Thread.objects.select_related(
  11. 'category', 'starter', 'starter__rank', 'starter__ban_cache', 'starter__online_tracker')
  12. class ViewModel(object):
  13. def __init__(self, request, slug, pk):
  14. thread = self.get_thread(request, pk, slug)
  15. add_acl(request.user, thread.category)
  16. add_acl(request.user, thread)
  17. make_read_aware(request.user, thread)
  18. make_subscription_aware(request.user, thread)
  19. self.thread = thread
  20. self.category = thread.category
  21. def get_thread(self, request, pk, slug=None):
  22. raise NotImplementedError('Thread view model has to implement get_Thread(request, pk, slug=None)')
  23. def get_frontend_context(self):
  24. return {
  25. 'THREAD': ThreadSerializer(self.thread).data
  26. }
  27. def get_template_context(self):
  28. return {
  29. 'thread': self.thread,
  30. 'category': self.category
  31. }
  32. class ForumThread(ViewModel):
  33. def get_thread(self, request, pk, slug=None):
  34. thread = get_object_or_404(
  35. BASE_QUERYSET,
  36. pk=pk,
  37. category__tree_id=Category.objects.root_category().tree_id,
  38. )
  39. allow_see_thread(request.user, thread)
  40. if slug:
  41. validate_slug(thread, slug)
  42. return thread