From 7b78c266efb47fe265643e160d731d86c84348fa Mon Sep 17 00:00:00 2001 From: Mathieu Hentges Date: Mon, 25 Sep 2017 14:03:49 -0400 Subject: [PATCH 1/7] add inlines to the admin --- simple_history/admin.py | 5 +++++ simple_history/tests/tests/test_admin.py | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/simple_history/admin.py b/simple_history/admin.py index 70c6ac873..60dcaba80 100644 --- a/simple_history/admin.py +++ b/simple_history/admin.py @@ -154,6 +154,10 @@ def history_form_view(self, request, object_id, version_id): model_name = original_opts.model_name url_triplet = self.admin_site.name, original_opts.app_label, model_name + formset, inline_instances = self._create_formsets(request, obj, + change=False) + inline_formsets = self.get_inline_formsets( + request, formset, inline_instances, obj) context = { 'title': _('Revert %s') % force_text(obj), 'adminform': admin_form, @@ -170,6 +174,7 @@ def history_form_view(self, request, object_id, version_id): 'history_url': reverse('%s:%s_%s_history' % url_triplet, args=(obj.pk,)), 'change_history': change_history, + 'inline_admin_formsets': inline_formsets, # Context variables copied from render_change_form 'add': False, diff --git a/simple_history/tests/tests/test_admin.py b/simple_history/tests/tests/test_admin.py index 04b18e5a4..4b40046d7 100644 --- a/simple_history/tests/tests/test_admin.py +++ b/simple_history/tests/tests/test_admin.py @@ -412,7 +412,7 @@ def test_history_form_view_without_getting_history(self): # Verify this is set for original object 'original': poll, 'change_history': False, - + 'inline_admin_formsets': [], 'title': 'Revert %s' % force_text(poll), 'adminform': ANY, 'object_id': poll.id, @@ -466,7 +466,7 @@ def test_history_form_view_getting_history(self): # Verify this is set for history object not poll object 'original': history.instance, 'change_history': True, - + 'inline_admin_formsets': [], 'title': 'Revert %s' % force_text(history.instance), 'adminform': ANY, 'object_id': poll.id, @@ -521,6 +521,7 @@ def test_history_form_view_getting_history_with_setting_off(self): # Verify this is set for history object not poll object 'original': poll, 'change_history': False, + 'inline_admin_formsets': [], 'title': 'Revert %s' % force_text(poll), 'adminform': ANY, From 7633d9d339a348367bb78a2b04373ff97b4430a4 Mon Sep 17 00:00:00 2001 From: Mathieu Hentges Date: Wed, 27 Sep 2017 13:26:44 -0400 Subject: [PATCH 2/7] Support django < 1.7 --- simple_history/admin.py | 56 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/simple_history/admin.py b/simple_history/admin.py index 60dcaba80..bb7410a35 100644 --- a/simple_history/admin.py +++ b/simple_history/admin.py @@ -154,9 +154,31 @@ def history_form_view(self, request, object_id, version_id): model_name = original_opts.model_name url_triplet = self.admin_site.name, original_opts.app_label, model_name - formset, inline_instances = self._create_formsets(request, obj, - change=False) - inline_formsets = self.get_inline_formsets( + + inline_instances = self.get_inline_instances(request, obj) + prefixes = {} + formset = [] + + for FormSet, inline in self.get_admin_formsets_with_inline( + *[request]): + prefix = FormSet.get_default_prefix() + prefixes[prefix] = prefixes.get(prefix, 0) + 1 + if prefixes[prefix] != 1 or not prefix: + prefix = "%s-%s" % (prefix, prefixes[prefix]) + formset_params = { + 'instance': obj, + 'prefix': prefix, + 'queryset': inline.get_queryset(request), + } + if request.method == 'POST': + formset_params.update({ + 'data': request.POST.copy(), + 'files': request.FILES, + 'save_as_new': '_saveasnew' in request.POST + }) + formset.append(FormSet(**formset_params)) + + inline_formsets = self.get_admin_inline_formsets( request, formset, inline_instances, obj) context = { 'title': _('Revert %s') % force_text(obj), @@ -195,7 +217,33 @@ def history_form_view(self, request, object_id, version_id): extra_kwargs = {} if get_complete_version() < (1, 8): extra_kwargs['current_app'] = request.current_app - return render(request, self.object_history_form_template, context, **extra_kwargs) + return render(request, + self.object_history_form_template, + context, + **extra_kwargs) + + def get_admin_inline_formsets(self, + request, + formsets, + inline_instances, + obj=None): + """ Django < 1.7 """ + inline_admin_formsets = [] + for inline, formset in zip(inline_instances, formsets): + fieldsets = list(inline.get_fieldsets(request, obj)) + readonly = list(inline.get_readonly_fields(request, obj)) + prepopulated = dict(inline.get_prepopulated_fields(request, obj)) + inline_admin_formset = helpers.InlineAdminFormSet( + inline, formset, fieldsets, prepopulated, readonly, + model_admin=self, + ) + inline_admin_formsets.append(inline_admin_formset) + return inline_admin_formsets + + def get_admin_formsets_with_inline(self, request, obj=None): + """ Django < 1.7 """ + for inline in self.get_inline_instances(request, obj): + yield inline.get_formset(request, obj), inline def save_model(self, request, obj, form, change): """Set special model attribute to user for reference after save""" From 2d941ca7e4c5f8048d9f3690220711756b25c806 Mon Sep 17 00:00:00 2001 From: Mathieu Hentges Date: Wed, 27 Sep 2017 14:07:45 -0400 Subject: [PATCH 3/7] update Authors and Changes files --- AUTHORS.rst | 1 + CHANGES.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/AUTHORS.rst b/AUTHORS.rst index e2f11046c..87ecfcc41 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -40,6 +40,7 @@ Authors - Michael England - Gregory Bataille - Jesse Shapiro +- Mathieu Hentges Background ========== diff --git a/CHANGES.rst b/CHANGES.rst index de2c97fda..0f7d17be5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,7 @@ Unreleased ---------- - Use get_queryset rather than model.objects in history_view. (gh-303) - Change ugettext calls in models.py to ugettext_lazy +- Add ability of displaying inlines in the admin history form view 1.9.0 (2017-06-11) ------------------ From fd3ee0144adae053121e01bf00502be2e433d8de Mon Sep 17 00:00:00 2001 From: Mathieu Hentges Date: Wed, 27 Sep 2017 16:59:47 -0400 Subject: [PATCH 4/7] improve test coverage --- simple_history/tests/admin.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/simple_history/tests/admin.py b/simple_history/tests/admin.py index a0ac13204..243b603f6 100644 --- a/simple_history/tests/admin.py +++ b/simple_history/tests/admin.py @@ -6,6 +6,11 @@ from .models import Poll, Choice, Person, Book, Document, Paper, Employee +class ChoiceInline(admin.TabularInline): + model = Choice + extra = 1 + + class PersonAdmin(SimpleHistoryAdmin): def has_change_permission(self, request, obj=None): return False @@ -15,10 +20,14 @@ class ChoiceAdmin(SimpleHistoryAdmin): history_list_display = ['votes'] -admin.site.register(Poll, SimpleHistoryAdmin) +class PollAdmin(SimpleHistoryAdmin): + inlines = [ChoiceInline, ] + admin.site.register(Choice, ChoiceAdmin) admin.site.register(Person, PersonAdmin) admin.site.register(Book, SimpleHistoryAdmin) admin.site.register(Document, SimpleHistoryAdmin) admin.site.register(Paper, SimpleHistoryAdmin) admin.site.register(Employee, SimpleHistoryAdmin) +admin.site.register(Poll, PollAdmin) + From 076089799daeb7925a8fb17fe88c6dfecb71b272 Mon Sep 17 00:00:00 2001 From: Mathieu Hentges Date: Wed, 27 Sep 2017 17:04:27 -0400 Subject: [PATCH 5/7] syntax --- simple_history/tests/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simple_history/tests/admin.py b/simple_history/tests/admin.py index 243b603f6..8c6bc3547 100644 --- a/simple_history/tests/admin.py +++ b/simple_history/tests/admin.py @@ -23,6 +23,7 @@ class ChoiceAdmin(SimpleHistoryAdmin): class PollAdmin(SimpleHistoryAdmin): inlines = [ChoiceInline, ] + admin.site.register(Choice, ChoiceAdmin) admin.site.register(Person, PersonAdmin) admin.site.register(Book, SimpleHistoryAdmin) @@ -30,4 +31,3 @@ class PollAdmin(SimpleHistoryAdmin): admin.site.register(Paper, SimpleHistoryAdmin) admin.site.register(Employee, SimpleHistoryAdmin) admin.site.register(Poll, PollAdmin) - From c6a9a043f53ca536d2394be8b665e09c8ee3cc8e Mon Sep 17 00:00:00 2001 From: Mathieu Hentges Date: Thu, 28 Sep 2017 09:52:23 -0400 Subject: [PATCH 6/7] wording in Changes --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 0f7d17be5..fc3d71042 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,7 @@ Unreleased ---------- - Use get_queryset rather than model.objects in history_view. (gh-303) - Change ugettext calls in models.py to ugettext_lazy -- Add ability of displaying inlines in the admin history form view +- Add ability to display inlines in the admin history form view 1.9.0 (2017-06-11) ------------------ From 0da904f0f518ecfedb794185fe8b22a4c2d66c03 Mon Sep 17 00:00:00 2001 From: Mathieu Hentges Date: Thu, 28 Sep 2017 11:38:39 -0400 Subject: [PATCH 7/7] cover the case of two similar inlines in test --- simple_history/tests/admin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/simple_history/tests/admin.py b/simple_history/tests/admin.py index 8c6bc3547..f42b7a3f5 100644 --- a/simple_history/tests/admin.py +++ b/simple_history/tests/admin.py @@ -21,8 +21,7 @@ class ChoiceAdmin(SimpleHistoryAdmin): class PollAdmin(SimpleHistoryAdmin): - inlines = [ChoiceInline, ] - + inlines = [ChoiceInline, ChoiceInline] admin.site.register(Choice, ChoiceAdmin) admin.site.register(Person, PersonAdmin)