delete.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from rest_framework.response import Response
  2. from django.core.exceptions import PermissionDenied
  3. from django.utils.translation import ugettext as _
  4. from django.utils.translation import ungettext
  5. from misago.conf import settings
  6. from misago.core.utils import clean_ids_list
  7. from misago.threads.moderation import posts as moderation
  8. from misago.threads.permissions import allow_delete_event, allow_delete_post
  9. from misago.threads.permissions import exclude_invisible_posts
  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, post)
  14. else:
  15. allow_delete_post(request.user, post)
  16. moderation.delete_post(request.user, post)
  17. sync_related(thread)
  18. return Response({})
  19. def delete_bulk(request, thread):
  20. posts = clean_posts_for_delete(request, thread)
  21. for post in posts:
  22. post.delete()
  23. sync_related(thread)
  24. return Response({})
  25. def sync_related(thread):
  26. thread.synchronize()
  27. thread.save()
  28. thread.category.synchronize()
  29. thread.category.save()
  30. def clean_posts_for_delete(request, thread):
  31. posts_ids = clean_ids_list(
  32. request.data or [],
  33. _("One or more post ids received were invalid."),
  34. )
  35. if not posts_ids:
  36. raise PermissionDenied(_("You have to specify at least one post to delete."))
  37. elif len(posts_ids) > DELETE_LIMIT:
  38. message = ungettext(
  39. "No more than %(limit)s post can be deleted at single time.",
  40. "No more than %(limit)s posts can be deleted at single time.",
  41. DELETE_LIMIT,
  42. )
  43. raise PermissionDenied(message % {'limit': DELETE_LIMIT})
  44. posts_queryset = exclude_invisible_posts(request.user, thread.category, thread.post_set)
  45. posts_queryset = posts_queryset.filter(id__in=posts_ids).order_by('id')
  46. posts = []
  47. for post in posts_queryset:
  48. post.category = thread.category
  49. post.thread = thread
  50. if post.is_event:
  51. allow_delete_event(request.user, post)
  52. else:
  53. allow_delete_post(request.user, post)
  54. posts.append(post)
  55. if len(posts) != len(posts_ids):
  56. raise PermissionDenied(_("One or more posts to delete could not be found."))
  57. return posts