__init__.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from django.urls import reverse, NoReverseMatch
  2. from django.utils.translation import get_language
  3. from django.shortcuts import render as dj_render
  4. from ...conf import settings
  5. from ...core.momentjs import get_locale_url
  6. from .. import site
  7. from ..auth import is_admin_authorized, update_admin_authorization
  8. from ..momentjs import MISAGO_ADMIN_MOMENT_LOCALES
  9. from .auth import login
  10. def get_protected_namespace(request):
  11. for namespace in settings.MISAGO_ADMIN_NAMESPACES:
  12. try:
  13. admin_path = reverse("%s:index" % namespace)
  14. if request.path.startswith(admin_path):
  15. return namespace
  16. except NoReverseMatch:
  17. pass
  18. def render(request, template, context=None, error_page=False):
  19. context = context or {}
  20. navigation = site.visible_branches(request)
  21. sections = navigation[0]
  22. try:
  23. actions = navigation[1]
  24. except IndexError:
  25. actions = []
  26. context.update({"sections": sections, "actions": actions})
  27. if error_page:
  28. # admittedly haxy solution for displaying navs on error pages
  29. context["actions"] = []
  30. context["pages"] = []
  31. for item in sections:
  32. item["is_active"] = False
  33. else:
  34. context["active_section"] = None
  35. for item in sections:
  36. if item["is_active"]:
  37. context["active_section"] = item
  38. break
  39. context["active_link"] = None
  40. for nav in navigation:
  41. for item in nav:
  42. if item["is_active"]:
  43. context["active_link"] = item
  44. break
  45. context["ADMIN_MOMENTJS_LOCALE_URL"] = get_admin_moment_locale_url()
  46. return dj_render(request, template, context)
  47. def get_admin_moment_locale_url():
  48. return get_locale_url(
  49. get_language(),
  50. static_path_template="misago/admin/momentjs/%s.js",
  51. locales=MISAGO_ADMIN_MOMENT_LOCALES,
  52. )
  53. # Decorator for views
  54. def protected_admin_view(f):
  55. def decorator(request, *args, **kwargs):
  56. protected_view = get_protected_namespace(request)
  57. if protected_view:
  58. if is_admin_authorized(request):
  59. update_admin_authorization(request)
  60. return f(request, *args, **kwargs)
  61. request.admin_namespace = protected_view
  62. return login(request)
  63. return f(request, *args, **kwargs)
  64. return decorator