utils.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from importlib import import_module
  2. import json
  3. from django.core.serializers.json import DjangoJSONEncoder
  4. from django.http import HttpResponse
  5. from django.core.urlresolvers import reverse, resolve
  6. from django.contrib import admin
  7. from django.contrib.admin import AdminSite
  8. from django.utils.encoding import force_unicode, smart_text
  9. from django.utils.functional import Promise
  10. from jet import settings
  11. class JsonResponse(HttpResponse):
  12. """
  13. An HTTP response class that consumes data to be serialized to JSON.
  14. :param data: Data to be dumped into json. By default only ``dict`` objects
  15. are allowed to be passed due to a security flaw before EcmaScript 5. See
  16. the ``safe`` parameter for more information.
  17. :param encoder: Should be an json encoder class. Defaults to
  18. ``django.core.serializers.json.DjangoJSONEncoder``.
  19. :param safe: Controls if only ``dict`` objects may be serialized. Defaults
  20. to ``True``.
  21. """
  22. def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs):
  23. if safe and not isinstance(data, dict):
  24. raise TypeError('In order to allow non-dict objects to be '
  25. 'serialized set the safe parameter to False')
  26. kwargs.setdefault('content_type', 'application/json')
  27. data = json.dumps(data, cls=encoder)
  28. super(JsonResponse, self).__init__(content=data, **kwargs)
  29. def get_app_list(context):
  30. template_response = get_admin_site(context.get('current_app', '')).index(context['request'])
  31. try:
  32. return template_response.context_data['app_list']
  33. except Exception:
  34. return None
  35. def get_admin_site(current_app):
  36. try:
  37. resolver_match = resolve(reverse('%s:index' % current_app))
  38. for func_closure in resolver_match.func.func_closure:
  39. if isinstance(func_closure.cell_contents, AdminSite):
  40. return func_closure.cell_contents
  41. except:
  42. pass
  43. return admin.site
  44. def get_admin_site_name(context):
  45. return get_admin_site(context).name
  46. def get_current_dashboard(location):
  47. if location == 'index':
  48. path = settings.JET_INDEX_DASHBOARD
  49. elif location == 'app_index':
  50. path = settings.JET_APP_INDEX_DASHBOARD
  51. else:
  52. raise ValueError('Unknown dashboard location: %s' % location)
  53. module, cls = path.rsplit('.', 1)
  54. module = import_module(module)
  55. index_dashboard_cls = getattr(module, cls)
  56. return index_dashboard_cls
  57. class LazyEncoder(json.JSONEncoder):
  58. def default(self, obj):
  59. if isinstance(obj, Promise):
  60. return force_unicode(obj)
  61. return obj
  62. def get_model_instance_label(instance):
  63. if getattr(instance, "related_label", None):
  64. return instance.related_label()
  65. return smart_text(instance)