133 lines
4.5 KiB
Python
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
|
|
|
|
|