reply.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from rest_framework import serializers
  2. from django.utils.translation import ugettext_lazy
  3. from misago.markup import common_flavour
  4. from misago.threads.checksums import update_post_checksum
  5. from misago.threads.validators import validate_post, validate_post_length, validate_title
  6. from misago.users.audittrail import create_audit_trail
  7. from . import PostingEndpoint, PostingMiddleware
  8. class ReplyMiddleware(PostingMiddleware):
  9. def get_serializer(self):
  10. if self.mode == PostingEndpoint.START:
  11. return ThreadSerializer(data=self.request.data, context=self.kwargs)
  12. else:
  13. return ReplySerializer(data=self.request.data, context=self.kwargs)
  14. def save(self, serializer):
  15. if self.mode == PostingEndpoint.START:
  16. self.new_thread(serializer.validated_data)
  17. parsing_result = serializer.validated_data['parsing_result']
  18. if self.mode == PostingEndpoint.EDIT:
  19. self.edit_post(serializer.validated_data, parsing_result)
  20. else:
  21. self.new_post(serializer.validated_data, parsing_result)
  22. if self.mode == PostingEndpoint.START:
  23. self.post.set_search_document(self.thread.title)
  24. else:
  25. self.post.set_search_document()
  26. self.post.updated_on = self.datetime
  27. self.post.save()
  28. self.post.update_search_vector()
  29. update_post_checksum(self.post)
  30. self.post.update_fields += ['checksum', 'search_vector']
  31. if self.mode == PostingEndpoint.START:
  32. self.thread.set_first_post(self.post)
  33. self.thread.set_last_post(self.post)
  34. self.thread.save()
  35. create_audit_trail(self.request, self.post)
  36. # annotate post for future middlewares
  37. self.post.parsing_result = parsing_result
  38. def new_thread(self, validated_data):
  39. self.thread.set_title(validated_data['title'])
  40. self.thread.starter_name = self.user.username
  41. self.thread.starter_slug = self.user.slug
  42. self.thread.last_poster_name = self.user.username
  43. self.thread.last_poster_slug = self.user.slug
  44. self.thread.started_on = self.datetime
  45. self.thread.last_post_on = self.datetime
  46. self.thread.save()
  47. def edit_post(self, validated_data, parsing_result):
  48. self.post.original = parsing_result['original_text']
  49. self.post.parsed = parsing_result['parsed_text']
  50. def new_post(self, validated_data, parsing_result):
  51. self.post.thread = self.thread
  52. self.post.poster = self.user
  53. self.post.poster_name = self.user.username
  54. self.post.posted_on = self.datetime
  55. self.post.original = parsing_result['original_text']
  56. self.post.parsed = parsing_result['parsed_text']
  57. class ReplySerializer(serializers.Serializer):
  58. post = serializers.CharField(
  59. validators=[validate_post_length],
  60. error_messages={
  61. 'required': ugettext_lazy("You have to enter a message."),
  62. }
  63. )
  64. def validate(self, data):
  65. if data.get('post'):
  66. data['parsing_result'] = self.parse_post(data['post'])
  67. data = validate_post(self.context, data)
  68. return data
  69. def parse_post(self, post):
  70. if self.context['mode'] == PostingEndpoint.START:
  71. return common_flavour(self.context['request'], self.context['user'], post)
  72. else:
  73. return common_flavour(self.context['request'], self.context['post'].poster, post)
  74. class ThreadSerializer(ReplySerializer):
  75. title = serializers.CharField(
  76. validators=[validate_title],
  77. error_messages={
  78. 'required': ugettext_lazy("You have to enter thread title."),
  79. }
  80. )