Skip to content

Commit 996d594

Browse files
author
Ross Mechanic
committed
Fixed url issue where user could not access history for concrete instance of historical abstract base class
1 parent b01b92c commit 996d594

File tree

5 files changed

+75
-4
lines changed

5 files changed

+75
-4
lines changed

simple_history/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def history_form_view(self, request, object_id, version_id):
162162
'is_popup': False,
163163
'media': mark_safe(self.media + admin_form.media),
164164
'errors': helpers.AdminErrorList(form, formsets),
165-
'app_label': model._meta.app_label,
165+
'app_label': original_opts.app_label,
166166
'original_opts': original_opts,
167167
'changelist_url': reverse('%s:%s_%s_changelist' % url_triplet),
168168
'change_url': reverse('%s:%s_%s_change' % url_triplet,

simple_history/tests/admin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.contrib import admin
44

55
from simple_history.admin import SimpleHistoryAdmin
6-
from .models import Poll, Choice, Person, Book, Document, Paper, Employee
6+
from .models import Poll, Choice, Person, Book, Document, Paper, Employee, TrackedConcreteBaseExternal
77

88

99
class PersonAdmin(SimpleHistoryAdmin):
@@ -22,3 +22,4 @@ class ChoiceAdmin(SimpleHistoryAdmin):
2222
admin.site.register(Document, SimpleHistoryAdmin)
2323
admin.site.register(Paper, SimpleHistoryAdmin)
2424
admin.site.register(Employee, SimpleHistoryAdmin)
25+
admin.site.register(TrackedConcreteBaseExternal, SimpleHistoryAdmin)

simple_history/tests/external/models/model2.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,11 @@ class ExternalModel2(models.Model):
1010

1111
class Meta:
1212
app_label = 'external'
13+
14+
15+
class TrackedAbstractBaseExternal(models.Model):
16+
history = HistoricalRecords(inherit=True)
17+
18+
class Meta:
19+
abstract = True
20+
app_label = 'external'

simple_history/tests/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from simple_history import register
77

88
from .custom_user.models import CustomUser as User
9-
9+
from .external.models.model2 import TrackedAbstractBaseExternal
1010

1111
class Poll(models.Model):
1212
question = models.CharField(max_length=200)
@@ -341,6 +341,13 @@ class UntrackedConcreteBase(models.Model):
341341
pass
342342

343343

344+
class TrackedConcreteBaseExternal(TrackedAbstractBaseExternal):
345+
name = models.CharField(max_length=50)
346+
347+
class Meta:
348+
app_label = 'tests'
349+
350+
344351
class TrackedWithAbstractBase(TrackedAbstractBaseA):
345352
pass
346353

simple_history/tests/tests/test_admin.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from simple_history.models import HistoricalRecords
1515
from simple_history.admin import SimpleHistoryAdmin, get_complete_version
16-
from ..models import Book, Person, Poll, State, Employee, Choice
16+
from ..models import Book, Person, Poll, State, Employee, Choice, TrackedConcreteBaseExternal
1717

1818
try:
1919
from django.contrib.admin.utils import quote
@@ -551,3 +551,58 @@ def test_history_form_view_getting_history_with_setting_off(self):
551551
}
552552
mock_render.assert_called_once_with(
553553
request, admin.object_history_form_template, context, **extra_kwargs)
554+
555+
def test_history_form_view_getting_history_abstract_external(self):
556+
request = RequestFactory().post('/')
557+
request.session = 'session'
558+
request._messages = FallbackStorage(request)
559+
request.user = self.user
560+
request.POST = {'_change_history': True}
561+
562+
obj = TrackedConcreteBaseExternal.objects.create(name='test')
563+
obj.name = "new_test"
564+
obj.save()
565+
history = obj.history.all()[0]
566+
567+
admin_site = AdminSite()
568+
admin = SimpleHistoryAdmin(TrackedConcreteBaseExternal, admin_site)
569+
570+
with patch('simple_history.admin.render') as mock_render:
571+
with patch('simple_history.admin.SIMPLE_HISTORY_EDIT', True):
572+
admin.history_form_view(request, obj.id, history.pk)
573+
574+
context = {
575+
# Verify this is set for history object not poll object
576+
'original': history.instance,
577+
'change_history': True,
578+
579+
'title': 'Revert %s' % force_text(history.instance),
580+
'adminform': ANY,
581+
'object_id': obj.id,
582+
'is_popup': False,
583+
'media': ANY,
584+
'errors': ANY,
585+
'app_label': 'tests',
586+
'original_opts': ANY,
587+
'changelist_url': '/admin/tests/trackedconcretebaseexternal/',
588+
'change_url': ANY,
589+
'history_url': '/admin/tests/trackedconcretebaseexternal/{pk}/history/'.format(
590+
pk=obj.pk),
591+
'add': False,
592+
'change': True,
593+
'has_add_permission': admin.has_add_permission(request),
594+
'has_change_permission': admin.has_change_permission(
595+
request, obj),
596+
'has_delete_permission': admin.has_delete_permission(
597+
request, obj),
598+
'has_file_field': True,
599+
'has_absolute_url': False,
600+
'form_url': '',
601+
'opts': ANY,
602+
'content_type_id': ANY,
603+
'save_as': admin.save_as,
604+
'save_on_top': admin.save_on_top,
605+
'root_path': getattr(admin_site, 'root_path', None),
606+
}
607+
mock_render.assert_called_once_with(
608+
request, admin.object_history_form_template, context, **extra_kwargs)

0 commit comments

Comments
 (0)