delete.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from rest_framework.response import Response
  2. from ...moderation import posts as moderation
  3. from ...permissions import (
  4. allow_delete_best_answer,
  5. allow_delete_event,
  6. allow_delete_post,
  7. )
  8. from ...serializers import DeletePostsSerializer
  9. def delete_post(request, thread, post):
  10. if post.is_event:
  11. allow_delete_event(request.user_acl, post)
  12. else:
  13. allow_delete_best_answer(request.user_acl, post)
  14. allow_delete_post(request.user_acl, post)
  15. moderation.delete_post(request.user, post)
  16. sync_related(thread)
  17. return Response({})
  18. def delete_bulk(request, thread):
  19. serializer = DeletePostsSerializer(
  20. data={"posts": request.data},
  21. context={
  22. "settings": request.settings,
  23. "thread": thread,
  24. "user_acl": request.user_acl,
  25. },
  26. )
  27. if not serializer.is_valid():
  28. if "posts" in serializer.errors:
  29. errors = serializer.errors["posts"]
  30. else:
  31. errors = list(serializer.errors.values())[0]
  32. # Fix for KeyError - errors[0]
  33. try:
  34. errors = errors[0]
  35. except KeyError:
  36. if errors and isinstance(errors, dict):
  37. errors = list(errors.values())[0][0]
  38. return Response({"detail": errors}, status=400)
  39. for post in serializer.validated_data["posts"]:
  40. post.delete()
  41. sync_related(thread)
  42. return Response({})
  43. def sync_related(thread):
  44. thread.synchronize()
  45. thread.save()
  46. thread.category.synchronize()
  47. thread.category.save()