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:
parent
84a07d7151
commit
d85e0ae2de
|
@ -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', )
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
|
@ -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', )), ]
|
||||
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue