generic.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. """
  2. Module with basic views for use by inheriting actions
  3. """
  4. from django.shortcuts import render
  5. from django.views.generic import View
  6. from misago.acl import add_acl
  7. from misago.core.shortcuts import get_object_or_404, paginate, validate_slug
  8. from misago.forums.lists import get_forums_list, get_forum_path
  9. from misago.forums.models import Forum
  10. from misago.forums.permissions import allow_see_forum, allow_browse_forum
  11. class ForumMixin(object):
  12. """
  13. Mixin for getting forums
  14. """
  15. def get_forum(self, request, **kwargs):
  16. forum = self.fetch_forum(request, **kwargs)
  17. self.check_forum_permissions(request, forum)
  18. if kwargs.get('forum_slug'):
  19. validate_slug(forum, kwargs.get('forum_slug'))
  20. return forum
  21. def fetch_forum(self, request, **kwargs):
  22. return get_object_or_404(
  23. Forum, id=kwargs.get('forum_id'), role='forum')
  24. def check_forum_permissions(self, request, forum):
  25. add_acl(request.user, forum)
  26. allow_see_forum(request.user, forum)
  27. allow_browse_forum(request.user, forum)
  28. class ViewBase(ForumMixin, View):
  29. templates_dir = ''
  30. template = ''
  31. def final_template(self):
  32. return '%s/%s' % (self.templates_dir, self.template)
  33. def process_context(self, request, context):
  34. """
  35. Simple hook for extending and manipulating template context.
  36. """
  37. return context
  38. def render(self, request, context=None, template=None):
  39. context = self.process_context(request, context or {})
  40. template = template or self.final_template()
  41. return render(request, template, context)
  42. class ForumView(ViewBase):
  43. """
  44. Basic view for threads lists
  45. """
  46. template = 'list.html'
  47. def get_threads(self, request, forum, **kwargs):
  48. return forum.thread_set
  49. def dispatch(self, request, *args, **kwargs):
  50. forum = self.get_forum(request, **kwargs)
  51. forum.subforums = get_forums_list(request.user, forum)
  52. threads = self.get_threads(request, forum, **kwargs)
  53. return self.render(request, {
  54. 'forum': forum,
  55. 'path': get_forum_path(forum),
  56. })
  57. class ThreadView(ViewBase):
  58. """
  59. Basic view for threads
  60. """
  61. def fetch_thread(self, request, **kwargs):
  62. pass
  63. def dispatch(self, request, *args, **kwargs):
  64. thread = self.fetch_thread(request, **kwargs)
  65. class PostView(ViewBase):
  66. """
  67. Basic view for posts
  68. """
  69. def fetch_post(self, request, **kwargs):
  70. pass
  71. def dispatch(self, request, *args, **kwargs):
  72. post = self.fetch_post(request, **kwargs)
  73. class EditorView(ViewBase):
  74. """
  75. Basic view for starting/replying/editing
  76. """
  77. pass