Added template rendering verification on dbtemplate form submission in order to catch errors in edited templates before they are committed. This should prevent server 500 errors when rendering dbtemplate pages. Fixes issue #1113.

- Legacy-Id: 6079
This commit is contained in:
Henrik Levkowetz 2013-08-28 12:50:17 +00:00
parent 84a07d7151
commit d85e0ae2de
5 changed files with 49 additions and 39 deletions

View file

@ -1,10 +1,32 @@
from django import forms
from django.core.exceptions import ValidationError
from django.template import Context
from ietf.dbtemplate.models import DBTemplate
from ietf.dbtemplate.template import PlainTemplate, RSTTemplate, DjangoTemplate
import debug
class DBTemplateForm(forms.ModelForm):
def clean_content(self):
try:
content = self.cleaned_data['content']
debug.show('type(content)')
debug.show('content')
if self.instance.type.slug == 'rst':
return_code = RSTTemplate(content).render(Context({}))
debug.show('return_code')
elif self.instance.type.slug == 'django':
DjangoTemplate(content).render(Context({}))
elif self.instance.type.slug == 'plain':
PlainTemplate(content).render(Context({}))
else:
raise ValidationError("Unexpected DBTemplate.type.slug: %s" % self.type.slug)
except Exception, e:
raise ValidationError(e)
return content
class Meta:
model = DBTemplate
fields = ('content', )

View file

@ -12,33 +12,12 @@ TEMPLATE_TYPES = (
class DBTemplate(models.Model):
path = models.CharField(
max_length=255,
unique=True,
blank=False,
null=False,
)
title = models.CharField(
max_length=255,
blank=False,
null=False,
)
variables = models.TextField(
blank=True,
null=True,
)
type = models.ForeignKey(
DBTemplateTypeName,
)
content = models.TextField(
blank=False,
null=False,
)
group = models.ForeignKey(
Group,
blank=True,
null=True,
)
path = models.CharField( max_length=255, unique=True, blank=False, null=False, )
title = models.CharField( max_length=255, blank=False, null=False, )
variables = models.TextField( blank=True, null=True, )
type = models.ForeignKey( DBTemplateTypeName, )
content = models.TextField( blank=False, null=False, )
group = models.ForeignKey( Group, blank=True, null=True, )
def __unicode__(self):
return self.title

View file

@ -1,6 +1,8 @@
import os
import string
from docutils.core import publish_string
from docutils.utils import SystemMessage
import debug
from django.template import Template as DjangoTemplate, TemplateDoesNotExist, TemplateEncodingError
from django.template.loader import BaseLoader
@ -40,16 +42,23 @@ class RSTTemplate(PlainTemplate):
def render(self, context):
interpolated_string = super(RSTTemplate, self).render(context)
return publish_string(source=interpolated_string,
writer_name='html',
settings_overrides={
'input_encoding': 'unicode',
'output_encoding': 'unicode',
'embed_stylesheet': False,
'xml_declaration': False,
'template': RST_TEMPLATE,
})
try:
return publish_string(source=interpolated_string,
writer_name='html',
settings_overrides={
'input_encoding': 'unicode',
'output_encoding': 'unicode',
'embed_stylesheet': False,
'xml_declaration': False,
'template': RST_TEMPLATE,
'halt_level': 2,
})
except SystemMessage, e:
e.message = e.message.replace('<string>:', 'line ')
args = list(e.args)
args[0] = args[0].replace('<string>:', 'line ')
e.args = tuple(args)
raise e
class Loader(BaseLoader):

View file

@ -678,7 +678,7 @@ class QuestionnaireForm(BaseNomcomForm, forms.ModelForm):
class NomComTemplateForm(BaseNomcomForm, DBTemplateForm):
content = forms.CharField(label="Text", widget=forms.Textarea(attrs={'cols': '120', 'rows':'40', }))
fieldsets = [('Template content', ('content', )), ]

View file

@ -18,7 +18,7 @@
<div class="fieldWidget">
<div id="{{ field.html_name }}_help" class="formHelp"> {{ field.help_text }}</div>
{{ field }}
{{ field.errors }}
<pre>{{ field.errors }}</pre>
</div>
<div class="endfield"></div>
</div>