web2py / py4web

Other
244 stars 126 forks source link

`include <something>` in a template cannot be conditional or excepted when `<something>` does not exist #897

Open kszys opened 1 month ago

kszys commented 1 month ago

I would like to conditionally include elements in my layout. Let's say I have three dynamically assigned templates a, b, and c.

If any of them is not assigned to the actual existing template file, its value is None.

Currently there is no way to include something like that, if any of them is None:

[[ include a ]]
[[ include b ]]
[[ include c ]]

I already tried

[[ if a!=None: ]]
    [[ include a ]]
[[ pass ]]

and also:

[[ try: ]]
    [[ include a ]]
[[ except: ]]
[[ pass ]]

None of which works if a=None and only leads to the very same error (below) nevertheless. Another issue is that this failed gracefully in web2py, and it would be great if this was also the case for py4web.

2024-07-23 21:43:34 [2024-07-23T19:43:34.100502]: Traceback (most recent call last):
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 1040, in wrapper
2024-07-23 21:43:34     ret = func(*func_args, **func_kwargs)
2024-07-23 21:43:34           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 1025, in wrapper
2024-07-23 21:43:34     raise exception
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 1018, in wrapper
2024-07-23 21:43:34     call_f(fixture.on_success, context)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 984, in call_f
2024-07-23 21:43:34     return f(context)
2024-07-23 21:43:34            ^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 624, in on_success
2024-07-23 21:43:34     context["output"] = render(
2024-07-23 21:43:34                         ^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 586, in render
2024-07-23 21:43:34     return engine.render(filename, context=context)
2024-07-23 21:43:34            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/apis.py", line 215, in render
2024-07-23 21:43:34     return self._render(source, file_path, context)
2024-07-23 21:43:34            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/apis.py", line 191, in _render
2024-07-23 21:43:34     code, content = self.parse(file_path, source, context)
2024-07-23 21:43:34                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/apis.py", line 160, in parse
2024-07-23 21:43:34     parser = self.parser_cls(
2024-07-23 21:43:34              ^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 71, in __init__
2024-07-23 21:43:34     self.parse(text)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 177, in parse
2024-07-23 21:43:34     ctx.parse()
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/stack.py", line 240, in parse
2024-07-23 21:43:34     self.parser.parse_python_block(self, element)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 148, in parse_python_block
2024-07-23 21:43:34     self._parse_python_line(ctx, element, line.strip())
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 136, in _parse_python_line
2024-07-23 21:43:34     lexer(ctx, value=value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 28, in __call__
2024-07-23 21:43:34     self.process(ctx, value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 110, in process
2024-07-23 21:43:34     with ctx.load(
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 122, in process
2024-07-23 21:43:34     ctx.parse()
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/stack.py", line 240, in parse
2024-07-23 21:43:34     self.parser.parse_python_block(self, element)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 148, in parse_python_block
2024-07-23 21:43:34     self._parse_python_line(ctx, element, line.strip())
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 136, in _parse_python_line
2024-07-23 21:43:34     lexer(ctx, value=value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 28, in __call__
2024-07-23 21:43:34     self.process(ctx, value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 83, in process
2024-07-23 21:43:34     with ctx(
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 92, in process
2024-07-23 21:43:34     ctx.parse()
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/stack.py", line 240, in parse
2024-07-23 21:43:34     self.parser.parse_python_block(self, element)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 148, in parse_python_block
2024-07-23 21:43:34     self._parse_python_line(ctx, element, line.strip())
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 136, in _parse_python_line
2024-07-23 21:43:34     lexer(ctx, value=value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 28, in __call__
2024-07-23 21:43:34     self.process(ctx, value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 72, in process
2024-07-23 21:43:34     with ctx.load(value, strip_ending_new_line=True):
2024-07-23 21:43:34          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/stack.py", line 160, in load
2024-07-23 21:43:34     name, file_path, preload_params, text = self.parser._get_file_text(
2024-07-23 21:43:34                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 86, in _get_file_text
2024-07-23 21:43:34     if any(filename.startswith(relpath) for relpath in ["./", "../"]):
2024-07-23 21:43:34        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 86, in <genexpr>
2024-07-23 21:43:34     if any(filename.startswith(relpath) for relpath in ["./", "../"]):
2024-07-23 21:43:34            ^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34 AttributeError: 'NoneType' object has no attribute 'startswith'
2024-07-23 21:43:34 
2024-07-23 21:43:34 Traceback (most recent call last):
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 1040, in wrapper
2024-07-23 21:43:34     ret = func(*func_args, **func_kwargs)
2024-07-23 21:43:34           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 1025, in wrapper
2024-07-23 21:43:34     raise exception
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 1018, in wrapper
2024-07-23 21:43:34     call_f(fixture.on_success, context)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 984, in call_f
2024-07-23 21:43:34     return f(context)
2024-07-23 21:43:34            ^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 624, in on_success
2024-07-23 21:43:34     context["output"] = render(
2024-07-23 21:43:34                         ^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/py4web/core.py", line 586, in render
2024-07-23 21:43:34     return engine.render(filename, context=context)
2024-07-23 21:43:34            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/apis.py", line 215, in render
2024-07-23 21:43:34     return self._render(source, file_path, context)
2024-07-23 21:43:34            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/apis.py", line 191, in _render
2024-07-23 21:43:34     code, content = self.parse(file_path, source, context)
2024-07-23 21:43:34                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/apis.py", line 160, in parse
2024-07-23 21:43:34     parser = self.parser_cls(
2024-07-23 21:43:34              ^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 71, in __init__
2024-07-23 21:43:34     self.parse(text)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 177, in parse
2024-07-23 21:43:34     ctx.parse()
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/stack.py", line 240, in parse
2024-07-23 21:43:34     self.parser.parse_python_block(self, element)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 148, in parse_python_block
2024-07-23 21:43:34     self._parse_python_line(ctx, element, line.strip())
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 136, in _parse_python_line
2024-07-23 21:43:34     lexer(ctx, value=value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 28, in __call__
2024-07-23 21:43:34     self.process(ctx, value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 110, in process
2024-07-23 21:43:34     with ctx.load(
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 122, in process
2024-07-23 21:43:34     ctx.parse()
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/stack.py", line 240, in parse
2024-07-23 21:43:34     self.parser.parse_python_block(self, element)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 148, in parse_python_block
2024-07-23 21:43:34     self._parse_python_line(ctx, element, line.strip())
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 136, in _parse_python_line
2024-07-23 21:43:34     lexer(ctx, value=value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 28, in __call__
2024-07-23 21:43:34     self.process(ctx, value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 83, in process
2024-07-23 21:43:34     with ctx(
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 92, in process
2024-07-23 21:43:34     ctx.parse()
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/stack.py", line 240, in parse
2024-07-23 21:43:34     self.parser.parse_python_block(self, element)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 148, in parse_python_block
2024-07-23 21:43:34     self._parse_python_line(ctx, element, line.strip())
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 136, in _parse_python_line
2024-07-23 21:43:34     lexer(ctx, value=value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 28, in __call__
2024-07-23 21:43:34     self.process(ctx, value)
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/lexers.py", line 72, in process
2024-07-23 21:43:34     with ctx.load(value, strip_ending_new_line=True):
2024-07-23 21:43:34          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/stack.py", line 160, in load
2024-07-23 21:43:34     name, file_path, preload_params, text = self.parser._get_file_text(
2024-07-23 21:43:34                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 86, in _get_file_text
2024-07-23 21:43:34     if any(filename.startswith(relpath) for relpath in ["./", "../"]):
2024-07-23 21:43:34        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34   File "/usr/local/lib/python3.12/site-packages/renoir/parsing/parsers.py", line 86, in <genexpr>
2024-07-23 21:43:34     if any(filename.startswith(relpath) for relpath in ["./", "../"]):
2024-07-23 21:43:34            ^^^^^^^^^^^^^^^^^^^
2024-07-23 21:43:34 AttributeError: 'NoneType' object has no attribute 'startswith'