delete.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from rest_framework.response import Response
  2. from django.core.exceptions import PermissionDenied
  3. from django.db import transaction
  4. from django.utils.six import text_type
  5. from django.utils.translation import ugettext as _
  6. from django.utils.translation import ungettext
  7. from misago.conf import settings
  8. from misago.threads.moderation import threads as moderation
  9. DELETE_LIMIT = settings.MISAGO_THREADS_PER_PAGE + settings.MISAGO_THREADS_TAIL
  10. @transaction.atomic
  11. def delete_thread(request, thread):
  12. allow_delete_thread(request.user, thread)
  13. moderation.delete_thread(request.user, thread)
  14. return Response({})
  15. def delete_bulk(request, viewmodel):
  16. threads = clean_threads_for_delete(request, viewmodel)
  17. raise Exception(threads)
  18. errors = []
  19. for thread in threads:
  20. try:
  21. allow_delete_thread(request.user, thread)
  22. except PermissionDenied as e:
  23. errors.append({
  24. 'thread': {
  25. 'id': thread.id,
  26. 'title': thread.title
  27. },
  28. 'error': text_type(e)
  29. })
  30. if errors:
  31. return Response(errors, status_code=403)
  32. for thread in delete:
  33. with transaction.atomic():
  34. moderation.delete_thread(request.user, thread)
  35. return Response({})
  36. def clean_threads_for_delete(request, viewmodel):
  37. try:
  38. threads_ids = list(map(int, request.data or []))
  39. except (ValueError, TypeError):
  40. raise PermissionDenied(_("One or more thread ids received were invalid."))
  41. if not threads_ids:
  42. raise PermissionDenied(_("You have to specify at least one thread to delete."))
  43. elif len(threads_ids) > DELETE_LIMIT:
  44. message = ungettext(
  45. "No more than %(limit)s thread can be deleted at single time.",
  46. "No more than %(limit)s threads can be deleted at single time.",
  47. DELETE_LIMIT,
  48. )
  49. raise PermissionDenied(message % {'limit': DELETE_LIMIT})
  50. threads = [viewmodel(request, pk) for pk in threads_ids]
  51. if len(threads) != len(threads_ids):
  52. raise PermissionDenied(_("One or more threads to delete could not be found."))
  53. return threads
  54. def allow_delete_thread(user, thread):
  55. if thread.acl.get('can_delete') != 2:
  56. raise PermissionDenied(_("You don't have permission to delete this thread."))