base.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from django.template import RequestContext
  2. from django.utils import timezone
  3. from misago.acl.exceptions import ACLError403, ACLError404
  4. from misago.apps.errors import error403, error404
  5. from misago.forms import FormLayout
  6. from misago.markdown import post_markdown
  7. from misago.messages import Message
  8. from misago.models import Forum, WatchedThread
  9. class PostingBaseView(object):
  10. def __new__(cls, request, **kwargs):
  11. obj = super(PostingBaseView, cls).__new__(cls)
  12. return obj(request, **kwargs)
  13. def _set_context(self):
  14. self.set_context()
  15. if self.forum.level:
  16. self.parents = Forum.objects.forum_parents(self.forum.pk)
  17. def watch_thread(self):
  18. if self.request.user.subscribe_start:
  19. try:
  20. WatchedThread.objects.get(user=self.request.user, thread=self.thread)
  21. except WatchedThread.DoesNotExist:
  22. WatchedThread.objects.create(
  23. user=self.request.user,
  24. forum=self.forum,
  25. thread=self.thread,
  26. last_read=timezone.now(),
  27. email=(self.request.user.subscribe_start == 2),
  28. )
  29. def __call__(self, request, **kwargs):
  30. self.request = request
  31. self.kwargs = kwargs
  32. self.forum = None
  33. self.thread = None
  34. self.quote = None
  35. self.post = None
  36. self.parents = []
  37. self.message = request.messages.get_message('threads')
  38. post_preview = ''
  39. try:
  40. self._set_context()
  41. if request.method == 'POST':
  42. try:
  43. form = self.form_type(request.POST, request.FILE, request=request, forum=self.forum, thread=self.thread)
  44. except AttributeError:
  45. form = self.form_type(request.POST, request=request, forum=self.forum, thread=self.thread)
  46. if 'preview' in request.POST:
  47. form.empty_errors()
  48. if form['post'].value():
  49. md, post_preview = post_markdown(request, form['post'].value())
  50. else:
  51. md, post_preview = None, None
  52. else:
  53. if form.is_valid():
  54. self.post_form(form)
  55. self.watch_thread()
  56. return self.response()
  57. else:
  58. message = Message(form.non_field_errors()[0], 'error')
  59. else:
  60. form = self.form_type(request=request, forum=self.forum, thread=self.thread)
  61. except Forum.DoesNotExist:
  62. return error404(request)
  63. except ACLError403 as e:
  64. return error403(request, unicode(e))
  65. except ACLError404 as e:
  66. return error404(request, unicode(e))
  67. return request.theme.render_to_response(('%s/posting.html' % self.templates_prefix),
  68. {
  69. 'action': self.action,
  70. 'message': self.message,
  71. 'forum': self.forum,
  72. 'thread': self.thread,
  73. 'quote': self.quote,
  74. 'post': self.post,
  75. 'parents': self.parents,
  76. 'preview': post_preview,
  77. 'form': FormLayout(form),
  78. },
  79. context_instance=RequestContext(request));