2018-07-03 18:02:38 +08:00

110 lines
3.8 KiB
Python

from django.core.exceptions import PermissionDenied
from django.db import transaction, router
from django.http import Http404, HttpResponseRedirect
from django.template.response import TemplateResponse
from django.utils import six
from django.utils.encoding import force_text
from django.utils.html import escape
from django.utils.translation import ugettext as _
from django.contrib.admin.utils import get_deleted_objects
from xadmin.util import unquote
from xadmin.views.edit import UpdateAdminView
from xadmin.views.detail import DetailAdminView
from xadmin.views.base import ModelAdminView, filter_hook, csrf_protect_m
class DeleteAdminView(ModelAdminView):
delete_confirmation_template = None
def init_request(self, object_id, *args, **kwargs):
"The 'delete' admin view for this model."
self.obj = self.get_object(unquote(object_id))
if not self.has_delete_permission(self.obj):
raise PermissionDenied
if self.obj is None:
raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(self.opts.verbose_name), 'key': escape(object_id)})
using = router.db_for_write(self.model)
# Populate deleted_objects, a data structure of all related objects that
# will also be deleted.
(self.deleted_objects, model_count, self.perms_needed, self.protected) = get_deleted_objects(
[self.obj], self.opts, self.request.user, self.admin_site, using)
@csrf_protect_m
@filter_hook
def get(self, request, object_id):
context = self.get_context()
return TemplateResponse(request, self.delete_confirmation_template or
self.get_template_list("views/model_delete_confirm.html"), context)
@csrf_protect_m
@transaction.atomic
@filter_hook
def post(self, request, object_id):
if self.perms_needed:
raise PermissionDenied
self.delete_model()
response = self.post_response()
cls_str = str if six.PY3 else basestring
if isinstance(response, cls_str):
response = HttpResponseRedirect(response)
return response
@filter_hook
def delete_model(self):
"""
Given a model instance delete it from the database.
"""
self.log('delete', '', self.obj)
self.obj.delete()
@filter_hook
def get_context(self):
if self.perms_needed or self.protected:
title = _("Cannot delete %(name)s") % {"name":
force_text(self.opts.verbose_name)}
else:
title = _("Are you sure?")
new_context = {
"title": title,
"object": self.obj,
"deleted_objects": self.deleted_objects,
"perms_lacking": self.perms_needed,
"protected": self.protected,
}
context = super(DeleteAdminView, self).get_context()
context.update(new_context)
return context
@filter_hook
def get_breadcrumb(self):
bcs = super(DeleteAdminView, self).get_breadcrumb()
bcs.append({
'title': force_text(self.obj),
'url': self.get_object_url(self.obj)
})
item = {'title': _('Delete')}
if self.has_delete_permission():
item['url'] = self.model_admin_url('delete', self.obj.pk)
bcs.append(item)
return bcs
@filter_hook
def post_response(self):
self.message_user(_('The %(name)s "%(obj)s" was deleted successfully.') %
{'name': force_text(self.opts.verbose_name), 'obj': force_text(self.obj)}, 'success')
if not self.has_view_permission():
return self.get_admin_url('index')
return self.model_admin_url('changelist')