editor.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from django.core.exceptions import PermissionDenied
  2. from django.utils.translation import gettext as _
  3. from rest_framework.response import Response
  4. from misago.acl import add_acl
  5. from misago.categories.models import Category
  6. from ...permissions.threads import can_start_thread
  7. def thread_start_editor(request):
  8. if request.user.is_anonymous():
  9. raise PermissionDenied(_("You need to be signed in to start threads."))
  10. # list of categories that allow or contain subcategories that allow new threads
  11. available = []
  12. categories = []
  13. for category in Category.objects.filter(pk__in=request.user.acl['browseable_categories']).order_by('-lft'):
  14. add_acl(request.user, category)
  15. post = False
  16. if can_start_thread(request.user, category):
  17. post = {
  18. 'close': bool(category.acl['can_close_threads']),
  19. 'hide': bool(category.acl['can_hide_threads']),
  20. 'pin': category.acl['can_pin_threads']
  21. }
  22. available.append(category.pk)
  23. available.append(category.parent_id)
  24. elif category.pk in available:
  25. available.append(category.parent_id)
  26. categories.append({
  27. 'id': category.pk,
  28. 'name': category.name,
  29. 'level': category.level - 1,
  30. 'post': post
  31. })
  32. # list only categories that allow new threads, or contains subcategory that allows one
  33. cleaned_categories = []
  34. for category in reversed(categories):
  35. if category['id'] in available:
  36. cleaned_categories.append(category)
  37. if not cleaned_categories:
  38. raise PermissionDenied(_("No categories that allow new threads are available to you at the moment."))
  39. return Response(cleaned_categories)