merge.py 1.5 KB

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