delete.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from django.core.exceptions import PermissionDenied
  2. from django.db import transaction, router
  3. from django.http import Http404, HttpResponseRedirect
  4. from django.template.response import TemplateResponse
  5. from django import VERSION as django_version
  6. from django.utils import six
  7. from django.utils.encoding import force_text
  8. from django.utils.html import escape
  9. from django.utils.translation import ugettext as _
  10. from django.contrib.admin.utils import get_deleted_objects
  11. from xadmin.util import unquote
  12. from xadmin.views.edit import UpdateAdminView
  13. from xadmin.views.detail import DetailAdminView
  14. from xadmin.views.base import ModelAdminView, filter_hook, csrf_protect_m
  15. class DeleteAdminView(ModelAdminView):
  16. delete_confirmation_template = None
  17. def __init__(self, request, *args, **kwargs):
  18. if django_version > (2, 0):
  19. for model in self.admin_site._registry:
  20. if not hasattr(self.admin_site._registry[model], 'has_delete_permission'):
  21. setattr(self.admin_site._registry[model], 'has_delete_permission', self.has_delete_permission)
  22. super(DeleteAdminView, self).__init__(request, *args, **kwargs)
  23. def init_request(self, object_id, *args, **kwargs):
  24. "The 'delete' admin view for this model."
  25. self.obj = self.get_object(unquote(object_id))
  26. if not self.has_delete_permission(self.obj):
  27. raise PermissionDenied
  28. if self.obj is None:
  29. raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(self.opts.verbose_name), 'key': escape(object_id)})
  30. using = router.db_for_write(self.model)
  31. # Populate deleted_objects, a data structure of all related objects that
  32. # will also be deleted.
  33. if django_version > (2, 1):
  34. (self.deleted_objects, model_count, self.perms_needed, self.protected) = get_deleted_objects(
  35. [self.obj], self.opts, self.admin_site)
  36. else:
  37. (self.deleted_objects, model_count, self.perms_needed, self.protected) = get_deleted_objects(
  38. [self.obj], self.opts, self.request.user, self.admin_site, using)
  39. @csrf_protect_m
  40. @filter_hook
  41. def get(self, request, object_id):
  42. context = self.get_context()
  43. return TemplateResponse(request, self.delete_confirmation_template or
  44. self.get_template_list("views/model_delete_confirm.html"), context)
  45. @csrf_protect_m
  46. @transaction.atomic
  47. @filter_hook
  48. def post(self, request, object_id):
  49. if self.perms_needed:
  50. raise PermissionDenied
  51. self.delete_model()
  52. response = self.post_response()
  53. cls_str = str if six.PY3 else basestring
  54. if isinstance(response, cls_str):
  55. response = HttpResponseRedirect(response)
  56. return response
  57. @filter_hook
  58. def delete_model(self):
  59. """
  60. Given a model instance delete it from the database.
  61. """
  62. self.log('delete', '', self.obj)
  63. self.obj.delete()
  64. @filter_hook
  65. def get_context(self):
  66. if self.perms_needed or self.protected:
  67. title = _("Cannot delete %(name)s") % {"name":
  68. force_text(self.opts.verbose_name)}
  69. else:
  70. title = _("Are you sure?")
  71. new_context = {
  72. "title": title,
  73. "object": self.obj,
  74. "deleted_objects": self.deleted_objects,
  75. "perms_lacking": self.perms_needed,
  76. "protected": self.protected,
  77. }
  78. context = super(DeleteAdminView, self).get_context()
  79. context.update(new_context)
  80. return context
  81. @filter_hook
  82. def get_breadcrumb(self):
  83. bcs = super(DeleteAdminView, self).get_breadcrumb()
  84. bcs.append({
  85. 'title': force_text(self.obj),
  86. 'url': self.get_object_url(self.obj)
  87. })
  88. item = {'title': _('Delete')}
  89. if self.has_delete_permission():
  90. item['url'] = self.model_admin_url('delete', self.obj.pk)
  91. bcs.append(item)
  92. return bcs
  93. @filter_hook
  94. def post_response(self):
  95. self.message_user(_('The %(name)s "%(obj)s" was deleted successfully.') %
  96. {'name': force_text(self.opts.verbose_name), 'obj': force_text(self.obj)}, 'success')
  97. if not self.has_view_permission():
  98. return self.get_admin_url('index')
  99. return self.model_admin_url('changelist')