merge.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from django.core.exceptions import PermissionDenied
  2. from django.utils.translation import gettext as _
  3. from rest_framework.response import Response
  4. from misago.acl.objectacl import add_acl_to_obj
  5. from misago.threads.serializers import MergePostsSerializer, PostSerializer
  6. def posts_merge_endpoint(request, thread):
  7. if not thread.acl["can_merge_posts"]:
  8. raise PermissionDenied(_("You can't merge posts in this thread."))
  9. serializer = MergePostsSerializer(
  10. data=request.data, context={"thread": thread, "user_acl": request.user_acl}
  11. )
  12. if not serializer.is_valid():
  13. return Response({"detail": list(serializer.errors.values())[0][0]}, status=400)
  14. posts = serializer.validated_data["posts"]
  15. first_post, merged_posts = posts[0], posts[1:]
  16. for post in merged_posts:
  17. post.merge(first_post)
  18. post.delete()
  19. if first_post.pk == thread.first_post_id:
  20. first_post.set_search_document(thread.title)
  21. else:
  22. first_post.set_search_document()
  23. first_post.save()
  24. first_post.update_search_vector()
  25. first_post.save(update_fields=["search_vector"])
  26. first_post.postread_set.all().delete()
  27. thread.synchronize()
  28. thread.save()
  29. thread.category.synchronize()
  30. thread.category.save()
  31. first_post.thread = thread
  32. first_post.category = thread.category
  33. add_acl_to_obj(request.user_acl, first_post)
  34. return Response(PostSerializer(first_post, context={"user": request.user}).data)