utils.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import datetime
  2. import json
  3. try:
  4. from django.apps.registry import apps
  5. except ImportError:
  6. from django.apps import apps # Fix Django < 1.8 import issue
  7. from django.core.serializers.json import DjangoJSONEncoder
  8. from django.http import HttpResponse
  9. from django.core.urlresolvers import reverse, resolve, NoReverseMatch
  10. from django.contrib import admin
  11. from django.contrib.admin import AdminSite
  12. from django.utils.encoding import smart_text
  13. from django.utils.text import capfirst
  14. from django.contrib import messages
  15. from django.utils.encoding import force_text
  16. from django.utils.functional import Promise
  17. class JsonResponse(HttpResponse):
  18. """
  19. An HTTP response class that consumes data to be serialized to JSON.
  20. :param data: Data to be dumped into json. By default only ``dict`` objects
  21. are allowed to be passed due to a security flaw before EcmaScript 5. See
  22. the ``safe`` parameter for more information.
  23. :param encoder: Should be an json encoder class. Defaults to
  24. ``django.core.serializers.json.DjangoJSONEncoder``.
  25. :param safe: Controls if only ``dict`` objects may be serialized. Defaults
  26. to ``True``.
  27. """
  28. def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs):
  29. if safe and not isinstance(data, dict):
  30. raise TypeError('In order to allow non-dict objects to be '
  31. 'serialized set the safe parameter to False')
  32. kwargs.setdefault('content_type', 'application/json')
  33. data = json.dumps(data, cls=encoder)
  34. super(JsonResponse, self).__init__(content=data, **kwargs)
  35. def get_app_list(context, order=True):
  36. admin_site = get_admin_site(context.get('current_app', ''))
  37. request = context['request']
  38. app_dict = {}
  39. for model, model_admin in admin_site._registry.items():
  40. app_label = model._meta.app_label
  41. has_module_perms = model_admin.has_module_permission(request)
  42. if has_module_perms:
  43. perms = model_admin.get_model_perms(request)
  44. # Check whether user has any perm for this module.
  45. # If so, add the module to the model_list.
  46. if True in perms.values():
  47. info = (app_label, model._meta.model_name)
  48. model_dict = {
  49. 'name': capfirst(model._meta.verbose_name_plural),
  50. 'object_name': model._meta.object_name,
  51. 'perms': perms,
  52. }
  53. if perms.get('change', False):
  54. try:
  55. model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=admin_site.name)
  56. except NoReverseMatch:
  57. pass
  58. if perms.get('add', False):
  59. try:
  60. model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=admin_site.name)
  61. except NoReverseMatch:
  62. pass
  63. if app_label in app_dict:
  64. app_dict[app_label]['models'].append(model_dict)
  65. else:
  66. app_dict[app_label] = {
  67. 'name': apps.get_app_config(app_label).verbose_name,
  68. 'app_label': app_label,
  69. 'app_url': reverse(
  70. 'admin:app_list',
  71. kwargs={'app_label': app_label},
  72. current_app=admin_site.name,
  73. ),
  74. 'has_module_perms': has_module_perms,
  75. 'models': [model_dict],
  76. }
  77. # Sort the apps alphabetically.
  78. app_list = list(app_dict.values())
  79. if order:
  80. app_list.sort(key=lambda x: x['name'].lower())
  81. # Sort the models alphabetically within each app.
  82. for app in app_list:
  83. app['models'].sort(key=lambda x: x['name'])
  84. return app_list
  85. def get_admin_site(current_app):
  86. try:
  87. resolver_match = resolve(reverse('%s:index' % current_app))
  88. for func_closure in resolver_match.func.func_closure:
  89. if isinstance(func_closure.cell_contents, AdminSite):
  90. return func_closure.cell_contents
  91. except:
  92. pass
  93. return admin.site
  94. def get_admin_site_name(context):
  95. return get_admin_site(context).name
  96. class LazyDateTimeEncoder(json.JSONEncoder):
  97. def default(self, obj):
  98. if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date):
  99. return obj.isoformat()
  100. elif isinstance(obj, Promise):
  101. return force_text(obj)
  102. return json.JSONEncoder.default(self, obj)
  103. def get_model_instance_label(instance):
  104. if getattr(instance, "related_label", None):
  105. return instance.related_label()
  106. return smart_text(instance)
  107. class SuccessMessageMixin(object):
  108. """
  109. Adds a success message on successful form submission.
  110. """
  111. success_message = ''
  112. def form_valid(self, form):
  113. response = super(SuccessMessageMixin, self).form_valid(form)
  114. success_message = self.get_success_message(form.cleaned_data)
  115. if success_message:
  116. messages.success(self.request, success_message)
  117. return response
  118. def get_success_message(self, cleaned_data):
  119. return self.success_message % cleaned_data