123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- from django.core.exceptions import PermissionDenied
- from django.utils.translation import gettext as _
- from rest_framework.response import Response
- from misago.acl.objectacl import add_acl_to_obj
- from misago.categories import THREADS_ROOT_NAME
- from misago.categories.models import Category
- from misago.threads.permissions import can_start_thread
- from misago.threads.threadtypes import trees_map
- def thread_start_editor(request):
- if request.user.is_anonymous:
- raise PermissionDenied(_("You need to be signed in to start threads."))
- # list of categories that allow or contain subcategories that allow new threads
- available = []
- categories = []
- queryset = Category.objects.filter(
- pk__in=request.user_acl["browseable_categories"],
- tree_id=trees_map.get_tree_id_for_root(THREADS_ROOT_NAME),
- ).order_by("-lft")
- for category in queryset:
- add_acl_to_obj(request.user_acl, category)
- post = False
- if can_start_thread(request.user_acl, category):
- post = {
- "close": bool(category.acl["can_close_threads"]),
- "hide": bool(category.acl["can_hide_threads"]),
- "pin": category.acl["can_pin_threads"],
- }
- available.append(category.pk)
- available.append(category.parent_id)
- elif category.pk in available:
- available.append(category.parent_id)
- categories.append(
- {
- "id": category.pk,
- "name": category.name,
- "level": category.level - 1,
- "post": post,
- }
- )
- # list only categories that allow new threads, or contains subcategory that allows one
- cleaned_categories = []
- for category in reversed(categories):
- if category["id"] in available:
- cleaned_categories.append(category)
- if not cleaned_categories:
- raise PermissionDenied(
- _(
- "No categories that allow new threads are available to you at the moment."
- )
- )
- return Response(cleaned_categories)
|