From b8cfdb591b23100b157ef863ed9a2cfa68d52a7b Mon Sep 17 00:00:00 2001 From: Thu Trang Pham Date: Sun, 1 Nov 2020 01:45:39 -0700 Subject: [PATCH] confirmation_fields and confirm_change works as expected --- admin_confirm/admin.py | 7 +++++-- admin_confirm/templates/admin/submit_line.html | 4 +++- tests/market/admin.py | 11 +++++------ tests/market/models.py | 1 + 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/admin_confirm/admin.py b/admin_confirm/admin.py index a6e8652..9b4a0f5 100644 --- a/admin_confirm/admin.py +++ b/admin_confirm/admin.py @@ -10,7 +10,10 @@ from django.utils.translation import gettext as _ class AdminConfirmMixin(object): """Generic AdminConfirm Mixin""" + # Should we ask for confirmation for changes? confirm_change = None + + # if confirm_change, which fields should we confirm for? confirmation_fields = None # Custom templates (designed to be over-ridden in subclasses) @@ -20,7 +23,7 @@ class AdminConfirmMixin(object): """ Hook for specifying confirmation fields """ - if self.confirmation_fields: + if self.confirmation_fields is not None: return self.confirmation_fields return flatten_fieldsets(self.get_fieldsets(request, obj)) @@ -99,7 +102,7 @@ class AdminConfirmMixin(object): for name, field in form.fields.items(): initial_value = obj.__getattribute__(name) new_value = new_object.__getattribute__(name) - if field.has_changed(initial_value, new_value): + if field.has_changed(initial_value, new_value) and initial_value != new_value: changed_data[name] = [initial_value, new_value] if not bool(set(self.get_confirmation_fields(request, obj)) & set(changed_data.keys())): diff --git a/admin_confirm/templates/admin/submit_line.html b/admin_confirm/templates/admin/submit_line.html index 07ae08a..76114de 100644 --- a/admin_confirm/templates/admin/submit_line.html +++ b/admin_confirm/templates/admin/submit_line.html @@ -2,6 +2,8 @@ {% load i18n admin_urls %} {% block submit-row %} - + {% if confirm_change %} + + {% endif %} {{ block.super }} {% endblock %} diff --git a/tests/market/admin.py b/tests/market/admin.py index 6ade0e3..061147c 100644 --- a/tests/market/admin.py +++ b/tests/market/admin.py @@ -7,18 +7,17 @@ from .models import Item, Inventory, Shop class ItemAdmin(AdminConfirmMixin, admin.ModelAdmin): list_display = ('name', 'price', 'currency') - require_change_confirmation = True + confirm_change = True class InventoryAdmin(AdminConfirmMixin, admin.ModelAdmin): list_display = ('shop', 'item', 'quantity') - requires_change_confirmation = { - 'fields': ['shop'] - } + confirm_change = True + confirmation_fields = ['shop'] -class ShopAdmin(admin.ModelAdmin): - pass +class ShopAdmin(AdminConfirmMixin, admin.ModelAdmin): + confirmation_fields = ['name'] admin.site.register(Item, ItemAdmin) diff --git a/tests/market/models.py b/tests/market/models.py index 5010888..c279178 100644 --- a/tests/market/models.py +++ b/tests/market/models.py @@ -25,6 +25,7 @@ class Inventory(models.Model): class Meta: unique_together = ['shop', 'item'] ordering = ['shop', 'item__name'] + verbose_name_plural = 'Inventory' shop = models.ForeignKey(to=Shop, on_delete=models.CASCADE, related_name='inventory') item = models.ForeignKey(to=Item, on_delete=models.CASCADE)