From 079ac8efc4aca16e778835fbd8f8c0fac2606ee5 Mon Sep 17 00:00:00 2001 From: Andrew Aikman Date: Fri, 26 Nov 2021 15:55:23 +0000 Subject: [PATCH 1/8] isolated the error seen via a test --- tests/test_plugins.py | 86 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/tests/test_plugins.py b/tests/test_plugins.py index c3ef7e7d..aff46129 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -171,6 +171,10 @@ def setUp(self): draft_pagecontent_version = self.pagecontent_version.copy(self.superuser) self.draft_pagecontent = draft_pagecontent_version.content + def test_correct_versioning_state_published_snippet_and_page(self): + """ + If a page is published, the published snippet should be rendered + """ # Add plugin to our published page! add_plugin( self.pagecontent.placeholders.get(slot="content"), @@ -186,10 +190,6 @@ def setUp(self): snippet_grouper=self.draft_snippet.snippet_grouper, ) - def test_correct_versioning_state_published_snippet_and_page(self): - """ - If a page is published, the published snippet should be rendered - """ # Request for published page request_url = self.page.get_absolute_url(self.language) with self.login_user_context(self.superuser): @@ -201,9 +201,87 @@ def test_correct_versioning_state_draft_snippet_and_page(self): """ If we have a draft, the draft snippet should be rendered. """ + # Add plugin to our published page! + add_plugin( + self.pagecontent.placeholders.get(slot="content"), + "SnippetPlugin", + self.language, + snippet_grouper=self.snippet.snippet_grouper, + ) + # Add plugin to our draft page + add_plugin( + self.draft_pagecontent.placeholders.get(slot="content"), + "SnippetPlugin", + self.language, + snippet_grouper=self.draft_snippet.snippet_grouper, + ) + # Request for draft page request_url = get_object_edit_url(self.draft_pagecontent, "en") with self.login_user_context(self.superuser): response = self.client.get(request_url) self.assertContains(response, "

draft content

") + + def test_draft_snippet_and_page_live_url_rendering(self): + """ + If a page is published with a draft snippet is created + nothing should be rendered! + """ + snippet_grouper = SnippetGrouper.objects.create() + snippet = Snippet.objects.create( + name="plugin_snippet", + html="

Draft snippet

", + slug="plugin_snippet", + snippet_grouper=snippet_grouper, + ) + Version.objects.create( + content=snippet, + created_by=self.superuser, + created=datetime.datetime.now() + ) + + add_plugin( + self.pagecontent.placeholders.get(slot="content"), + "SnippetPlugin", + self.language, + snippet_grouper=snippet_grouper, + ) + + request_url = self.page.get_absolute_url(self.language) + with self.login_user_context(self.superuser): + response = self.client.get(request_url) + + self.assertContains(response, "

Draft snippet

") + + def test_published_snippet_and_page_live_url_rendering(self): + """ + If a page is published with a published snippet is + created the snippet should be rendered! + """ + snippet_grouper = SnippetGrouper.objects.create() + snippet = Snippet.objects.create( + name="plugin_snippet", + html="

Published snippet

", + slug="plugin_snippet", + snippet_grouper=snippet_grouper, + ) + snippet_version = Version.objects.create( + content=snippet, + created_by=self.superuser, + created=datetime.datetime.now() + ) + snippet_version.publish(user=self.superuser) + + add_plugin( + self.pagecontent.placeholders.get(slot="content"), + "SnippetPlugin", + self.language, + snippet_grouper=snippet_grouper, + ) + + request_url = self.page.get_absolute_url(self.language) + with self.login_user_context(self.superuser): + response = self.client.get(request_url) + + self.assertContains(response, "

Published snippet

") From 2386bf9547b6a9a37363fe651ca5004fbd34b2c3 Mon Sep 17 00:00:00 2001 From: Andrew Aikman Date: Fri, 26 Nov 2021 16:08:34 +0000 Subject: [PATCH 2/8] Fix added and improved the versioning tests --- CHANGELOG.rst | 6 ++++++ djangocms_snippet/cms_plugins.py | 5 +++++ tests/test_plugins.py | 7 ++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 0112ad5b..81b5a87a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog ========= +Unreleased +================== +* fix: Error when rendering a Draft Snippet plugin on a Published page +* feat: djangocms-versioning support added, including model restructure and configuration +* feat: django-cms v4.0.x support added + 3.0.0 (2020-09-02) ================== diff --git a/djangocms_snippet/cms_plugins.py b/djangocms_snippet/cms_plugins.py index 63e691fc..a6802626 100644 --- a/djangocms_snippet/cms_plugins.py +++ b/djangocms_snippet/cms_plugins.py @@ -24,6 +24,11 @@ class SnippetPlugin(CMSPluginBase): def render(self, context, instance, placeholder): snippet = instance.snippet_grouper.snippet(show_editable=show_draft_content(context["request"])) + + # Handle the potential for no snippet to be found i.e. Draft + if not snippet: + return context + try: if snippet.template: context = context.flatten() diff --git a/tests/test_plugins.py b/tests/test_plugins.py index aff46129..ceb0967a 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -196,6 +196,7 @@ def test_correct_versioning_state_published_snippet_and_page(self): response = self.client.get(request_url) self.assertContains(response, "

live content

") + self.assertNotIn("draft content", str(response.content)) def test_correct_versioning_state_draft_snippet_and_page(self): """ @@ -222,6 +223,7 @@ def test_correct_versioning_state_draft_snippet_and_page(self): response = self.client.get(request_url) self.assertContains(response, "

draft content

") + self.assertNotIn("live content", str(response.content)) def test_draft_snippet_and_page_live_url_rendering(self): """ @@ -252,7 +254,9 @@ def test_draft_snippet_and_page_live_url_rendering(self): with self.login_user_context(self.superuser): response = self.client.get(request_url) - self.assertContains(response, "

Draft snippet

") + self.assertEqual(response.status_code, 200) + self.assertNotIn("Draft snippet", str(response.content)) + self.assertNotIn("Published snippet", str(response.content)) def test_published_snippet_and_page_live_url_rendering(self): """ @@ -285,3 +289,4 @@ def test_published_snippet_and_page_live_url_rendering(self): response = self.client.get(request_url) self.assertContains(response, "

Published snippet

") + self.assertNotIn("Draft snippet", str(response.content)) From fd8db2d96107279567da9749116d5f7ddfa85428 Mon Sep 17 00:00:00 2001 From: Andrew Aikman Date: Fri, 26 Nov 2021 17:33:53 +0000 Subject: [PATCH 3/8] Fixed migrations --- CHANGELOG.rst | 2 ++ ...010_cms4_grouper_version_data_migration.py | 14 +++++++---- .../migrations/0012_auto_20210915_0721.py | 18 +++++++++++++-- .../migrations/0013_auto_20210915_0751.py | 23 ------------------- .../migrations/0014_auto_20211019_0522.py | 17 -------------- 5 files changed, 27 insertions(+), 47 deletions(-) delete mode 100644 djangocms_snippet/migrations/0013_auto_20210915_0751.py delete mode 100644 djangocms_snippet/migrations/0014_auto_20211019_0522.py diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 81b5a87a..4c3ab4e8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,8 @@ Changelog Unreleased ================== * fix: Error when rendering a Draft Snippet plugin on a Published page +* fix: Cleanup unnecessary migration files +* fix: Publish snippets by default as they were already in that state pre-versioning! * feat: djangocms-versioning support added, including model restructure and configuration * feat: django-cms v4.0.x support added diff --git a/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py b/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py index dee1d352..5c1126a3 100644 --- a/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py +++ b/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py @@ -29,24 +29,28 @@ def cms4_grouper_version_migration(apps, schema_editor): snippet_contenttype = ContentType.objects.get(app_label='djangocms_snippet', model='snippet') snippet_queryset = Snippet.objects.all() + # Get a migration user to create a version. + if djangocms_versioning_config_enabled and djangocms_versioning_installed: + Version = apps.get_model('djangocms_versioning', 'Version') + + migration_user = User.objects.get(id=DJANGOCMS_SNIPPET_VERSIONING_MIGRATION_USER_ID) + for snippet in snippet_queryset: grouper = SnippetGrouper.objects.create() snippet.snippet_grouper = grouper snippet.save() - # Get a migration user. - migration_user = User.objects.get(id=DJANGOCMS_SNIPPET_VERSIONING_MIGRATION_USER_ID) - # Create initial Snippet Versions if versioning is enabled and installed. if djangocms_versioning_config_enabled and djangocms_versioning_installed: - Version = apps.get_model('djangocms_versioning', 'Version') - Version.objects.create( + snippet_version = Version.objects.create( created_by=migration_user, state=DRAFT, number=1, object_id=snippet.pk, content_type=snippet_contenttype, ) + # Publish the snippet because all snippets were assumed published before + snippet_version.publish(migration_user) class Migration(migrations.Migration): diff --git a/djangocms_snippet/migrations/0012_auto_20210915_0721.py b/djangocms_snippet/migrations/0012_auto_20210915_0721.py index f57f106d..bf228431 100644 --- a/djangocms_snippet/migrations/0012_auto_20210915_0721.py +++ b/djangocms_snippet/migrations/0012_auto_20210915_0721.py @@ -17,12 +17,26 @@ class Migration(migrations.Migration): ), migrations.AlterField( model_name='snippet', - name='snippet_grouper', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='djangocms_snippet.SnippetGrouper'), + name='name', + field=models.CharField(max_length=255, verbose_name='Name'), + ), + migrations.AlterField( + model_name='snippet', + name='slug', + field=models.SlugField(default='', max_length=255, verbose_name='Slug'), + ), + migrations.AlterModelOptions( + name='snippet', + options={'verbose_name': 'Snippet', 'verbose_name_plural': 'Snippets'}, ), migrations.AlterField( model_name='snippetptr', name='snippet_grouper', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='djangocms_snippet.SnippetGrouper'), ), + migrations.AlterField( + model_name='snippet', + name='snippet_grouper', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='djangocms_snippet.SnippetGrouper'), + ), ] diff --git a/djangocms_snippet/migrations/0013_auto_20210915_0751.py b/djangocms_snippet/migrations/0013_auto_20210915_0751.py deleted file mode 100644 index de813001..00000000 --- a/djangocms_snippet/migrations/0013_auto_20210915_0751.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.2.24 on 2021-09-15 07:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('djangocms_snippet', '0012_auto_20210915_0721'), - ] - - operations = [ - migrations.AlterField( - model_name='snippet', - name='name', - field=models.CharField(max_length=255, verbose_name='Name'), - ), - migrations.AlterField( - model_name='snippet', - name='slug', - field=models.SlugField(default='', max_length=255, verbose_name='Slug'), - ), - ] diff --git a/djangocms_snippet/migrations/0014_auto_20211019_0522.py b/djangocms_snippet/migrations/0014_auto_20211019_0522.py deleted file mode 100644 index 1f70ec08..00000000 --- a/djangocms_snippet/migrations/0014_auto_20211019_0522.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.2.24 on 2021-10-19 10:22 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('djangocms_snippet', '0013_auto_20210915_0751'), - ] - - operations = [ - migrations.AlterModelOptions( - name='snippet', - options={'verbose_name': 'Snippet', 'verbose_name_plural': 'Snippets'}, - ), - ] From 2ef69b56cf87deb70645680f3fcebd1e245a1391 Mon Sep 17 00:00:00 2001 From: Andrew Aikman Date: Fri, 26 Nov 2021 17:34:45 +0000 Subject: [PATCH 4/8] Fix changelog --- CHANGELOG.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4c3ab4e8..06cd54cf 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,8 +5,7 @@ Changelog Unreleased ================== * fix: Error when rendering a Draft Snippet plugin on a Published page -* fix: Cleanup unnecessary migration files -* fix: Publish snippets by default as they were already in that state pre-versioning! +* fix: Publish snippets by default as they were already in that state pre-versioning and cleanup unnecessary migration files before release! * feat: djangocms-versioning support added, including model restructure and configuration * feat: django-cms v4.0.x support added From 043ee9843f1ced5373018286d272fdf178ee51e4 Mon Sep 17 00:00:00 2001 From: Andrew Aikman Date: Fri, 26 Nov 2021 17:49:49 +0000 Subject: [PATCH 5/8] Fix import error --- .../0010_cms4_grouper_version_data_migration.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py b/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py index 5c1126a3..a90d14ee 100644 --- a/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py +++ b/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py @@ -9,7 +9,7 @@ try: - from djangocms_versioning.constants import DRAFT + from djangocms_versioning.constants import DRAFT, PUBLISHED djangocms_versioning_installed = True except ImportError: @@ -41,16 +41,15 @@ def cms4_grouper_version_migration(apps, schema_editor): snippet.save() # Create initial Snippet Versions if versioning is enabled and installed. + # Publish the snippet because all snippets were assumed published before if djangocms_versioning_config_enabled and djangocms_versioning_installed: - snippet_version = Version.objects.create( + Version.objects.create( created_by=migration_user, - state=DRAFT, + state=PUBLISHED, number=1, object_id=snippet.pk, content_type=snippet_contenttype, ) - # Publish the snippet because all snippets were assumed published before - snippet_version.publish(migration_user) class Migration(migrations.Migration): From a6fb21c2b69f4bbbda2346ef16b918361fd9b88b Mon Sep 17 00:00:00 2001 From: Andrew Aikman Date: Fri, 26 Nov 2021 18:19:57 +0000 Subject: [PATCH 6/8] Fix data migration --- .../migrations/0010_cms4_grouper_version_data_migration.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py b/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py index a90d14ee..17e9ecab 100644 --- a/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py +++ b/djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py @@ -1,4 +1,5 @@ from django.apps import apps as global_apps +from django.conf import settings from django.contrib.contenttypes.management import create_contenttypes from django.db import migrations @@ -24,13 +25,13 @@ def cms4_grouper_version_migration(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') Snippet = apps.get_model('djangocms_snippet', 'Snippet') SnippetGrouper = apps.get_model('djangocms_snippet', 'SnippetGrouper') - User = apps.get_model('auth', 'User') + User = apps.get_model(*settings.AUTH_USER_MODEL.split('.')) snippet_contenttype = ContentType.objects.get(app_label='djangocms_snippet', model='snippet') snippet_queryset = Snippet.objects.all() # Get a migration user to create a version. - if djangocms_versioning_config_enabled and djangocms_versioning_installed: + if djangocms_versioning_config_enabled and djangocms_versioning_installed and len(snippet_queryset): Version = apps.get_model('djangocms_versioning', 'Version') migration_user = User.objects.get(id=DJANGOCMS_SNIPPET_VERSIONING_MIGRATION_USER_ID) From ef55e1c7e0211b4f64d430f0113ce05cd7da73df Mon Sep 17 00:00:00 2001 From: Aiky30 Date: Mon, 29 Nov 2021 17:40:55 +0000 Subject: [PATCH 7/8] Update tests/test_plugins.py Co-authored-by: Adam Murray --- tests/test_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_plugins.py b/tests/test_plugins.py index ceb0967a..4237b3c2 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -227,7 +227,7 @@ def test_correct_versioning_state_draft_snippet_and_page(self): def test_draft_snippet_and_page_live_url_rendering(self): """ - If a page is published with a draft snippet is created + If a page is published with a draft snippet created nothing should be rendered! """ snippet_grouper = SnippetGrouper.objects.create() From 3ba76774e09b560b8d9447632d1df8a5fd5b47ba Mon Sep 17 00:00:00 2001 From: Aiky30 Date: Mon, 29 Nov 2021 17:41:05 +0000 Subject: [PATCH 8/8] Update tests/test_plugins.py Co-authored-by: Adam Murray --- tests/test_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_plugins.py b/tests/test_plugins.py index 4237b3c2..540922ed 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -260,7 +260,7 @@ def test_draft_snippet_and_page_live_url_rendering(self): def test_published_snippet_and_page_live_url_rendering(self): """ - If a page is published with a published snippet is + If a page is published with a published snippet created the snippet should be rendered! """ snippet_grouper = SnippetGrouper.objects.create()