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 '' 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"{error}" 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