Translation of UI (german and english)
Bugfix for feeds
- removed categories related and up
- load new books now working
- category random now working
login page is free of non accessible elements
boolean custom column is vivible in UI
books with only with certain languages can be shown
book shelfs can be deleted from UI
Anonymous user view is more resticted
Added browse of series in sidebar
Dependencys in vendor folder are updated to newer versions (licencs files are now present)
Bugfix editing Authors names
Made upload on windows working
This commit is contained in:
Vendored
+60
-38
@@ -21,8 +21,8 @@ from jinja2.lexer import get_lexer, TokenStream
|
||||
from jinja2.parser import Parser
|
||||
from jinja2.nodes import EvalContext
|
||||
from jinja2.optimizer import optimize
|
||||
from jinja2.compiler import generate
|
||||
from jinja2.runtime import Undefined, new_context
|
||||
from jinja2.compiler import generate, CodeGenerator
|
||||
from jinja2.runtime import Undefined, new_context, Context
|
||||
from jinja2.exceptions import TemplateSyntaxError, TemplateNotFound, \
|
||||
TemplatesNotFound, TemplateRuntimeError
|
||||
from jinja2.utils import import_string, LRUCache, Markup, missing, \
|
||||
@@ -90,13 +90,13 @@ def load_extensions(environment, extensions):
|
||||
def _environment_sanity_check(environment):
|
||||
"""Perform a sanity check on the environment."""
|
||||
assert issubclass(environment.undefined, Undefined), 'undefined must ' \
|
||||
'be a subclass of undefined because filters depend on it.'
|
||||
'be a subclass of undefined because filters depend on it.'
|
||||
assert environment.block_start_string != \
|
||||
environment.variable_start_string != \
|
||||
environment.comment_start_string, 'block, variable and comment ' \
|
||||
'start strings must be different'
|
||||
environment.variable_start_string != \
|
||||
environment.comment_start_string, 'block, variable and comment ' \
|
||||
'start strings must be different'
|
||||
assert environment.newline_sequence in ('\r', '\r\n', '\n'), \
|
||||
'newline_sequence set to unknown line ending string.'
|
||||
'newline_sequence set to unknown line ending string.'
|
||||
return environment
|
||||
|
||||
|
||||
@@ -108,16 +108,16 @@ class Environment(object):
|
||||
Modifications on environments after the first template was loaded
|
||||
will lead to surprising effects and undefined behavior.
|
||||
|
||||
Here the possible initialization parameters:
|
||||
Here are the possible initialization parameters:
|
||||
|
||||
`block_start_string`
|
||||
The string marking the begin of a block. Defaults to ``'{%'``.
|
||||
The string marking the beginning of a block. Defaults to ``'{%'``.
|
||||
|
||||
`block_end_string`
|
||||
The string marking the end of a block. Defaults to ``'%}'``.
|
||||
|
||||
`variable_start_string`
|
||||
The string marking the begin of a print statement.
|
||||
The string marking the beginning of a print statement.
|
||||
Defaults to ``'{{'``.
|
||||
|
||||
`variable_end_string`
|
||||
@@ -125,7 +125,7 @@ class Environment(object):
|
||||
``'}}'``.
|
||||
|
||||
`comment_start_string`
|
||||
The string marking the begin of a comment. Defaults to ``'{#'``.
|
||||
The string marking the beginning of a comment. Defaults to ``'{#'``.
|
||||
|
||||
`comment_end_string`
|
||||
The string marking the end of a comment. Defaults to ``'#}'``.
|
||||
@@ -136,7 +136,7 @@ class Environment(object):
|
||||
|
||||
`line_comment_prefix`
|
||||
If given and a string, this will be used as prefix for line based
|
||||
based comments. See also :ref:`line-statements`.
|
||||
comments. See also :ref:`line-statements`.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
|
||||
@@ -180,7 +180,7 @@ class Environment(object):
|
||||
|
||||
`autoescape`
|
||||
If set to true the XML/HTML autoescaping feature is enabled by
|
||||
default. For more details about auto escaping see
|
||||
default. For more details about autoescaping see
|
||||
:class:`~jinja2.utils.Markup`. As of Jinja 2.4 this can also
|
||||
be a callable that is passed the template name and has to
|
||||
return `True` or `False` depending on autoescape should be
|
||||
@@ -193,12 +193,15 @@ class Environment(object):
|
||||
The template loader for this environment.
|
||||
|
||||
`cache_size`
|
||||
The size of the cache. Per default this is ``50`` which means
|
||||
that if more than 50 templates are loaded the loader will clean
|
||||
The size of the cache. Per default this is ``400`` which means
|
||||
that if more than 400 templates are loaded the loader will clean
|
||||
out the least recently used template. If the cache size is set to
|
||||
``0`` templates are recompiled all the time, if the cache size is
|
||||
``-1`` the cache will not be cleaned.
|
||||
|
||||
.. versionchanged:: 2.8
|
||||
The cache size was increased to 400 from a low 50.
|
||||
|
||||
`auto_reload`
|
||||
Some loaders load templates from locations where the template
|
||||
sources may change (ie: file system or database). If
|
||||
@@ -235,6 +238,14 @@ class Environment(object):
|
||||
exception_handler = None
|
||||
exception_formatter = None
|
||||
|
||||
#: the class that is used for code generation. See
|
||||
#: :class:`~jinja2.compiler.CodeGenerator` for more information.
|
||||
code_generator_class = CodeGenerator
|
||||
|
||||
#: the context class thatis used for templates. See
|
||||
#: :class:`~jinja2.runtime.Context` for more information.
|
||||
context_class = Context
|
||||
|
||||
def __init__(self,
|
||||
block_start_string=BLOCK_START_STRING,
|
||||
block_end_string=BLOCK_END_STRING,
|
||||
@@ -254,7 +265,7 @@ class Environment(object):
|
||||
finalize=None,
|
||||
autoescape=False,
|
||||
loader=None,
|
||||
cache_size=50,
|
||||
cache_size=400,
|
||||
auto_reload=True,
|
||||
bytecode_cache=None):
|
||||
# !!Important notice!!
|
||||
@@ -330,7 +341,7 @@ class Environment(object):
|
||||
loader=missing, cache_size=missing, auto_reload=missing,
|
||||
bytecode_cache=missing):
|
||||
"""Create a new overlay environment that shares all the data with the
|
||||
current environment except of cache and the overridden attributes.
|
||||
current environment except for cache and the overridden attributes.
|
||||
Extensions cannot be removed for an overlayed environment. An overlayed
|
||||
environment automatically gets all the extensions of the environment it
|
||||
is linked to plus optional extra extensions.
|
||||
@@ -411,7 +422,7 @@ class Environment(object):
|
||||
func = self.filters.get(name)
|
||||
if func is None:
|
||||
raise TemplateRuntimeError('no filter named %r' % name)
|
||||
args = list(args or ())
|
||||
args = [value] + list(args or ())
|
||||
if getattr(func, 'contextfilter', False):
|
||||
if context is None:
|
||||
raise TemplateRuntimeError('Attempted to invoke context '
|
||||
@@ -426,7 +437,7 @@ class Environment(object):
|
||||
args.insert(0, eval_ctx)
|
||||
elif getattr(func, 'environmentfilter', False):
|
||||
args.insert(0, self)
|
||||
return func(value, *args, **(kwargs or {}))
|
||||
return func(*args, **(kwargs or {}))
|
||||
|
||||
def call_test(self, name, value, args=None, kwargs=None):
|
||||
"""Invokes a test on a value the same way the compiler does it.
|
||||
@@ -551,7 +562,7 @@ class Environment(object):
|
||||
return self._compile(source, filename)
|
||||
except TemplateSyntaxError:
|
||||
exc_info = sys.exc_info()
|
||||
self.handle_exception(exc_info, source_hint=source)
|
||||
self.handle_exception(exc_info, source_hint=source_hint)
|
||||
|
||||
def compile_expression(self, source, undefined_to_none=True):
|
||||
"""A handy helper method that returns a callable that accepts keyword
|
||||
@@ -603,8 +614,8 @@ class Environment(object):
|
||||
ignore_errors=True, py_compile=False):
|
||||
"""Finds all the templates the loader can find, compiles them
|
||||
and stores them in `target`. If `zip` is `None`, instead of in a
|
||||
zipfile, the templates will be will be stored in a directory.
|
||||
By default a deflate zip algorithm is used, to switch to
|
||||
zipfile, the templates will be stored in a directory.
|
||||
By default a deflate zip algorithm is used. To switch to
|
||||
the stored algorithm, `zip` can be set to ``'stored'``.
|
||||
|
||||
`extensions` and `filter_func` are passed to :meth:`list_templates`.
|
||||
@@ -634,7 +645,8 @@ class Environment(object):
|
||||
warn(Warning('py_compile has no effect on pypy or Python 3'))
|
||||
py_compile = False
|
||||
else:
|
||||
import imp, marshal
|
||||
import imp
|
||||
import marshal
|
||||
py_header = imp.get_magic() + \
|
||||
u'\xff\xff\xff\xff'.encode('iso-8859-15')
|
||||
|
||||
@@ -716,7 +728,7 @@ class Environment(object):
|
||||
filter_func = lambda x: '.' in x and \
|
||||
x.rsplit('.', 1)[1] in extensions
|
||||
if filter_func is not None:
|
||||
x = ifilter(filter_func, x)
|
||||
x = list(ifilter(filter_func, x))
|
||||
return x
|
||||
|
||||
def handle_exception(self, exc_info=None, rendered=False, source_hint=None):
|
||||
@@ -757,14 +769,23 @@ class Environment(object):
|
||||
def _load_template(self, name, globals):
|
||||
if self.loader is None:
|
||||
raise TypeError('no loader for this environment specified')
|
||||
try:
|
||||
# use abs path for cache key
|
||||
cache_key = self.loader.get_source(self, name)[1]
|
||||
except RuntimeError:
|
||||
# if loader does not implement get_source()
|
||||
cache_key = None
|
||||
# if template is not file, use name for cache key
|
||||
if cache_key is None:
|
||||
cache_key = name
|
||||
if self.cache is not None:
|
||||
template = self.cache.get(name)
|
||||
if template is not None and (not self.auto_reload or \
|
||||
template = self.cache.get(cache_key)
|
||||
if template is not None and (not self.auto_reload or
|
||||
template.is_up_to_date):
|
||||
return template
|
||||
template = self.loader.load(self, name, globals)
|
||||
if self.cache is not None:
|
||||
self.cache[name] = template
|
||||
self.cache[cache_key] = template
|
||||
return template
|
||||
|
||||
@internalcode
|
||||
@@ -866,13 +887,12 @@ class Template(object):
|
||||
and compatible settings.
|
||||
|
||||
>>> template = Template('Hello {{ name }}!')
|
||||
>>> template.render(name='John Doe')
|
||||
u'Hello John Doe!'
|
||||
|
||||
>>> template.render(name='John Doe') == u'Hello John Doe!'
|
||||
True
|
||||
>>> stream = template.stream(name='John Doe')
|
||||
>>> stream.next()
|
||||
u'Hello John Doe!'
|
||||
>>> stream.next()
|
||||
>>> next(stream) == u'Hello John Doe!'
|
||||
True
|
||||
>>> next(stream)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
StopIteration
|
||||
@@ -1019,10 +1039,10 @@ class Template(object):
|
||||
exported template variables from the Python layer:
|
||||
|
||||
>>> t = Template('{% macro foo() %}42{% endmacro %}23')
|
||||
>>> unicode(t.module)
|
||||
u'23'
|
||||
>>> t.module.foo()
|
||||
u'42'
|
||||
>>> str(t.module)
|
||||
'23'
|
||||
>>> t.module.foo() == u'42'
|
||||
True
|
||||
"""
|
||||
if self._module is not None:
|
||||
return self._module
|
||||
@@ -1131,7 +1151,9 @@ class TemplateStream(object):
|
||||
"""
|
||||
close = False
|
||||
if isinstance(fp, string_types):
|
||||
fp = open(fp, encoding is None and 'w' or 'wb')
|
||||
if encoding is None:
|
||||
encoding = 'utf-8'
|
||||
fp = open(fp, 'wb')
|
||||
close = True
|
||||
try:
|
||||
if encoding is not None:
|
||||
|
||||
Reference in New Issue
Block a user