123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- from django.utils.translation import gettext_lazy
- from rest_framework import serializers
- from misago.markup import common_flavour
- from misago.threads.checksums import update_post_checksum
- from misago.threads.validators import (
- validate_post,
- validate_post_length,
- validate_thread_title,
- )
- from misago.users.audittrail import create_audit_trail
- from . import PostingEndpoint, PostingMiddleware
- class ReplyMiddleware(PostingMiddleware):
- def get_serializer(self):
- if self.mode == PostingEndpoint.START:
- return ThreadSerializer(data=self.request.data, context=self.kwargs)
- else:
- return ReplySerializer(data=self.request.data, context=self.kwargs)
- def save(self, serializer):
- if self.mode == PostingEndpoint.START:
- self.new_thread(serializer.validated_data)
- parsing_result = serializer.validated_data["parsing_result"]
- if self.mode == PostingEndpoint.EDIT:
- self.edit_post(serializer.validated_data, parsing_result)
- else:
- self.new_post(serializer.validated_data, parsing_result)
- if self.mode == PostingEndpoint.START:
- self.post.set_search_document(self.thread.title)
- else:
- self.post.set_search_document()
- self.post.updated_on = self.datetime
- self.post.save()
- self.post.update_search_vector()
- update_post_checksum(self.post)
- self.post.update_fields += ["checksum", "search_vector"]
- if self.mode == PostingEndpoint.START:
- self.thread.set_first_post(self.post)
- self.thread.set_last_post(self.post)
- self.thread.save()
- create_audit_trail(self.request, self.post)
- # annotate post for future middlewares
- self.post.parsing_result = parsing_result
- def new_thread(self, validated_data):
- self.thread.set_title(validated_data["title"])
- self.thread.starter_name = self.user.username
- self.thread.starter_slug = self.user.slug
- self.thread.last_poster_name = self.user.username
- self.thread.last_poster_slug = self.user.slug
- self.thread.started_on = self.datetime
- self.thread.last_post_on = self.datetime
- self.thread.save()
- def edit_post(self, validated_data, parsing_result):
- self.post.original = parsing_result["original_text"]
- self.post.parsed = parsing_result["parsed_text"]
- def new_post(self, validated_data, parsing_result):
- self.post.thread = self.thread
- self.post.poster = self.user
- self.post.poster_name = self.user.username
- self.post.posted_on = self.datetime
- self.post.original = parsing_result["original_text"]
- self.post.parsed = parsing_result["parsed_text"]
- class ReplySerializer(serializers.Serializer):
- post = serializers.CharField(
- error_messages={"required": gettext_lazy("You have to enter a message.")}
- )
- def validate_post(self, data):
- validate_post_length(self.context["settings"], data)
- return data
- def validate(self, data):
- if data.get("post"):
- data["parsing_result"] = self.parse_post(data["post"])
- data = validate_post(self.context, data)
- return data
- def parse_post(self, post):
- if self.context["mode"] == PostingEndpoint.START:
- return common_flavour(self.context["request"], self.context["user"], post)
- else:
- return common_flavour(
- self.context["request"], self.context["post"].poster, post
- )
- class ThreadSerializer(ReplySerializer):
- title = serializers.CharField(
- error_messages={"required": gettext_lazy("You have to enter thread title.")}
- )
- def validate_title(self, data):
- validate_thread_title(self.context["settings"], data)
- return data
|