From 624ebef117474270e64c4d81cc7d8a5efebbf582 Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Wed, 13 Apr 2022 20:29:20 +0100 Subject: [PATCH 01/15] Added action button to view the published content --- djangocms_versioning/admin.py | 44 ++++++++++++++++++- .../admin/published_icon.html | 6 +++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html diff --git a/djangocms_versioning/admin.py b/djangocms_versioning/admin.py index 7de9433f..24f3a7a4 100644 --- a/djangocms_versioning/admin.py +++ b/djangocms_versioning/admin.py @@ -181,6 +181,16 @@ def _get_preview_url(self, obj): else: return None + def _get_published_url(self, obj): + """ + Return the published url method if available, otherwise return None + :return: method or None + """ + try: + return obj.content.get_absolute_url() + except AttributeError: + return None + def _list_actions(self, request): """ A closure that makes it possible to pass request object to @@ -201,7 +211,7 @@ def list_actions(obj): def _get_preview_link(self, obj, request, disabled=False): """ - Return a user friendly button for previewing the content model + Return a user-friendly button for previewing the content model :param obj: Instance of versioned content model :param request: The request to admin menu :param disabled: Should the link be marked disabled? @@ -216,6 +226,23 @@ def _get_preview_link(self, obj, request, disabled=False): {"url": preview_url or get_preview_url(obj), "disabled": disabled}, ) + def _get_published_link(self, obj, request): + """ + Return a user-friendly button for viewing the published content + :param obj: Instance of versioned content model + :param request: The request to admin menu + :return: Published link icon template + """ + published_url = self._get_published_url(obj) + + if not published_url: + return "" + + return render_to_string( + "djangocms_versioning/admin/icons/published_icon.html", + {"published_url": published_url}, + ) + def _get_edit_link(self, obj, request, disabled=False): """ Return a user friendly button for editing the content model @@ -260,6 +287,7 @@ def get_list_actions(self): return [ self._get_preview_link, self._get_edit_link, + self._get_published_link, self._get_manage_versions_link, ] @@ -501,6 +529,19 @@ def _get_unpublish_link(self, obj, request, disabled=False): {"unpublish_url": unpublish_url, "disabled": disabled}, ) + def _get_published_link(self, obj, request): + """Helper function to get the html link to the published page""" + if not obj.state == PUBLISHED: + # Don't display the link if it isn't published + return "" + + published_url = obj.content.get_absolute_url() + + return render_to_string( + "djangocms_versioning/admin/published_icon.html", + {"published_url": published_url}, + ) + def _get_edit_link(self, obj, request, disabled=False): """Helper function to get the html link to the edit action """ @@ -584,6 +625,7 @@ def get_state_actions(self): self._get_archive_link, self._get_publish_link, self._get_unpublish_link, + self._get_published_link, self._get_revert_link, self._get_discard_link, ] diff --git a/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html b/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html new file mode 100644 index 00000000..faf130ca --- /dev/null +++ b/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html @@ -0,0 +1,6 @@ +{% load static i18n %} +{% spaceless %} + + +{% endspaceless %} From 069ed800e8e6335997ca4fc1c1253ea4956a381a Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Wed, 13 Apr 2022 20:50:48 +0100 Subject: [PATCH 02/15] Add an extra line of defence --- djangocms_versioning/admin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/djangocms_versioning/admin.py b/djangocms_versioning/admin.py index 24f3a7a4..c4a7539f 100644 --- a/djangocms_versioning/admin.py +++ b/djangocms_versioning/admin.py @@ -535,7 +535,10 @@ def _get_published_link(self, obj, request): # Don't display the link if it isn't published return "" - published_url = obj.content.get_absolute_url() + try: + published_url = obj.content.get_absolute_url() + except AttributeError: + return "" return render_to_string( "djangocms_versioning/admin/published_icon.html", From d14ba6815768f7010d43cfe8a91caa8549d5ceb7 Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Wed, 13 Apr 2022 20:29:20 +0100 Subject: [PATCH 03/15] Correct template path --- djangocms_versioning/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djangocms_versioning/admin.py b/djangocms_versioning/admin.py index c4a7539f..499b2c92 100644 --- a/djangocms_versioning/admin.py +++ b/djangocms_versioning/admin.py @@ -239,7 +239,7 @@ def _get_published_link(self, obj, request): return "" return render_to_string( - "djangocms_versioning/admin/icons/published_icon.html", + "djangocms_versioning/admin/published_icon.html", {"published_url": published_url}, ) From 3aad6e450c4da2c1c5a68409b2cf3842fede86ba Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Thu, 14 Apr 2022 23:06:54 +0100 Subject: [PATCH 04/15] Fix tox --- tox.ini | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tox.ini b/tox.ini index aebbaee8..808fa934 100644 --- a/tox.ini +++ b/tox.ini @@ -8,10 +8,8 @@ skip_missing_interpreters=True [testenv] deps = - -r{toxinidir}/tests/requirements/requirements_base.txt - - dj22: -r{toxinidir}/tests/requirements/django_22.txt - dj32: -r{toxinidir}/tests/requirements/django_32.txt + dj22: -r{toxinidir}/tests/requirements/dj22_cms40.txt + dj32: -r{toxinidir}/tests/requirements/dj32_cms40.txt basepython = py37: python3.7 From 23bf3e835ab0c13abae57ba548beb2d97adcd9a9 Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Thu, 14 Apr 2022 23:20:08 +0100 Subject: [PATCH 05/15] Added tests for new published content link --- tests/test_admin.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/test_admin.py b/tests/test_admin.py index c2e7d1b3..58fd8cde 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -608,6 +608,46 @@ def test_revert_action_link_for_archive_state(self): expected_disabled_control, actual_disabled_control.replace("\n", "") ) + def test_action_published_link_visible_state(self): + """The published content link action is available""" + version = factories.PollVersionFactory(state=constants.PUBLISHED) + user = factories.UserFactory() + request = RequestFactory().get("/admin/polls/pollcontent/") + request.user = user + published_url = version.content.get_absolute_url() + + expected_action_state = ( + '' + ) % published_url + actual_action_control = self.version_admin._get_published_link(version, request) + + self.assertIn(expected_action_state, actual_action_control) + + def test_action_published_link_not_visible_state(self): + """The published content link action is not available""" + version = factories.PollVersionFactory(state=constants.DRAFT) + user = factories.UserFactory() + request = RequestFactory().get("/admin/polls/pollcontent/") + request.user = user + + expected_action_state = '' + actual_action_control = self.version_admin._get_published_link(version, request) + + self.assertIn(expected_action_state, actual_action_control) + + def test_action_published_link_not_valid_obj(self): + """The published content link is not applicable with this object""" + version = factories.AnswerFactory() + user = factories.UserFactory() + request = RequestFactory().get("/admin/polls/answer/") + request.user = user + + expected_action_state = '' + actual_action_control = self.version_admin._get_published_link(version, request) + + self.assertIn(expected_action_state, actual_action_control) + class StateActionsTestCase(CMSTestCase): def test_archive_in_state_actions_for_draft_version(self): From 62fad313ae9a33d66f03f250d3c1554fbc2b019a Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Thu, 14 Apr 2022 23:20:16 +0100 Subject: [PATCH 06/15] Improvements following testing --- djangocms_versioning/admin.py | 16 +++++++++++----- .../admin/published_icon.html | 3 +-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/djangocms_versioning/admin.py b/djangocms_versioning/admin.py index 499b2c92..cb597029 100644 --- a/djangocms_versioning/admin.py +++ b/djangocms_versioning/admin.py @@ -233,6 +233,12 @@ def _get_published_link(self, obj, request): :param request: The request to admin menu :return: Published link icon template """ + version = proxy_model(self.get_version(obj), self.model) + + if version.state != PUBLISHED: + # Don't display the link if it can't be edited + return "" + published_url = self._get_published_url(obj) if not published_url: @@ -530,12 +536,12 @@ def _get_unpublish_link(self, obj, request, disabled=False): ) def _get_published_link(self, obj, request): - """Helper function to get the html link to the published page""" - if not obj.state == PUBLISHED: - # Don't display the link if it isn't published - return "" - + """Helper function to get the link to the published page""" try: + if not obj.state == PUBLISHED: + # Don't display the link if it isn't published + return "" + published_url = obj.content.get_absolute_url() except AttributeError: return "" diff --git a/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html b/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html index faf130ca..3f147ce0 100644 --- a/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html +++ b/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html @@ -1,6 +1,5 @@ {% load static i18n %} {% spaceless %} - + {% endspaceless %} From 2ee579e9d3338c570f8543557f847def3bc5780a Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Thu, 14 Apr 2022 23:34:50 +0100 Subject: [PATCH 07/15] Updated changelog --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 54e072f3..3421d5e6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,7 @@ Changelog Unreleased ========== +* feat: Added action button on published versions to view the content. 1.0.4 (2022-04-05) ================== From c2cb8aae223f5b93b7f7431fce36e43be6051d7e Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Fri, 15 Apr 2022 00:50:13 +0100 Subject: [PATCH 08/15] Remove from ``ExtendedVersionAdminMixin`` --- djangocms_versioning/admin.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/djangocms_versioning/admin.py b/djangocms_versioning/admin.py index cb597029..8346b59d 100644 --- a/djangocms_versioning/admin.py +++ b/djangocms_versioning/admin.py @@ -181,16 +181,6 @@ def _get_preview_url(self, obj): else: return None - def _get_published_url(self, obj): - """ - Return the published url method if available, otherwise return None - :return: method or None - """ - try: - return obj.content.get_absolute_url() - except AttributeError: - return None - def _list_actions(self, request): """ A closure that makes it possible to pass request object to @@ -226,29 +216,6 @@ def _get_preview_link(self, obj, request, disabled=False): {"url": preview_url or get_preview_url(obj), "disabled": disabled}, ) - def _get_published_link(self, obj, request): - """ - Return a user-friendly button for viewing the published content - :param obj: Instance of versioned content model - :param request: The request to admin menu - :return: Published link icon template - """ - version = proxy_model(self.get_version(obj), self.model) - - if version.state != PUBLISHED: - # Don't display the link if it can't be edited - return "" - - published_url = self._get_published_url(obj) - - if not published_url: - return "" - - return render_to_string( - "djangocms_versioning/admin/published_icon.html", - {"published_url": published_url}, - ) - def _get_edit_link(self, obj, request, disabled=False): """ Return a user friendly button for editing the content model @@ -293,7 +260,6 @@ def get_list_actions(self): return [ self._get_preview_link, self._get_edit_link, - self._get_published_link, self._get_manage_versions_link, ] From 225f9a49ce37155c0fe243fd1ecf86cc270d688d Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Thu, 8 Sep 2022 23:12:26 +0100 Subject: [PATCH 09/15] Extend ignored directories for isort and flake8 --- setup.cfg | 4 +++- tox.ini | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 274739e5..cc43d147 100644 --- a/setup.cfg +++ b/setup.cfg @@ -6,7 +6,9 @@ exclude = **/migrations/, build/, .tox/, + .venv, venv, + node_modules [isort] line_length = 88 @@ -15,7 +17,7 @@ lines_after_imports = 2 combine_as_imports = true include_trailing_comma = true balanced_wrapping = true -skip = manage.py, migrations, .tox +skip = manage.py, migrations, .tox, .venv, node_modules extra_standard_library = mock known_django = django known_cms = cms, menus diff --git a/tox.ini b/tox.ini index 808fa934..1bcab52a 100644 --- a/tox.ini +++ b/tox.ini @@ -27,5 +27,5 @@ commands = flake8 basepython = python3.8 [testenv:isort] -commands = isort --recursive --check-only --diff {toxinidir} +commands = isort --check --diff {toxinidir} basepython = python3.8 From 6d02e4b296d47a6e462d1fba00d32e851be31e33 Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Thu, 8 Sep 2022 23:23:33 +0100 Subject: [PATCH 10/15] Addressed review comments --- djangocms_versioning/admin.py | 13 +++++-------- .../admin/icons/published_icon.html | 5 +++++ .../djangocms_versioning/admin/published_icon.html | 5 ----- 3 files changed, 10 insertions(+), 13 deletions(-) create mode 100644 djangocms_versioning/templates/djangocms_versioning/admin/icons/published_icon.html delete mode 100644 djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html diff --git a/djangocms_versioning/admin.py b/djangocms_versioning/admin.py index 9479aa44..b03abb3b 100644 --- a/djangocms_versioning/admin.py +++ b/djangocms_versioning/admin.py @@ -539,18 +539,15 @@ def _get_unpublish_link(self, obj, request, disabled=False): def _get_published_link(self, obj, request): """Helper function to get the link to the published page""" - try: - if not obj.state == PUBLISHED: - # Don't display the link if it isn't published - return "" - - published_url = obj.content.get_absolute_url() - except AttributeError: + if not obj.state == PUBLISHED: + # Don't display the link if it isn't published return "" + published_url = obj.content.get_absolute_url() + return render_to_string( "djangocms_versioning/admin/published_icon.html", - {"published_url": published_url}, + {"url": published_url, "disabled": False}, ) def _get_edit_link(self, obj, request, disabled=False): diff --git a/djangocms_versioning/templates/djangocms_versioning/admin/icons/published_icon.html b/djangocms_versioning/templates/djangocms_versioning/admin/icons/published_icon.html new file mode 100644 index 00000000..6ae2cd3d --- /dev/null +++ b/djangocms_versioning/templates/djangocms_versioning/admin/icons/published_icon.html @@ -0,0 +1,5 @@ +{% extends "./base.html" %} +{% load static i18n %} +{% block title %}{% trans 'View published' %}{% endblock %} +{% block name %}view published{% endblock %} +{% block icon %}{% static 'djangocms_versioning/svg/preview.svg' %}{% endblock %} diff --git a/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html b/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html deleted file mode 100644 index 3f147ce0..00000000 --- a/djangocms_versioning/templates/djangocms_versioning/admin/published_icon.html +++ /dev/null @@ -1,5 +0,0 @@ -{% load static i18n %} -{% spaceless %} - - -{% endspaceless %} From f99362115b8f37c92df8830ab24a8705e686d939 Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Thu, 8 Sep 2022 23:31:29 +0100 Subject: [PATCH 11/15] Fix path to template --- djangocms_versioning/admin.py | 2 +- tox.ini | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/djangocms_versioning/admin.py b/djangocms_versioning/admin.py index b03abb3b..adb8e6fc 100644 --- a/djangocms_versioning/admin.py +++ b/djangocms_versioning/admin.py @@ -546,7 +546,7 @@ def _get_published_link(self, obj, request): published_url = obj.content.get_absolute_url() return render_to_string( - "djangocms_versioning/admin/published_icon.html", + "djangocms_versioning/admin/icons/published_icon.html", {"url": published_url, "disabled": False}, ) diff --git a/tox.ini b/tox.ini index 1bcab52a..c386c6b1 100644 --- a/tox.ini +++ b/tox.ini @@ -23,9 +23,11 @@ commands = {env:COMMAND:coverage} report [testenv:flake8] +deps = flake8 commands = flake8 basepython = python3.8 [testenv:isort] +deps = isort commands = isort --check --diff {toxinidir} basepython = python3.8 From 094a1bb9bec9266652a09a20d7c8a99b95606674 Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Fri, 9 Sep 2022 00:11:26 +0100 Subject: [PATCH 12/15] Update test expectation following template change. --- tests/test_admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_admin.py b/tests/test_admin.py index 23638dde..4da9dc48 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -626,8 +626,8 @@ def test_action_published_link_visible_state(self): published_url = version.content.get_absolute_url() expected_action_state = ( - '' + '' ) % published_url actual_action_control = self.version_admin._get_published_link(version, request) From 093613b44d1c824819aa55b37b7bd836241eff21 Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Fri, 9 Sep 2022 00:18:51 +0100 Subject: [PATCH 13/15] Update test expectation following template change. --- tests/test_admin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_admin.py b/tests/test_admin.py index 4da9dc48..15f9c5f5 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -626,8 +626,9 @@ def test_action_published_link_visible_state(self): published_url = version.content.get_absolute_url() expected_action_state = ( - '' + ' Date: Fri, 9 Sep 2022 01:13:05 +0100 Subject: [PATCH 14/15] Expect an ``AttributeError`` when object isn't versioning compatible --- tests/test_admin.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/test_admin.py b/tests/test_admin.py index 15f9c5f5..4cb7bc25 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -653,10 +653,8 @@ def test_action_published_link_not_valid_obj(self): request = RequestFactory().get("/admin/polls/answer/") request.user = user - expected_action_state = '' - actual_action_control = self.version_admin._get_published_link(version, request) - - self.assertIn(expected_action_state, actual_action_control) + with self.assertRaises(AttributeError): + self.version_admin._get_published_link(version, request) def test_edit_action_link_sideframe_editing_disabled_state(self): """ From e2c8b404d91d378166e29326246f7c13f79ce18e Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Mon, 21 Nov 2022 09:02:37 +0100 Subject: [PATCH 15/15] Allow for versioned objects w/o .get_absolute_url --- djangocms_versioning/admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/djangocms_versioning/admin.py b/djangocms_versioning/admin.py index adb8e6fc..2e0fc708 100644 --- a/djangocms_versioning/admin.py +++ b/djangocms_versioning/admin.py @@ -543,12 +543,12 @@ def _get_published_link(self, obj, request): # Don't display the link if it isn't published return "" - published_url = obj.content.get_absolute_url() + published_url = getattr(obj.content, "get_absolute_url", None) return render_to_string( "djangocms_versioning/admin/icons/published_icon.html", {"url": published_url, "disabled": False}, - ) + ) if published_url else "" def _get_edit_link(self, obj, request, disabled=False): """Helper function to get the html link to the edit action