__init__.py 1.9 KB

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