reply.py 3.7 KB

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