parent
c810eb3c73
commit
73f230aa06
1 changed files with 110 additions and 1 deletions
@ -1,3 +1,112 @@ |
||||
from django.contrib import admin |
||||
|
||||
# Register your models here. |
||||
from django.contrib import admin |
||||
from django.contrib.admin import helpers |
||||
from django.contrib.admin.utils import get_deleted_objects, model_ngettext |
||||
from django.core.checks import messages |
||||
from django.core.exceptions import PermissionDenied |
||||
from django.db import router |
||||
from django.template.response import TemplateResponse |
||||
from django.utils.encoding import force_text |
||||
from django.utils.translation import ugettext as _, ugettext_lazy |
||||
|
||||
from core.models import AbstractStatusModel |
||||
|
||||
admin.site.site_header = 'Русские программы' |
||||
#admin.site.index_title = 'Features area' |
||||
admin.site.site_title = 'Русские программы' |
||||
admin.site.disable_action('delete_selected') |
||||
|
||||
|
||||
def delete_selected_safe(modeladmin, request, queryset): |
||||
""" |
||||
Default action which deletes the selected objects. |
||||
|
||||
This action first displays a confirmation page which shows all the |
||||
deletable objects, or, if the user has no permission one of the related |
||||
childs (foreignkeys), a "permission denied" message. |
||||
|
||||
Next, it deletes all selected objects and redirects back to the change list. |
||||
""" |
||||
opts = modeladmin.model._meta |
||||
app_label = opts.app_label |
||||
|
||||
# Check that the user has delete permission for the actual model |
||||
if not modeladmin.has_delete_permission(request): |
||||
raise PermissionDenied |
||||
|
||||
using = router.db_for_write(modeladmin.model) |
||||
|
||||
# Populate deletable_objects, a data structure of all related objects that |
||||
# will also be deleted. |
||||
deletable_objects, model_count, perms_needed, protected = get_deleted_objects( |
||||
queryset, opts, request.user, modeladmin.admin_site, using) |
||||
|
||||
# The user has already confirmed the deletion. |
||||
# Do the deletion and return a None to display the change list view again. |
||||
if request.POST.get('post') and not protected: |
||||
if perms_needed: |
||||
raise PermissionDenied |
||||
n = queryset.count() |
||||
if n: |
||||
for obj in queryset: |
||||
obj_display = force_text(obj) |
||||
modeladmin.log_deletion(request, obj, obj_display) |
||||
for obj in queryset: |
||||
obj.delete() |
||||
modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { |
||||
"count": n, "items": model_ngettext(modeladmin.opts, n) |
||||
}, messages.SUCCESS) |
||||
# Return None to display the change list page again. |
||||
return None |
||||
|
||||
if len(queryset) == 1: |
||||
objects_name = force_text(opts.verbose_name) |
||||
else: |
||||
objects_name = force_text(opts.verbose_name_plural) |
||||
|
||||
if perms_needed or protected: |
||||
title = _("Cannot delete %(name)s") % {"name": objects_name} |
||||
else: |
||||
title = _("Are you sure?") |
||||
|
||||
context = dict( |
||||
modeladmin.admin_site.each_context(request), |
||||
title=title, |
||||
objects_name=objects_name, |
||||
deletable_objects=[deletable_objects], |
||||
model_count=dict(model_count).items(), |
||||
queryset=queryset, |
||||
perms_lacking=perms_needed, |
||||
protected=protected, |
||||
opts=opts, |
||||
action_checkbox_name=helpers.ACTION_CHECKBOX_NAME, |
||||
media=modeladmin.media, |
||||
) |
||||
|
||||
request.current_app = modeladmin.admin_site.name |
||||
|
||||
# Display the confirmation page |
||||
return TemplateResponse(request, modeladmin.delete_selected_confirmation_template or [ |
||||
"admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.model_name), |
||||
"admin/%s/delete_selected_confirmation.html" % app_label, |
||||
"admin/delete_selected_confirmation.html" |
||||
], context) |
||||
|
||||
delete_selected_safe.short_description = ugettext_lazy("Delete selected %(verbose_name_plural)s safe") |
||||
|
||||
|
||||
class SafeModelAdmin(admin.ModelAdmin): |
||||
actions = [ |
||||
delete_selected_safe, |
||||
] |
||||
exclude = ('create_at', 'updated_at') |
||||
|
||||
def has_delete_permission(self, request, obj=None): |
||||
return issubclass(self.model, AbstractStatusModel) |
||||
|
||||
def get_actions(self, request): |
||||
actions = super().get_actions(request) |
||||
if 'delete_selected_safe' in actions and not issubclass(self.model, AbstractStatusModel): |
||||
del actions['delete_selected_safe'] |
||||
return actions |
||||
|
||||
Loading…
Reference in new issue