flask-website/flask/floritiweb/lib/dynamic_snippet_library.py
2025-05-15 21:16:00 +02:00

133 lines
4.5 KiB
Python

import json, re
from markupsafe import Markup
#from jinja2 import Markup
from werkzeug.exceptions import BadRequest
from importlib import import_module
class DynamicSnippetLibrary:
params_for = None
def __init__(self, root, path,
orig_la=None,
requested_la=None,
found_la=None,
available_la=None,
passed_args={},
passed_data={}
):
self.orig_la = orig_la
self.requested_la = requested_la
self.found_la = found_la
if available_la is None:
self.language_versions_available = []
else:
self.language_versions_available = available_la
self._root = root + '{LA}'
self.path = path
self.params = (passed_args, passed_data, {})
def change_root(self, new_root, strip=None):
m = re.match(r"\w+:", new_root)
mla = '{LA}' in new_root
if m and not mla:
new_root = new_root + '/{LA}'
if strip is None:
strip = new_root
if strip and self.path.startswith(strip):
self.path = self.path[ len(strip) : ]
self._root = new_root if m else self._root + '/' + new_root
return '<!-- Root: ' + self._root + '; orig_la=' + self.orig_la + ' -->'
def root(self, lang=None):
if lang is None:
lang = self.orig_la
if not lang:
return re.sub(r'\{LA\}/?', '', self._root)
else:
return self._root.replace('{LA}', lang)
def i18n(self, **langstr):
for lang in (self.requested_la, self.found_la, 'en', 'de'):
if lang in langstr:
return langstr[lang]
else:
return '???' + lang + '???'
from .snippets.marginews import marginews
from .snippets.img import img
from .snippets.email import email
from .snippets.up import up
from .snippets.snippet import snippet
# {% set ffg, success = DSL.get_form("mailform", ...) %}
# ...
# {{ ffg(name="subject") }}
def get_form(self, module, **initargs):
mod = import_module(re.sub(r"^\.*", "..forms.", module), __name__)
hp = mod.init(self.params[-1],initargs.pop("altfields",{}),initargs.pop("defaults",{}),**initargs)
is_sent = self.params[-1].pop('send',False)
if is_sent:
success = hp.validate_params(self.params[-1])
if success is True:
mod.process(hp)
error = False
else:
success = None
def form_field_generator(returntype, **kwargs):
# Parameterwert annehmen und validieren
field = hp.fields[kwargs["name"]]
if returntype == 'str':
return field.value
elif returntype == 'html':
if not field.is_valid:
error = field.error_msg
else:
error = False
return Markup(field.render(**kwargs) + (f"<span class='error'>{error}</span>" if error else ""))
# HTML-Feld darstellen.
# return MarkupSafe(...)
return form_field_generator, success
def virtuelleAusst(self): # Das ist doch ein Autohandler, oder?
pass
def flatten_meta(self, meta):
if isinstance(meta, dict):
metad = meta
else:
metad = json.loads(meta)
super_meta = metad.pop('', None)
if super_meta is None:
self.meta = metad
if not len(self.language_versions_available) \
and isinstance(metad['title'], dict):
self.language_versions_available = metad['title'].keys()
metad['title'] = self.i18n(**metad['title'])
return metad
super_meta.update(metad)
super_meta = self.flatten_meta(super_meta)
if 'allow_post_data' in super_meta:
for key in super_meta['allow_post_data']:
if key.endswith('+'):
getter = self.params[1].getlist
key = key[:-1]
else:
getter = self.params[1].get
if key in self.params[1]:
self.params[2][key] = getter(key)
if 'allow_url_params' in super_meta:
for key in super_meta['allow_url_params']:
if key.endswith('+'):
getter = self.params[0].getlist
key = key[:-1]
else:
getter = self.params[0].get
self.params[2].setdefault(key, getter(key))
return super_meta