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. |
# 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