1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez# -*- coding: utf-8 -*- 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez""" 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez jinja2.exceptions 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ~~~~~~~~~~~~~~~~~ 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Jinja exceptions. 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez :copyright: (c) 2010 by the Jinja Team. 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez :license: BSD, see LICENSE for more details. 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez""" 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezfrom jinja2._compat import imap, text_type, PY2, implements_to_string 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateError(Exception): 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """Baseclass for all template errors.""" 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if PY2: 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def __init__(self, message=None): 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if message is not None: 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message = text_type(message).encode('utf-8') 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Exception.__init__(self, message) 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @property 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def message(self): 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if self.args: 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message = self.args[0] 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if message is not None: 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return message.decode('utf-8', 'replace') 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def __unicode__(self): 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return self.message or u'' 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez else: 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def __init__(self, message=None): 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Exception.__init__(self, message) 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @property 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def message(self): 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if self.args: 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message = self.args[0] 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if message is not None: 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return message 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez@implements_to_string 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateNotFound(IOError, LookupError, TemplateError): 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """Raised if a template does not exist.""" 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez # looks weird, but removes the warning descriptor that just 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez # bogusly warns us about message being deprecated 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message = None 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def __init__(self, name, message=None): 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IOError.__init__(self) 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if message is None: 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message = name 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.message = message 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.name = name 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.templates = [name] 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def __str__(self): 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return self.message 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplatesNotFound(TemplateNotFound): 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """Like :class:`TemplateNotFound` but raised if multiple templates 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez are selected. This is a subclass of :class:`TemplateNotFound` 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez exception, so just catching the base exception will catch both. 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez .. versionadded:: 2.2 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """ 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def __init__(self, names=(), message=None): 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if message is None: 74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message = u'none of the templates given were found: ' + \ 75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez u', '.join(imap(text_type, names)) 76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez TemplateNotFound.__init__(self, names and names[-1] or None, message) 77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.templates = list(names) 78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez@implements_to_string 81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateSyntaxError(TemplateError): 82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """Raised to tell the user that there is a problem with the template.""" 83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def __init__(self, message, lineno, name=None, filename=None): 85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez TemplateError.__init__(self, message) 86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.lineno = lineno 87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.name = name 88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.filename = filename 89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.source = None 90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez # this is set to True if the debug.translate_syntax_error 92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez # function translated the syntax error into a new traceback 93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez self.translated = False 94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez def __str__(self): 96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez # for translated errors we only return the message 97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if self.translated: 98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return self.message 99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez # otherwise attach some stuff 101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez location = 'line %d' % self.lineno 102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez name = self.filename or self.name 103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if name: 104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez location = 'File "%s", %s' % (name, location) 105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez lines = [self.message, ' ' + location] 106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez # if the source is set, add the line to the output 108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if self.source is not None: 109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez try: 110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez line = self.source.splitlines()[self.lineno - 1] 111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez except IndexError: 112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez line = None 113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if line: 114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez lines.append(' ' + line.strip()) 115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return u'\n'.join(lines) 117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateAssertionError(TemplateSyntaxError): 120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """Like a template syntax error, but covers cases where something in the 121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez template caused an error at compile time that wasn't necessarily caused 122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez by a syntax error. However it's a direct subclass of 123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez :exc:`TemplateSyntaxError` and has the same attributes. 124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """ 125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateRuntimeError(TemplateError): 128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """A generic runtime error in the template engine. Under some situations 129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Jinja may raise this exception. 130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """ 131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass UndefinedError(TemplateRuntimeError): 134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """Raised if a template tries to operate on :class:`Undefined`.""" 135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass SecurityError(TemplateRuntimeError): 138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """Raised if a template tries to do something insecure if the 139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sandbox is enabled. 140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """ 141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass FilterArgumentError(TemplateRuntimeError): 144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """This error is raised if a filter was called with inappropriate 145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez arguments 146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez """ 147