reply.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from misago.markup import Editor
  2. from misago.threads.checksums import update_post_checksum
  3. from misago.threads.forms.posting import ReplyForm, ThreadForm
  4. from misago.threads.permissions import can_edit_thread
  5. from misago.threads.posting import PostingMiddleware, START, REPLY, EDIT
  6. class ReplyFormMiddleware(PostingMiddleware):
  7. def make_form(self):
  8. initial_data = {'title': self.thread.title, 'post': self.post.original}
  9. if self.mode == EDIT:
  10. is_first_post = self.post.id == self.thread.first_post_id
  11. if is_first_post and can_edit_thread(self.user, self.thread):
  12. FormType = ThreadForm
  13. else:
  14. FormType = ReplyForm
  15. elif self.mode == START:
  16. FormType = ThreadForm
  17. else:
  18. FormType = ReplyForm
  19. if FormType == ThreadForm:
  20. if self.request.method == 'POST':
  21. form = FormType(
  22. self.thread, self.post, self.request, self.request.POST)
  23. else:
  24. form = FormType(
  25. self.thread, self.post, self.request, initial=initial_data)
  26. else:
  27. if self.request.method == 'POST':
  28. form = FormType(
  29. self.post, self.request, self.request.POST)
  30. else:
  31. form = FormType(
  32. self.post, self.request, initial=initial_data)
  33. form.post_editor = Editor(form['post'], has_preview=True)
  34. return form
  35. def pre_save(self, form):
  36. if form.is_valid():
  37. self.parsing_result.update(form.parsing_result)
  38. def save(self, form):
  39. if self.mode == START:
  40. self.new_thread(form)
  41. if self.mode == EDIT:
  42. self.edit_post(form)
  43. else:
  44. self.new_post()
  45. self.post.updated_on = self.datetime
  46. self.post.save()
  47. update_post_checksum(self.post)
  48. self.post.update_fields.append('checksum')
  49. def new_thread(self, form):
  50. self.thread.set_title(form.cleaned_data['title'])
  51. self.thread.starter_name = self.user.username
  52. self.thread.starter_slug = self.user.slug
  53. self.thread.last_poster_name = self.user.username
  54. self.thread.last_poster_slug = self.user.slug
  55. self.thread.started_on = self.datetime
  56. self.thread.last_post_on = self.datetime
  57. self.thread.save()
  58. def edit_post(self, form):
  59. if form.cleaned_data.get('title'):
  60. self.thread.set_title(form.cleaned_data['title'])
  61. self.thread.update_fields.extend(('title', 'slug'))
  62. def new_post(self):
  63. self.post.thread = self.thread
  64. self.post.poster = self.user
  65. self.post.poster_name = self.user.username
  66. self.post.poster_ip = self.request._misago_real_ip
  67. self.post.posted_on = self.datetime