editor.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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.objectacl import add_acl_to_obj
  5. from misago.categories import THREADS_ROOT_NAME
  6. from misago.categories.models import Category
  7. from misago.threads.permissions import can_start_thread
  8. from misago.threads.threadtypes import trees_map
  9. def thread_start_editor(request):
  10. if request.user.is_anonymous:
  11. raise PermissionDenied(_("You need to be signed in to start threads."))
  12. # list of categories that allow or contain subcategories that allow new threads
  13. available = []
  14. categories = []
  15. queryset = Category.objects.filter(
  16. pk__in=request.user_acl["browseable_categories"],
  17. tree_id=trees_map.get_tree_id_for_root(THREADS_ROOT_NAME),
  18. ).order_by("-lft")
  19. for category in queryset:
  20. add_acl_to_obj(request.user_acl, category)
  21. post = False
  22. if can_start_thread(request.user_acl, category):
  23. post = {
  24. "close": bool(category.acl["can_close_threads"]),
  25. "hide": bool(category.acl["can_hide_threads"]),
  26. "pin": category.acl["can_pin_threads"],
  27. }
  28. available.append(category.pk)
  29. available.append(category.parent_id)
  30. elif category.pk in available:
  31. available.append(category.parent_id)
  32. categories.append(
  33. {
  34. "id": category.pk,
  35. "name": category.name,
  36. "level": category.level - 1,
  37. "post": post,
  38. }
  39. )
  40. # list only categories that allow new threads, or contains subcategory that allows one
  41. cleaned_categories = []
  42. for category in reversed(categories):
  43. if category["id"] in available:
  44. cleaned_categories.append(category)
  45. if not cleaned_categories:
  46. raise PermissionDenied(
  47. _(
  48. "No categories that allow new threads are available to you at the moment."
  49. )
  50. )
  51. return Response(cleaned_categories)