delete.py 1.6 KB

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