uiviews.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 time import time
  7. from django.core.exceptions import PermissionDenied
  8. from django.core.urlresolvers import resolve
  9. from django.http import Http404, JsonResponse
  10. from misago.users.online.tracker import mute_tracker
  11. from misago.core.decorators import ajax_only
  12. from misago.core.utils import is_referer_local
  13. __all__ = ['uiview', 'uiserver']
  14. UI_VIEWS = []
  15. def uiview(name, cache_frequency=15):
  16. """
  17. Decorator for registering UI views
  18. """
  19. def namespace_decorator(f):
  20. UI_VIEWS.append((name, cache_frequency, f))
  21. return f
  22. return namespace_decorator
  23. def get_resolver_match(request):
  24. requesting_path = request.META['HTTP_REFERER']
  25. requesting_path = requesting_path[len(request.scheme) + 3:]
  26. requesting_path = requesting_path[len(request.META['HTTP_HOST']):]
  27. try:
  28. return resolve(requesting_path)
  29. except Http404:
  30. return None
  31. @ajax_only
  32. def uiserver(request):
  33. mute_tracker(request)
  34. if not is_referer_local(request):
  35. raise PermissionDenied()
  36. resolver_match = get_resolver_match(request)
  37. response_dict = {}
  38. now = int(time())
  39. for name, cache_frequency, view in UI_VIEWS:
  40. cache_key = 'uijson_%s' % name
  41. cache = request.session.get(cache_key)
  42. if not cache or cache['expires'] < now:
  43. try:
  44. view_response = view(request, resolver_match)
  45. except PermissionDenied:
  46. view_response = None
  47. request.session[cache_key] = {
  48. 'json': view_response,
  49. 'expires': now + cache_frequency
  50. }
  51. if view_response:
  52. response_dict[name] = view_response
  53. elif cache['json']:
  54. response_dict[name] = cache['json']
  55. return JsonResponse(response_dict)