merge.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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,
  11. context={
  12. "settings": request.settings,
  13. "thread": thread,
  14. "user_acl": request.user_acl,
  15. },
  16. )
  17. if not serializer.is_valid():
  18. # Fix for KeyError - errors[0]
  19. errors = list(serializer.errors.values())[0]
  20. try:
  21. return Response({"detail": errors[0]}, status=400)
  22. except KeyError:
  23. return Response({"detail": list(errors.values())[0][0]}, status=400)
  24. posts = serializer.validated_data["posts"]
  25. first_post, merged_posts = posts[0], posts[1:]
  26. for post in merged_posts:
  27. post.merge(first_post)
  28. post.delete()
  29. if first_post.pk == thread.first_post_id:
  30. first_post.set_search_document(thread.title)
  31. else:
  32. first_post.set_search_document()
  33. first_post.save()
  34. first_post.update_search_vector()
  35. first_post.save(update_fields=["search_vector"])
  36. first_post.postread_set.all().delete()
  37. thread.synchronize()
  38. thread.save()
  39. thread.category.synchronize()
  40. thread.category.save()
  41. first_post.thread = thread
  42. first_post.category = thread.category
  43. add_acl_to_obj(request.user_acl, first_post)
  44. return Response(PostSerializer(first_post, context={"user": request.user}).data)