Skip to content

Commit 7d752e6

Browse files
authored
fix: Draft snippet render error due to draft snippets (#86)
1 parent aa450b3 commit 7d752e6

File tree

7 files changed

+126
-53
lines changed

7 files changed

+126
-53
lines changed

CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
Changelog
33
=========
44

5+
Unreleased
6+
==================
7+
* fix: Error when rendering a Draft Snippet plugin on a Published page
8+
* fix: Publish snippets by default as they were already in that state pre-versioning and cleanup unnecessary migration files before release!
9+
* feat: djangocms-versioning support added, including model restructure and configuration
10+
* feat: django-cms v4.0.x support added
11+
512

613
3.0.0 (2020-09-02)
714
==================

djangocms_snippet/cms_plugins.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ class SnippetPlugin(CMSPluginBase):
2424

2525
def render(self, context, instance, placeholder):
2626
snippet = instance.snippet_grouper.snippet(show_editable=show_draft_content(context["request"]))
27+
28+
# Handle the potential for no snippet to be found i.e. Draft
29+
if not snippet:
30+
return context
31+
2732
try:
2833
if snippet.template:
2934
context = context.flatten()

djangocms_snippet/migrations/0010_cms4_grouper_version_data_migration.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.apps import apps as global_apps
2+
from django.conf import settings
23
from django.contrib.contenttypes.management import create_contenttypes
34
from django.db import migrations
45

@@ -9,7 +10,7 @@
910

1011

1112
try:
12-
from djangocms_versioning.constants import DRAFT
13+
from djangocms_versioning.constants import DRAFT, PUBLISHED
1314

1415
djangocms_versioning_installed = True
1516
except ImportError:
@@ -24,25 +25,28 @@ def cms4_grouper_version_migration(apps, schema_editor):
2425
ContentType = apps.get_model('contenttypes', 'ContentType')
2526
Snippet = apps.get_model('djangocms_snippet', 'Snippet')
2627
SnippetGrouper = apps.get_model('djangocms_snippet', 'SnippetGrouper')
27-
User = apps.get_model('auth', 'User')
28+
User = apps.get_model(*settings.AUTH_USER_MODEL.split('.'))
2829

2930
snippet_contenttype = ContentType.objects.get(app_label='djangocms_snippet', model='snippet')
3031
snippet_queryset = Snippet.objects.all()
3132

33+
# Get a migration user to create a version.
34+
if djangocms_versioning_config_enabled and djangocms_versioning_installed and len(snippet_queryset):
35+
Version = apps.get_model('djangocms_versioning', 'Version')
36+
37+
migration_user = User.objects.get(id=DJANGOCMS_SNIPPET_VERSIONING_MIGRATION_USER_ID)
38+
3239
for snippet in snippet_queryset:
3340
grouper = SnippetGrouper.objects.create()
3441
snippet.snippet_grouper = grouper
3542
snippet.save()
3643

37-
# Get a migration user.
38-
migration_user = User.objects.get(id=DJANGOCMS_SNIPPET_VERSIONING_MIGRATION_USER_ID)
39-
4044
# Create initial Snippet Versions if versioning is enabled and installed.
45+
# Publish the snippet because all snippets were assumed published before
4146
if djangocms_versioning_config_enabled and djangocms_versioning_installed:
42-
Version = apps.get_model('djangocms_versioning', 'Version')
4347
Version.objects.create(
4448
created_by=migration_user,
45-
state=DRAFT,
49+
state=PUBLISHED,
4650
number=1,
4751
object_id=snippet.pk,
4852
content_type=snippet_contenttype,

djangocms_snippet/migrations/0012_auto_20210915_0721.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,26 @@ class Migration(migrations.Migration):
1717
),
1818
migrations.AlterField(
1919
model_name='snippet',
20-
name='snippet_grouper',
21-
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='djangocms_snippet.SnippetGrouper'),
20+
name='name',
21+
field=models.CharField(max_length=255, verbose_name='Name'),
22+
),
23+
migrations.AlterField(
24+
model_name='snippet',
25+
name='slug',
26+
field=models.SlugField(default='', max_length=255, verbose_name='Slug'),
27+
),
28+
migrations.AlterModelOptions(
29+
name='snippet',
30+
options={'verbose_name': 'Snippet', 'verbose_name_plural': 'Snippets'},
2231
),
2332
migrations.AlterField(
2433
model_name='snippetptr',
2534
name='snippet_grouper',
2635
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='djangocms_snippet.SnippetGrouper'),
2736
),
37+
migrations.AlterField(
38+
model_name='snippet',
39+
name='snippet_grouper',
40+
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='djangocms_snippet.SnippetGrouper'),
41+
),
2842
]

djangocms_snippet/migrations/0013_auto_20210915_0751.py

Lines changed: 0 additions & 23 deletions
This file was deleted.

djangocms_snippet/migrations/0014_auto_20211019_0522.py

Lines changed: 0 additions & 17 deletions
This file was deleted.

tests/test_plugins.py

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ def setUp(self):
171171
draft_pagecontent_version = self.pagecontent_version.copy(self.superuser)
172172
self.draft_pagecontent = draft_pagecontent_version.content
173173

174+
def test_correct_versioning_state_published_snippet_and_page(self):
175+
"""
176+
If a page is published, the published snippet should be rendered
177+
"""
174178
# Add plugin to our published page!
175179
add_plugin(
176180
self.pagecontent.placeholders.get(slot="content"),
@@ -186,24 +190,103 @@ def setUp(self):
186190
snippet_grouper=self.draft_snippet.snippet_grouper,
187191
)
188192

189-
def test_correct_versioning_state_published_snippet_and_page(self):
190-
"""
191-
If a page is published, the published snippet should be rendered
192-
"""
193193
# Request for published page
194194
request_url = self.page.get_absolute_url(self.language)
195195
with self.login_user_context(self.superuser):
196196
response = self.client.get(request_url)
197197

198198
self.assertContains(response, "<p>live content</p>")
199+
self.assertNotIn("draft content", str(response.content))
199200

200201
def test_correct_versioning_state_draft_snippet_and_page(self):
201202
"""
202203
If we have a draft, the draft snippet should be rendered.
203204
"""
205+
# Add plugin to our published page!
206+
add_plugin(
207+
self.pagecontent.placeholders.get(slot="content"),
208+
"SnippetPlugin",
209+
self.language,
210+
snippet_grouper=self.snippet.snippet_grouper,
211+
)
212+
# Add plugin to our draft page
213+
add_plugin(
214+
self.draft_pagecontent.placeholders.get(slot="content"),
215+
"SnippetPlugin",
216+
self.language,
217+
snippet_grouper=self.draft_snippet.snippet_grouper,
218+
)
219+
204220
# Request for draft page
205221
request_url = get_object_edit_url(self.draft_pagecontent, "en")
206222
with self.login_user_context(self.superuser):
207223
response = self.client.get(request_url)
208224

209225
self.assertContains(response, "<p>draft content</p>")
226+
self.assertNotIn("live content", str(response.content))
227+
228+
def test_draft_snippet_and_page_live_url_rendering(self):
229+
"""
230+
If a page is published with a draft snippet created
231+
nothing should be rendered!
232+
"""
233+
snippet_grouper = SnippetGrouper.objects.create()
234+
snippet = Snippet.objects.create(
235+
name="plugin_snippet",
236+
html="<p>Draft snippet</p>",
237+
slug="plugin_snippet",
238+
snippet_grouper=snippet_grouper,
239+
)
240+
Version.objects.create(
241+
content=snippet,
242+
created_by=self.superuser,
243+
created=datetime.datetime.now()
244+
)
245+
246+
add_plugin(
247+
self.pagecontent.placeholders.get(slot="content"),
248+
"SnippetPlugin",
249+
self.language,
250+
snippet_grouper=snippet_grouper,
251+
)
252+
253+
request_url = self.page.get_absolute_url(self.language)
254+
with self.login_user_context(self.superuser):
255+
response = self.client.get(request_url)
256+
257+
self.assertEqual(response.status_code, 200)
258+
self.assertNotIn("Draft snippet", str(response.content))
259+
self.assertNotIn("Published snippet", str(response.content))
260+
261+
def test_published_snippet_and_page_live_url_rendering(self):
262+
"""
263+
If a page is published with a published snippet
264+
created the snippet should be rendered!
265+
"""
266+
snippet_grouper = SnippetGrouper.objects.create()
267+
snippet = Snippet.objects.create(
268+
name="plugin_snippet",
269+
html="<p>Published snippet</p>",
270+
slug="plugin_snippet",
271+
snippet_grouper=snippet_grouper,
272+
)
273+
snippet_version = Version.objects.create(
274+
content=snippet,
275+
created_by=self.superuser,
276+
created=datetime.datetime.now()
277+
)
278+
snippet_version.publish(user=self.superuser)
279+
280+
add_plugin(
281+
self.pagecontent.placeholders.get(slot="content"),
282+
"SnippetPlugin",
283+
self.language,
284+
snippet_grouper=snippet_grouper,
285+
)
286+
287+
request_url = self.page.get_absolute_url(self.language)
288+
with self.login_user_context(self.superuser):
289+
response = self.client.get(request_url)
290+
291+
self.assertContains(response, "<p>Published snippet</p>")
292+
self.assertNotIn("Draft snippet", str(response.content))

0 commit comments

Comments
 (0)