reply.py 3.8 KB

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