merge.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from django.core.exceptions import PermissionDenied
  2. from django.utils.translation import gettext as _
  3. from rest_framework.response import Response
  4. from ....acl.objectacl import add_acl_to_obj
  5. from ...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. # Fix for KeyError - errors[0]
  14. errors = list(serializer.errors.values())[0]
  15. try:
  16. return Response({"detail": errors[0]}, status=400)
  17. except KeyError:
  18. return Response({"detail": list(errors.values())[0][0]}, status=400)
  19. posts = serializer.validated_data["posts"]
  20. first_post, merged_posts = posts[0], posts[1:]
  21. for post in merged_posts:
  22. post.merge(first_post)
  23. post.delete()
  24. if first_post.pk == thread.first_post_id:
  25. first_post.set_search_document(thread.title)
  26. else:
  27. first_post.set_search_document()
  28. first_post.save()
  29. first_post.update_search_vector()
  30. first_post.save(update_fields=["search_vector"])
  31. first_post.postread_set.all().delete()
  32. thread.synchronize()
  33. thread.save()
  34. thread.category.synchronize()
  35. thread.category.save()
  36. first_post.thread = thread
  37. first_post.category = thread.category
  38. add_acl_to_obj(request.user_acl, first_post)
  39. return Response(PostSerializer(first_post, context={"user": request.user}).data)