posting.py 4.0 KB

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