__init__.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from django.urls import reverse, NoReverseMatch
  2. from django.shortcuts import render as dj_render
  3. from ...conf import settings
  4. from .. import site
  5. from ..auth import is_admin_session, update_admin_session
  6. from .auth import login
  7. def get_protected_namespace(request):
  8. for namespace in settings.MISAGO_ADMIN_NAMESPACES:
  9. try:
  10. admin_path = reverse("%s:index" % namespace)
  11. if request.path.startswith(admin_path):
  12. return namespace
  13. except NoReverseMatch:
  14. pass
  15. return None
  16. def render(request, template, context=None, error_page=False):
  17. context = context or {}
  18. navigation = site.visible_branches(request)
  19. sections = navigation[0]
  20. try:
  21. actions = navigation[1]
  22. except IndexError:
  23. actions = []
  24. try:
  25. pages = navigation[2]
  26. except IndexError:
  27. pages = []
  28. context.update({"sections": sections, "actions": actions, "pages": pages})
  29. if error_page:
  30. # admittedly haxy solution for displaying navs on error pages
  31. context["actions"] = []
  32. context["pages"] = []
  33. for item in navigation[0]:
  34. item["is_active"] = False
  35. else:
  36. context["active_link"] = None
  37. for item in navigation[-1]:
  38. if item["is_active"]:
  39. context["active_link"] = item
  40. break
  41. return dj_render(request, template, context)
  42. # Decorator for views
  43. def protected_admin_view(f):
  44. def decorator(request, *args, **kwargs):
  45. protected_view = get_protected_namespace(request)
  46. if protected_view:
  47. if is_admin_session(request):
  48. update_admin_session(request)
  49. return f(request, *args, **kwargs)
  50. request.admin_namespace = protected_view
  51. return login(request)
  52. return f(request, *args, **kwargs)
  53. return decorator