delete.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from rest_framework.response import Response
  2. from django.core.exceptions import PermissionDenied
  3. from django.db import transaction
  4. from django.http import Http404
  5. from django.utils.six import text_type
  6. from django.utils.translation import ugettext as _
  7. from django.utils.translation import ungettext
  8. from misago.conf import settings
  9. from misago.core.utils import clean_ids_list
  10. from misago.threads.permissions import allow_delete_thread
  11. from misago.threads.moderation import threads as moderation
  12. DELETE_LIMIT = settings.MISAGO_THREADS_PER_PAGE + settings.MISAGO_THREADS_TAIL
  13. @transaction.atomic
  14. def delete_thread(request, thread):
  15. allow_delete_thread(request.user, thread)
  16. moderation.delete_thread(request.user, thread)
  17. return Response({})
  18. def delete_bulk(request, viewmodel):
  19. threads_ids = clean_threads_ids(request)
  20. errors = []
  21. for thread_id in threads_ids:
  22. try:
  23. thread = viewmodel(request, thread_id).unwrap()
  24. delete_thread(request, thread)
  25. except PermissionDenied as e:
  26. errors.append({
  27. 'thread': {
  28. 'id': thread.id,
  29. 'title': thread.title
  30. },
  31. 'error': text_type(e)
  32. })
  33. except Http404:
  34. pass # skip invisible threads
  35. if errors:
  36. return Response(errors, status=400)
  37. return Response([])
  38. def clean_threads_ids(request):
  39. threads_ids = clean_ids_list(
  40. request.data or [],
  41. _("One or more thread ids received were invalid."),
  42. )
  43. if not threads_ids:
  44. raise PermissionDenied(_("You have to specify at least one thread to delete."))
  45. elif len(threads_ids) > DELETE_LIMIT:
  46. message = ungettext(
  47. "No more than %(limit)s thread can be deleted at single time.",
  48. "No more than %(limit)s threads can be deleted at single time.",
  49. DELETE_LIMIT,
  50. )
  51. raise PermissionDenied(message % {'limit': DELETE_LIMIT})
  52. return sorted(set(threads_ids), reverse=True)