From 62558b610c56215fb1fedf8b1746366cfd0ca5c7 Mon Sep 17 00:00:00 2001 From: erikvw Date: Wed, 19 Feb 2020 18:10:55 -0600 Subject: [PATCH 01/11] show revert text / buttons based on value of revert_disabled. --- .../templates/simple_history/object_history.html | 2 +- .../templates/simple_history/object_history_form.html | 4 ++-- simple_history/templates/simple_history/submit_line.html | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/simple_history/templates/simple_history/object_history.html b/simple_history/templates/simple_history/object_history.html index e5795c061..82ff92852 100644 --- a/simple_history/templates/simple_history/object_history.html +++ b/simple_history/templates/simple_history/object_history.html @@ -8,7 +8,7 @@ {% block content %}
-

{% blocktrans %}Choose a date from the list below to revert to a previous version of this object.{% endblocktrans %}

+ {% if revert_disabled %}

{% blocktrans %}Choose a date from the list below to revert to a previous version of this object.{% endblocktrans %}

{% endif %}
{% if action_list %} diff --git a/simple_history/templates/simple_history/object_history_form.html b/simple_history/templates/simple_history/object_history_form.html index 57e34a295..32e7280fa 100644 --- a/simple_history/templates/simple_history/object_history_form.html +++ b/simple_history/templates/simple_history/object_history_form.html @@ -9,7 +9,7 @@ {{opts.verbose_name_plural|capfirst}}{{original|truncatewords:"18"}}{% trans "History" %} › - {% blocktrans with original_opts.verbose_name as verbose_name %}Revert {{verbose_name}}{% endblocktrans %} + {% if revert_disabled %}{% blocktrans with original_opts.verbose_name as verbose_name %}View {{verbose_name}}{% endblocktrans %}{% else %}{% blocktrans with original_opts.verbose_name as verbose_name %}Revert {{verbose_name}}{% endblocktrans %}{% endif %}
{% endblock %} @@ -18,5 +18,5 @@ {% endblock %} {% block form_top %} -

{% blocktrans %}Press the 'Revert' button below to revert to this version of the object.{% endblocktrans %} {% if change_history %}{% blocktrans %}Or press the 'Change History' button to edit the history.{% endblocktrans %}{% endif %}

+

{% if not revert_disabled %}{% blocktrans %}Press the 'Revert' button below to revert to this version of the object. {% endblocktrans %}{% endif %}{% if change_history %}{% blocktrans %}Press the 'Change History' button below to edit the history.{% endblocktrans %}{% endif %}

{% endblock %} diff --git a/simple_history/templates/simple_history/submit_line.html b/simple_history/templates/simple_history/submit_line.html index 4cf64e96f..37c4c3b44 100644 --- a/simple_history/templates/simple_history/submit_line.html +++ b/simple_history/templates/simple_history/submit_line.html @@ -1,5 +1,6 @@ {% load i18n %}
- -{% if change_history %}{% endif %} -
+ {% if show_revert_button %}{% endif %} + {% if change_history %}{% endif %} + {% trans 'Close' %} +
\ No newline at end of file From 563235a4cd9ba43c184b4e7ab8b03c49f29aa062 Mon Sep 17 00:00:00 2001 From: erikvw Date: Wed, 19 Feb 2020 18:11:31 -0600 Subject: [PATCH 02/11] add tests for revert disabled functionality --- simple_history/tests/admin.py | 9 ++++ simple_history/tests/models.py | 13 ++++- simple_history/tests/tests/test_admin.py | 64 ++++++++++++++++++++++-- 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/simple_history/tests/admin.py b/simple_history/tests/admin.py index 3619c299f..13c32c57d 100644 --- a/simple_history/tests/admin.py +++ b/simple_history/tests/admin.py @@ -13,6 +13,7 @@ FileModel, Paper, Person, + Planet, Poll, ) @@ -33,6 +34,13 @@ def test_method(self, obj): history_list_display = ["title", "test_method"] +class PlanetAdmin(SimpleHistoryAdmin): + def test_method(self, obj): + return "test_method_value" + + history_list_display = ["title", "test_method"] + + admin.site.register(Poll, SimpleHistoryAdmin) admin.site.register(Choice, ChoiceAdmin) admin.site.register(Person, PersonAdmin) @@ -43,3 +51,4 @@ def test_method(self, obj): admin.site.register(ConcreteExternal, SimpleHistoryAdmin) admin.site.register(ExternalModelWithCustomUserIdField, SimpleHistoryAdmin) admin.site.register(FileModel, FileModelAdmin) +admin.site.register(Planet, PlanetAdmin) diff --git a/simple_history/tests/models.py b/simple_history/tests/models.py index 8503ea182..66c96e104 100644 --- a/simple_history/tests/models.py +++ b/simple_history/tests/models.py @@ -381,6 +381,17 @@ class City(models.Model): history = HistoricalRecords() +class Planet(models.Model): + star = models.CharField(max_length=30) + history = HistoricalRecords() + + def __str__(self): + return self.star + + class Meta: + verbose_name = "Planet" + + class Contact(models.Model): name = models.CharField(max_length=30) email = models.EmailField(max_length=255, unique=True) @@ -576,7 +587,6 @@ class UUIDRegisterModel(models.Model): register(UUIDRegisterModel, history_id_field=models.UUIDField(default=uuid.uuid4)) - # Set the SIMPLE_HISTORY_HISTORY_ID_USE_UUID setattr(settings, "SIMPLE_HISTORY_HISTORY_ID_USE_UUID", True) @@ -589,7 +599,6 @@ class UUIDDefaultModel(models.Model): # Clear the SIMPLE_HISTORY_HISTORY_ID_USE_UUID delattr(settings, "SIMPLE_HISTORY_HISTORY_ID_USE_UUID") - # Set the SIMPLE_HISTORY_HISTORY_CHANGE_REASON_FIELD setattr(settings, "SIMPLE_HISTORY_HISTORY_CHANGE_REASON_USE_TEXT_FIELD", True) diff --git a/simple_history/tests/tests/test_admin.py b/simple_history/tests/tests/test_admin.py index 99417dc21..6bba53bf5 100644 --- a/simple_history/tests/tests/test_admin.py +++ b/simple_history/tests/tests/test_admin.py @@ -4,7 +4,7 @@ from django.contrib.admin.utils import quote from django.contrib.auth import get_user_model from django.contrib.messages.storage.fallback import FallbackStorage -from django.test import TestCase +from django.test import TestCase, tag from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse @@ -26,6 +26,7 @@ Person, Poll, State, + Planet, ) if django.VERSION < (2,): @@ -65,8 +66,13 @@ def tearDown(self): except AttributeError: pass - def login(self, user=None): - self.client.force_login(user or self.user) + def login(self, user=None, superuser=None): + user = user or self.user + if superuser is not None: + user.is_superuser = True if superuser is None else superuser + user.is_active = True + user.save() + self.client.force_login(user) def test_history_list(self): model_name = self.user._meta.model_name @@ -135,11 +141,13 @@ def test_history_list_custom_user_id_field(self): self.assertEqual(200, resp.status_code) + @tag("2") def test_history_view_permission(self): self.login() person = Person.objects.create(name="Sandra Hale") self.client.get(get_history_url(person), status=403) + @tag("2") def test_history_form_permission(self): self.login(self.user) person = Person.objects.create(name="Sandra Hale") @@ -465,6 +473,7 @@ def test_history_form_view_without_getting_history(self): "has_add_permission": admin.has_add_permission(request), "has_change_permission": admin.has_change_permission(request, poll), "has_delete_permission": admin.has_delete_permission(request, poll), + "revert_disabled": admin.revert_disabled, "has_file_field": True, "has_absolute_url": False, "form_url": "", @@ -518,6 +527,7 @@ def test_history_form_view_getting_history(self): "has_add_permission": admin.has_add_permission(request), "has_change_permission": admin.has_change_permission(request, poll), "has_delete_permission": admin.has_delete_permission(request, poll), + "revert_disabled": admin.revert_disabled, "has_file_field": True, "has_absolute_url": False, "form_url": "", @@ -571,6 +581,7 @@ def test_history_form_view_getting_history_with_setting_off(self): "has_add_permission": admin.has_add_permission(request), "has_change_permission": admin.has_change_permission(request, poll), "has_delete_permission": admin.has_delete_permission(request, poll), + "revert_disabled": admin.revert_disabled, "has_file_field": True, "has_absolute_url": False, "form_url": "", @@ -626,6 +637,7 @@ def test_history_form_view_getting_history_abstract_external(self): "has_add_permission": admin.has_add_permission(request), "has_change_permission": admin.has_change_permission(request, obj), "has_delete_permission": admin.has_delete_permission(request, obj), + "revert_disabled": admin.revert_disabled, "has_file_field": True, "has_absolute_url": False, "form_url": "", @@ -683,6 +695,7 @@ def test_history_form_view_accepts_additional_context(self): "has_add_permission": admin.has_add_permission(request), "has_change_permission": admin.has_change_permission(request, poll), "has_delete_permission": admin.has_delete_permission(request, poll), + "revert_disabled": admin.revert_disabled, "has_file_field": True, "has_absolute_url": False, "form_url": "", @@ -696,3 +709,48 @@ def test_history_form_view_accepts_additional_context(self): mock_render.assert_called_once_with( request, admin.object_history_form_template, context ) + + @tag("1") + @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True) + def test_history_view__title_is_view(self): + self.login() + planet = Planet.objects.create(star="Sun") + response = self.client.get(get_history_url(planet)) + self.assertContains(response, "View history: Sun") + + @tag("3") + @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=False, SIMPLE_HISTORY_EDIT=True) + def test_history_view__title_is_change(self): + self.login() + planet = Planet.objects.create(star="Sun") + response = self.client.get(get_history_url(planet)) + self.assertContains(response, "Change history: Sun") + + @tag("1") + def test_history_view__shows_revert_button_by_default(self): + self.login() + planet = Planet.objects.create(star="Sun") + response = self.client.get(get_history_url(planet)) + self.assertContains(response, "Change history: Sun") + + @tag("1") + @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True) + def test_history_form_view__does_not_show_revert_button(self): + self.login() + planet = Planet.objects.create(star="Sun") + response = self.client.get(get_history_url(planet, 0)) + self.assertContains(response, "View Planet") + self.assertContains(response, "View Sun") + self.assertNotContains(response, "Revert") + + @tag("1") + @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=False) + def test_history_form_view__shows_revert_button(self): + """Assert revert button is shown. + """ + self.login() + planet = Planet.objects.create(star="Sun") + response = self.client.get(get_history_url(planet, 0)) + self.assertContains(response, "Revert Planet") + self.assertContains(response, "Revert Sun") + self.assertContains(response, "Press the 'Revert' button") From 39533aca652ae5ac6859a031a1000565ae100142 Mon Sep 17 00:00:00 2001 From: erikvw Date: Wed, 19 Feb 2020 18:12:08 -0600 Subject: [PATCH 03/11] add SIMPLE_HISTORY_REVERT_DISABLED as attr to control visibility of Revert button. --- simple_history/admin.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/simple_history/admin.py b/simple_history/admin.py index ea9c85ed4..99e61287c 100644 --- a/simple_history/admin.py +++ b/simple_history/admin.py @@ -88,7 +88,7 @@ def history_view(self, request, object_id, extra_context=None): content_type.model, ) context = { - "title": _("Change history: %s") % force_str(obj), + "title": self.history_view_title(obj), "action_list": action_list, "module_name": capfirst(force_str(opts.verbose_name_plural)), "object": obj, @@ -97,6 +97,7 @@ def history_view(self, request, object_id, extra_context=None): "opts": opts, "admin_user_view": admin_user_view, "history_list_display": history_list_display, + "revert_disabled": self.revert_disabled, } context.update(self.admin_site.each_context(request)) context.update(extra_context or {}) @@ -105,6 +106,12 @@ def history_view(self, request, object_id, extra_context=None): request, self.object_history_template, context, **extra_kwargs ) + def history_view_title(self, obj): + if self.revert_disabled and not SIMPLE_HISTORY_EDIT: + return _("View history: %s") % force_str(obj) + else: + return _("Change history: %s") % force_str(obj) + def response_change(self, request, obj): if "_change_history" in request.POST and SIMPLE_HISTORY_EDIT: verbose_name = obj._meta.verbose_name @@ -175,7 +182,7 @@ def history_form_view(self, request, object_id, version_id, extra_context=None): model_name = original_opts.model_name url_triplet = self.admin_site.name, original_opts.app_label, model_name context = { - "title": _("Revert %s") % force_str(obj), + "title": self.history_form_view_title(obj), "adminform": admin_form, "object_id": object_id, "original": obj, @@ -188,6 +195,7 @@ def history_form_view(self, request, object_id, version_id, extra_context=None): "change_url": reverse("%s:%s_%s_change" % url_triplet, args=(obj.pk,)), "history_url": reverse("%s:%s_%s_history" % url_triplet, args=(obj.pk,)), "change_history": change_history, + "revert_disabled": self.revert_disabled, # Context variables copied from render_change_form "add": False, "change": True, @@ -212,6 +220,12 @@ def history_form_view(self, request, object_id, version_id, extra_context=None): request, self.object_history_form_template, context, **extra_kwargs ) + def history_form_view_title(self, obj): + if self.revert_disabled: + return _("View %s") % force_str(obj) + else: + return _("Revert %s") % force_str(obj) + def render_history_view(self, request, template, context, **kwargs): """Catch call to render, to allow overriding.""" return render(request, template, context, **kwargs) @@ -226,3 +240,7 @@ def content_type_model_cls(self): """Returns the ContentType model class. """ return django_apps.get_model("contenttypes.contenttype") + + @property + def revert_disabled(self): + return getattr(settings, "SIMPLE_HISTORY_REVERT_DISABLED", False) From 8e28e5d97feb53cd7a2e3080bd3287a993106ffd Mon Sep 17 00:00:00 2001 From: erikvw Date: Wed, 19 Feb 2020 18:12:30 -0600 Subject: [PATCH 04/11] capture --tag from args --- runtests.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/runtests.py b/runtests.py index 2da87bf72..baa945768 100755 --- a/runtests.py +++ b/runtests.py @@ -73,12 +73,14 @@ def __getitem__(self, item): def main(): - if not settings.configured: settings.configure(**DEFAULT_SETTINGS) django.setup() - failures = DiscoverRunner(failfast=False).run_tests(["simple_history.tests"]) - failures |= DiscoverRunner(failfast=False).run_tests( + tags = [t.split("=")[1] for t in sys.argv if t.startswith("--tag")] + failures = DiscoverRunner(failfast=False, tags=tags).run_tests( + ["simple_history.tests"] + ) + failures |= DiscoverRunner(failfast=False, tags=tags).run_tests( ["simple_history.registry_tests"] ) sys.exit(failures) From d6a36e72ac780f84c3156917002718d518362b44 Mon Sep 17 00:00:00 2001 From: erikvw Date: Wed, 19 Feb 2020 19:41:34 -0600 Subject: [PATCH 05/11] correct variable name to revert_disabled --- simple_history/templates/simple_history/submit_line.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simple_history/templates/simple_history/submit_line.html b/simple_history/templates/simple_history/submit_line.html index 37c4c3b44..aecf017c9 100644 --- a/simple_history/templates/simple_history/submit_line.html +++ b/simple_history/templates/simple_history/submit_line.html @@ -1,6 +1,6 @@ {% load i18n %}
- {% if show_revert_button %}{% endif %} + {% if not revert_disabled %}{% endif %} {% if change_history %}{% endif %} {% trans 'Close' %}
\ No newline at end of file From 562e2c95b792ab0a514b7eeb737fec9a3c552b49 Mon Sep 17 00:00:00 2001 From: erikvw Date: Wed, 19 Feb 2020 20:20:54 -0600 Subject: [PATCH 06/11] update docs --- .gitignore | 1 + docs/admin.rst | 13 +++++++++++++ docs/screens/10_revert_disabled.png | Bin 0 -> 88377 bytes 3 files changed, 14 insertions(+) create mode 100644 docs/screens/10_revert_disabled.png diff --git a/.gitignore b/.gitignore index 7055632f0..fc8312c95 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ htmlcov/ MANIFEST test_files/ venv/ +.DS_Store diff --git a/docs/admin.rst b/docs/admin.rst index 039fdfedc..abd669be6 100644 --- a/docs/admin.rst +++ b/docs/admin.rst @@ -68,3 +68,16 @@ admin class .. image:: screens/5_history_list_display.png + +Disabling the option to revert an object +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By default, an object can be reverted to its previous version. To disable this option update your settings with the following: + +.. code-block:: python + + SIMPLE_HISTORY_REVERT_DISABLED=True + +When ``SIMPLE_HISTORY_REVERT_DISABLED`` is set to ``True``, the revert button is removed from the form. + +.. image:: screens/10_revert_disabled.png diff --git a/docs/screens/10_revert_disabled.png b/docs/screens/10_revert_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..851fcfe009445922432e483966ea3d74c0a52a44 GIT binary patch literal 88377 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 X)90$OcZ% Date: Thu, 20 Feb 2020 06:24:42 -0600 Subject: [PATCH 07/11] CHANGES.rst --- CHANGES.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 700c8a7f5..02363892b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,7 +7,8 @@ Unreleased - Add setting to convert `FileField` to `CharField` instead of `TextField` (gh-623) - import model `ContentType` in `SimpleHistoryAdmin` using `django_apps.get_model` to avoid possible `AppRegistryNotReady` exception (gh-630) - +- settings.SIMPLE_HISTORY_REVERT_DISABLED if True removes the Revert + button from the history form for all historical models (gh-632)) 2.8.0 (2019-12-02) ------------------ - Fixed `bulk_create_with_history support` for HistoryRecords with `relation_name` attribute (gh-591) From 0320cd8ab92b31af69372e499b56074b6fe9a2ff Mon Sep 17 00:00:00 2001 From: erikvw Date: Tue, 25 Feb 2020 09:17:52 -0600 Subject: [PATCH 08/11] remove unused test tags --- simple_history/tests/tests/test_admin.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/simple_history/tests/tests/test_admin.py b/simple_history/tests/tests/test_admin.py index 6bba53bf5..477970e0b 100644 --- a/simple_history/tests/tests/test_admin.py +++ b/simple_history/tests/tests/test_admin.py @@ -4,7 +4,7 @@ from django.contrib.admin.utils import quote from django.contrib.auth import get_user_model from django.contrib.messages.storage.fallback import FallbackStorage -from django.test import TestCase, tag +from django.test import TestCase from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse @@ -141,13 +141,11 @@ def test_history_list_custom_user_id_field(self): self.assertEqual(200, resp.status_code) - @tag("2") def test_history_view_permission(self): self.login() person = Person.objects.create(name="Sandra Hale") self.client.get(get_history_url(person), status=403) - @tag("2") def test_history_form_permission(self): self.login(self.user) person = Person.objects.create(name="Sandra Hale") @@ -710,7 +708,6 @@ def test_history_form_view_accepts_additional_context(self): request, admin.object_history_form_template, context ) - @tag("1") @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True) def test_history_view__title_is_view(self): self.login() @@ -718,7 +715,6 @@ def test_history_view__title_is_view(self): response = self.client.get(get_history_url(planet)) self.assertContains(response, "View history: Sun") - @tag("3") @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=False, SIMPLE_HISTORY_EDIT=True) def test_history_view__title_is_change(self): self.login() @@ -726,14 +722,12 @@ def test_history_view__title_is_change(self): response = self.client.get(get_history_url(planet)) self.assertContains(response, "Change history: Sun") - @tag("1") def test_history_view__shows_revert_button_by_default(self): self.login() planet = Planet.objects.create(star="Sun") response = self.client.get(get_history_url(planet)) self.assertContains(response, "Change history: Sun") - @tag("1") @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True) def test_history_form_view__does_not_show_revert_button(self): self.login() @@ -743,7 +737,6 @@ def test_history_form_view__does_not_show_revert_button(self): self.assertContains(response, "View Sun") self.assertNotContains(response, "Revert") - @tag("1") @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=False) def test_history_form_view__shows_revert_button(self): """Assert revert button is shown. From 995014dce6b03a5c5ca9ba832befa91266aa9442 Mon Sep 17 00:00:00 2001 From: erikvw Date: Tue, 25 Feb 2020 09:18:17 -0600 Subject: [PATCH 09/11] fix minor formatting issues in templates --- .../templates/simple_history/object_history.html | 6 ++---- simple_history/templates/simple_history/submit_line.html | 8 +++++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/simple_history/templates/simple_history/object_history.html b/simple_history/templates/simple_history/object_history.html index 82ff92852..ce9b86b54 100644 --- a/simple_history/templates/simple_history/object_history.html +++ b/simple_history/templates/simple_history/object_history.html @@ -7,9 +7,8 @@ {% block content %}
- - {% if revert_disabled %}

{% blocktrans %}Choose a date from the list below to revert to a previous version of this object.{% endblocktrans %}

{% endif %} - + {% if revert_disabled %}

+ {% blocktrans %}Choose a date from the list below to revert to a previous version of this object.{% endblocktrans %}

{% endif %}
{% if action_list %} {% display_list %} @@ -19,4 +18,3 @@
{% endblock %} - diff --git a/simple_history/templates/simple_history/submit_line.html b/simple_history/templates/simple_history/submit_line.html index aecf017c9..f0542c78d 100644 --- a/simple_history/templates/simple_history/submit_line.html +++ b/simple_history/templates/simple_history/submit_line.html @@ -1,6 +1,8 @@ {% load i18n %}
- {% if not revert_disabled %}{% endif %} - {% if change_history %}{% endif %} + {% if not revert_disabled %} + {% endif %} + {% if change_history %} + {% endif %} {% trans 'Close' %} -
\ No newline at end of file + From 958925978e8fe6031e57b72e40c72e478e48b998 Mon Sep 17 00:00:00 2001 From: erikvw Date: Tue, 25 Feb 2020 09:53:46 -0600 Subject: [PATCH 10/11] fix, only show text if revert is NOT disabled --- .../simple_history/object_history.html | 2 +- simple_history/tests/tests/test_admin.py | 36 +++++++++++-------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/simple_history/templates/simple_history/object_history.html b/simple_history/templates/simple_history/object_history.html index ce9b86b54..163679b22 100644 --- a/simple_history/templates/simple_history/object_history.html +++ b/simple_history/templates/simple_history/object_history.html @@ -7,7 +7,7 @@ {% block content %}
- {% if revert_disabled %}

+ {% if not revert_disabled %}

{% blocktrans %}Choose a date from the list below to revert to a previous version of this object.{% endblocktrans %}

{% endif %}
{% if action_list %} diff --git a/simple_history/tests/tests/test_admin.py b/simple_history/tests/tests/test_admin.py index 477970e0b..7c3e58c50 100644 --- a/simple_history/tests/tests/test_admin.py +++ b/simple_history/tests/tests/test_admin.py @@ -708,42 +708,50 @@ def test_history_form_view_accepts_additional_context(self): request, admin.object_history_form_template, context ) - @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True) - def test_history_view__title_is_view(self): + def test_history_view__title_suggests_revert_by_default(self): self.login() planet = Planet.objects.create(star="Sun") response = self.client.get(get_history_url(planet)) - self.assertContains(response, "View history: Sun") + self.assertContains(response, "Change history: Sun") - @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=False, SIMPLE_HISTORY_EDIT=True) - def test_history_view__title_is_change(self): + @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=False) + def test_history_view__title_suggests_revert(self): self.login() planet = Planet.objects.create(star="Sun") response = self.client.get(get_history_url(planet)) self.assertContains(response, "Change history: Sun") + self.assertContains(response, "Choose a date") - def test_history_view__shows_revert_button_by_default(self): + @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True) + def test_history_view__title_suggests_view_only(self): self.login() planet = Planet.objects.create(star="Sun") response = self.client.get(get_history_url(planet)) - self.assertContains(response, "Change history: Sun") + self.assertContains(response, "View history: Sun") + self.assertNotContains(response, "Choose a date") - @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True) - def test_history_form_view__does_not_show_revert_button(self): + def test_history_form_view__shows_revert_button_by_default(self): self.login() planet = Planet.objects.create(star="Sun") response = self.client.get(get_history_url(planet, 0)) - self.assertContains(response, "View Planet") - self.assertContains(response, "View Sun") - self.assertNotContains(response, "Revert") + self.assertContains(response, "Revert Planet") + self.assertContains(response, "Revert Sun") + self.assertContains(response, "Press the 'Revert' button") @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=False) def test_history_form_view__shows_revert_button(self): - """Assert revert button is shown. - """ self.login() planet = Planet.objects.create(star="Sun") response = self.client.get(get_history_url(planet, 0)) self.assertContains(response, "Revert Planet") self.assertContains(response, "Revert Sun") self.assertContains(response, "Press the 'Revert' button") + + @override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True) + def test_history_form_view__does_not_show_revert_button(self): + self.login() + planet = Planet.objects.create(star="Sun") + response = self.client.get(get_history_url(planet, 0)) + self.assertContains(response, "View Planet") + self.assertContains(response, "View Sun") + self.assertNotContains(response, "Revert") From c52ce7ea4438f967ad360f25fed433c16c9f1731 Mon Sep 17 00:00:00 2001 From: erikvw Date: Tue, 25 Feb 2020 10:59:02 -0600 Subject: [PATCH 11/11] use random file name in tests (uuid) --- simple_history/tests/tests/test_models.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/simple_history/tests/tests/test_models.py b/simple_history/tests/tests/test_models.py index 9b4df1566..fcc1aed2e 100644 --- a/simple_history/tests/tests/test_models.py +++ b/simple_history/tests/tests/test_models.py @@ -310,11 +310,12 @@ def test_foreignkey_still_allows_reverse_lookup_via_set_attribute(self): ) def test_file_field(self): - model = FileModel.objects.create(file=get_fake_file("name")) - self.assertEqual(model.file.name, "files/name") + filename = str(uuid.uuid4()) + model = FileModel.objects.create(file=get_fake_file(filename)) + self.assertEqual(model.file.name, "files/{}".format(filename)) model.file.delete() update_record, create_record = model.history.all() - self.assertEqual(create_record.file, "files/name") + self.assertEqual(create_record.file, "files/{}".format(filename)) self.assertEqual(update_record.file, "") def test_file_field_with_char_field_setting(self): @@ -323,11 +324,12 @@ def test_file_field_with_char_field_setting(self): self.assertIs(type(file_field), models.CharField) self.assertEqual(file_field.max_length, 100) # file field works the same as test_file_field() - model = CharFieldFileModel.objects.create(file=get_fake_file("name")) - self.assertEqual(model.file.name, "files/name") + filename = str(uuid.uuid4()) + model = CharFieldFileModel.objects.create(file=get_fake_file(filename)) + self.assertEqual(model.file.name, "files/{}".format(filename)) model.file.delete() update_record, create_record = model.history.all() - self.assertEqual(create_record.file, "files/name") + self.assertEqual(create_record.file, "files/{}".format(filename)) self.assertEqual(update_record.file, "") def test_inheritance(self):