goto.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.http import Http404
  2. from django.shortcuts import redirect
  3. from misago.threads import goto
  4. from misago.threads.views.generic.base import ViewBase
  5. __all__ = [
  6. 'BaseGotoView',
  7. 'GotoLastView',
  8. 'GotoNewView',
  9. 'GotoPostView'
  10. ]
  11. class BaseGotoView(ViewBase):
  12. def get_redirect(self, user, thread):
  13. raise NotImplementedError("views inheriting form BaseGotoView "
  14. "should define get_redirect method")
  15. def dispatch(self, request, *args, **kwargs):
  16. relations = ['categorys']
  17. thread = self.fetch_thread(request, select_related=relations, **kwargs)
  18. categorys = thread.categorys
  19. self.check_categorys_permissions(request, categorys)
  20. self.check_thread_permissions(request, thread)
  21. posts_qs = self.exclude_invisible_posts(
  22. thread.post_set, request.user, categorys, thread)
  23. return redirect(self.get_redirect(request.user, thread, posts_qs))
  24. class GotoLastView(BaseGotoView):
  25. def get_redirect(self, user, thread, posts_qs):
  26. return goto.last(thread, posts_qs)
  27. class GotoNewView(BaseGotoView):
  28. def get_redirect(self, user, thread, posts_qs):
  29. return goto.new(user, thread, posts_qs)
  30. class GotoPostView(BaseGotoView):
  31. def get_redirect(self, thread, posts_qs, post):
  32. return goto.post(thread, posts_qs, post)
  33. def dispatch(self, request, *args, **kwargs):
  34. post = self.fetch_post(
  35. request, select_related=['thread', 'categorys'], **kwargs)
  36. categorys = post.categorys
  37. thread = post.thread
  38. self.check_categorys_permissions(request, categorys)
  39. thread.categorys = categorys
  40. self.check_thread_permissions(request, thread)
  41. self.check_post_permissions(request, post)
  42. posts_qs = self.exclude_invisible_posts(
  43. thread.post_set, request.user, thread.categorys, thread)
  44. return redirect(self.get_redirect(thread, posts_qs, post))