diff --git a/combo/data/models.py b/combo/data/models.py index 68643774..8ac14fe2 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -45,7 +45,14 @@ from django.db.models.signals import post_delete, post_save, pre_save from django.dispatch import receiver from django.forms import models as model_forms from django.forms.widgets import MediaDefiningClass -from django.template import RequestContext, Template, TemplateDoesNotExist, TemplateSyntaxError, engines +from django.template import ( + RequestContext, + Template, + TemplateDoesNotExist, + TemplateSyntaxError, + VariableDoesNotExist, + engines, +) from django.test.client import RequestFactory from django.utils import timezone from django.utils.encoding import force_text, smart_bytes @@ -660,10 +667,9 @@ class Page(models.Model): context.push(original_context) for key, tplt in (self.extra_variables or {}).items(): try: - template = Template(tplt) - except TemplateSyntaxError: + result[key] = Template(tplt).render(context) + except (TemplateSyntaxError, VariableDoesNotExist): continue - result[key] = template.render(context) return result def get_extra_variables_keys(self): diff --git a/tests/test_public.py b/tests/test_public.py index eedb1e16..ad7bfce5 100644 --- a/tests/test_public.py +++ b/tests/test_public.py @@ -1136,20 +1136,25 @@ def test_page_extra_variables(app): title='Home', slug='page', template_name='standard', - extra_variables={'foo': 'bar', 'bar_id': '{{ 40|add:2 }}'}, + extra_variables={ + 'foo': 'bar', + 'bar_id': '{{ 40|add:2 }}', + 'syntax_error': '{% for %}', + 'variable_error': '{{ "foo"|add:user.email }}', + }, ) cell = JsonCell.objects.create( page=page, url='http://example.net', order=0, placeholder='content', - template_string='XX{{ foo }}YY{{ bar_id }}ZZ', + template_string='XX{{ foo }}YY{{ bar_id }}ZZ{{ baz_user }}AA{{ syntax_error }}BB{{ variable_error }}CC', ) with mock.patch('combo.utils.requests.get') as requests_get: requests_get.return_value = mock.Mock(content='{}', status_code=200) resp = app.get('/page/') - assert '
XXbarYY42ZZ
' in resp + assert '
XXbarYY42ZZAABBCC
' in resp with mock.patch('combo.utils.requests.get') as requests_get: requests_get.return_value = mock.Mock(content='{}', status_code=200) @@ -1159,7 +1164,7 @@ def test_page_extra_variables(app): kwargs={'page_pk': page.pk, 'cell_reference': cell.get_reference()}, ) ) - assert resp.text.strip() == 'XXbarYY42ZZ' + assert resp.text.strip() == 'XXbarYY42ZZAABBCC' # check sub_slug/extra_variables override page.sub_slug = '(?P[a-z]+)'