posting.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from django.contrib import messages
  2. from django.db.models import Q
  3. from django.db.transaction import atomic
  4. from django.shortcuts import redirect, render
  5. from django.utils.translation import ugettext_lazy, ugettext as _
  6. from django.views.generic import View
  7. from misago.forums.lists import get_forum_path
  8. from misago.threads.posting import (PostingInterrupt, EditorFormset,
  9. START, REPLY, EDIT)
  10. from misago.threads.models import ANNOUNCEMENT, Thread, Post
  11. from misago.threads.permissions import allow_start_thread
  12. from misago.threads.views.generic.base import ViewBase
  13. __all__ = ['EditorView']
  14. class EditorView(ViewBase):
  15. """
  16. Basic view for starting/replying/editing
  17. """
  18. template = 'misago/posting/form.html'
  19. def find_mode(self, request, *args, **kwargs):
  20. """
  21. First step: guess from request what kind of view we are
  22. """
  23. is_post = request.method == 'POST'
  24. if 'forum_id' in kwargs:
  25. mode = START
  26. user = request.user
  27. forum = self.get_forum(request, lock=is_post, **kwargs)
  28. thread = Thread(forum=forum)
  29. post = Post(forum=forum, thread=thread)
  30. quote = Post(0)
  31. elif 'thread_id' in kwargs:
  32. thread = self.get_thread(request, lock=is_post, **kwargs)
  33. forum = thread.forum
  34. return mode, forum, thread, post, quote
  35. def allow_mode(self, user, mode, forum, thread, post, quote):
  36. """
  37. Second step: check start/reply/edit permissions
  38. """
  39. if mode == START:
  40. self.allow_start(user, forum)
  41. if mode == REPLY:
  42. self.allow_reply(user, forum, thread, quote)
  43. if mode == EDIT:
  44. self.allow_edit(user, forum, thread, post)
  45. def allow_start(self, user, forum):
  46. allow_start_thread(user, forum)
  47. def allow_reply(self, user, forum, thread, quote):
  48. raise NotImplementedError()
  49. def allow_edit(self, user, forum, thread, post):
  50. raise NotImplementedError()
  51. def dispatch(self, request, *args, **kwargs):
  52. if request.method == 'POST':
  53. with atomic():
  54. return self.real_dispatch(request, *args, **kwargs)
  55. else:
  56. return self.real_dispatch(request, *args, **kwargs)
  57. def real_dispatch(self, request, *args, **kwargs):
  58. mode_context = self.find_mode(request, *args, **kwargs)
  59. self.allow_mode(request.user, *mode_context)
  60. mode, forum, thread, post, quote = mode_context
  61. formset = EditorFormset(request=request,
  62. mode=mode,
  63. user=request.user,
  64. forum=forum,
  65. thread=thread,
  66. post=post,
  67. quote=quote)
  68. if request.method == 'POST':
  69. if 'submit' in request.POST and formset.is_valid():
  70. try:
  71. formset.save()
  72. return redirect(thread.get_absolute_url())
  73. except PostingInterrupt as e:
  74. messages.error(request, e.message)
  75. else:
  76. formset.update()
  77. return self.render(request, {
  78. 'mode': mode,
  79. 'formset': formset,
  80. 'forms': formset.get_forms_list(),
  81. 'main_forms': formset.get_main_forms(),
  82. 'supporting_forms': formset.get_supporting_forms(),
  83. 'forum': forum,
  84. 'path': get_forum_path(forum),
  85. 'thread': thread,
  86. 'post': post,
  87. 'quote': quote,
  88. })