__init__.py 2.0 KB

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