uiviews.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. """
  2. Misago UI views controller
  3. UI views are small views that are called asynchronically to give UI knowledge
  4. of changes in APP state and thus opportunity to update themselves in real time
  5. """
  6. from django.core.exceptions import PermissionDenied
  7. from django.core.urlresolvers import resolve
  8. from django.http import Http404, JsonResponse
  9. from misago.users.online.tracker import mute_tracker
  10. from misago.core.decorators import ajax_only
  11. from misago.core.utils import is_referer_local
  12. __all__ = ['uiview', 'uiserver']
  13. UI_VIEWS = []
  14. def uiview(name):
  15. """
  16. Decorator for registering UI views
  17. """
  18. def namespace_decorator(f):
  19. UI_VIEWS.append((name, f))
  20. return f
  21. return namespace_decorator
  22. def get_resolver_match(request):
  23. requesting_path = request.META['HTTP_REFERER']
  24. requesting_path = requesting_path[len(request.scheme) + 3:]
  25. requesting_path = requesting_path[len(request.META['HTTP_HOST']):]
  26. try:
  27. return resolve(requesting_path)
  28. except Http404:
  29. return None
  30. @ajax_only
  31. def uiserver(request):
  32. mute_tracker(request)
  33. if not is_referer_local(request):
  34. raise PermissionDenied()
  35. resolver_match = get_resolver_match(request)
  36. response_dict = {}
  37. for name, view in UI_VIEWS:
  38. try:
  39. view_response = view(request, resolver_match)
  40. if view_response:
  41. response_dict[name] = view_response
  42. except PermissionDenied:
  43. pass
  44. return JsonResponse(response_dict)