delete.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from django.db import transaction
  2. from rest_framework.response import Response
  3. from ...moderation import threads as moderation
  4. from ...permissions import allow_delete_thread
  5. from ...serializers import DeleteThreadsSerializer
  6. @transaction.atomic
  7. def delete_thread(request, thread):
  8. allow_delete_thread(request.user_acl, thread)
  9. moderation.delete_thread(request, thread)
  10. return Response({})
  11. def delete_bulk(request, viewmodel):
  12. serializer = DeleteThreadsSerializer(
  13. data={"threads": request.data},
  14. context={
  15. "request": request,
  16. "settings": request.settings,
  17. "viewmodel": viewmodel,
  18. },
  19. )
  20. if not serializer.is_valid():
  21. if "threads" in serializer.errors:
  22. errors = serializer.errors["threads"]
  23. if "details" in errors:
  24. return Response(hydrate_error_details(errors["details"]), status=400)
  25. # Fix for KeyError - errors[0]
  26. try:
  27. return Response({"detail": errors[0]}, status=403)
  28. except KeyError:
  29. return Response({"detail": list(errors.values())[0][0]}, status=403)
  30. errors = list(serializer.errors)[0][0]
  31. return Response({"detail": errors}, status=400)
  32. for thread in serializer.validated_data["threads"]:
  33. with transaction.atomic():
  34. delete_thread(request, thread)
  35. return Response([])
  36. def hydrate_error_details(errors):
  37. for error in errors:
  38. error["thread"]["id"] = int(error["thread"]["id"])
  39. return errors