diff --git a/core/admin.py b/core/admin.py index 8c38f3f..75e7b02 100644 --- a/core/admin.py +++ b/core/admin.py @@ -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