reply.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from django.utils.translation import ugettext_lazy
  2. from rest_framework import serializers
  3. from misago.conf import settings
  4. from misago.markup import common_flavour
  5. from . import PostingEndpoint, PostingMiddleware
  6. from ...checksums import update_post_checksum
  7. from ...validators import validate_post, validate_title
  8. class ReplyMiddleware(PostingMiddleware):
  9. def get_serializer(self):
  10. if self.mode == PostingEndpoint.START:
  11. return ThreadSerializer(data=self.request.data)
  12. else:
  13. return ReplySerializer(data=self.request.data)
  14. def save(self, serializer):
  15. if self.mode == PostingEndpoint.START:
  16. self.new_thread(serializer.validated_data)
  17. parsing_result = self.parse_post(serializer.validated_data['post'])
  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. self.post.updated_on = self.datetime
  23. self.post.save()
  24. update_post_checksum(self.post)
  25. self.post.update_fields.append('checksum')
  26. if self.mode == PostingEndpoint.START:
  27. self.thread.set_first_post(self.post)
  28. if self.mode != PostingEndpoint.EDIT:
  29. self.thread.set_last_post(self.post)
  30. self.thread.save()
  31. def new_thread(self, validated_data):
  32. self.thread.set_title(validated_data['title'])
  33. self.thread.starter_name = self.user.username
  34. self.thread.starter_slug = self.user.slug
  35. self.thread.last_poster_name = self.user.username
  36. self.thread.last_poster_slug = self.user.slug
  37. self.thread.started_on = self.datetime
  38. self.thread.last_post_on = self.datetime
  39. self.thread.save()
  40. def edit_post(self, validated_data, parsing_result):
  41. pass # todo: test if post was really edited, if so, register change
  42. def new_post(self, validated_data, parsing_result):
  43. self.post.thread = self.thread
  44. self.post.poster = self.user
  45. self.post.poster_name = self.user.username
  46. self.post.poster_ip = self.request.user_ip
  47. self.post.posted_on = self.datetime
  48. self.post.original = parsing_result['original_text']
  49. self.post.parsed = parsing_result['parsed_text']
  50. def parse_post(self, post):
  51. if self.mode == PostingEndpoint.START:
  52. return common_flavour(self.request, self.user, post)
  53. else:
  54. return common_flavour(self.request, self.post.poster, post)
  55. class ReplySerializer(serializers.Serializer):
  56. post = serializers.CharField(
  57. validators=[validate_post],
  58. error_messages={
  59. 'required': ugettext_lazy("You have to enter a message.")
  60. }
  61. )
  62. class ThreadSerializer(ReplySerializer):
  63. title = serializers.CharField(
  64. validators=[validate_title],
  65. error_messages={
  66. 'required': ugettext_lazy("You have to enter thread title.")
  67. }
  68. )