editor.py 1.9 KB

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