utils.py 5.2 KB

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