diff options
-rw-r--r-- | fietsboek/templates/edit_form.jinja2 | 16 | ||||
-rw-r--r-- | fietsboek/transformers/__init__.py | 34 |
2 files changed, 36 insertions, 14 deletions
diff --git a/fietsboek/templates/edit_form.jinja2 b/fietsboek/templates/edit_form.jinja2 index 8f6e092..1abe076 100644 --- a/fietsboek/templates/edit_form.jinja2 +++ b/fietsboek/templates/edit_form.jinja2 @@ -169,9 +169,9 @@ <!-- Parameters as defined by the transformer --> {% if params is not none %} - {{ transformer.parameter_model().parse_obj(params).html_ui("transformer[{}][%%]".format(transformer.identifier())) }} + {{ render_parameters(transformer.identifier(), transformer.parameter_model().parse_obj(params).html_ui()) }} {% else %} - {{ transformer().parameters.html_ui("transformer[{}][%%]".format(transformer.identifier())) }} + {{ render_parameters(transformer.identifier(), transformer().parameters.html_ui()) }} {% endif %} </div> </div> @@ -179,3 +179,15 @@ </div> </div> {% endmacro %} + +{% macro render_parameters(identifier, params) %} +{% for param in params %} +{% if param.type == "int" %} +<label for="transformer[{{ identifier }}][{{ param.name }}" class="form-label">{{ _(param.label) }}</label> +<input id="transformer[{{ identifier }}][{{ param.name }}]" name="transformer[{{ identifier }}][{{ param.name }}]" type="number" value="{{ param.value }}" class="form-control" /> +{% elif param.type == "str" %} +<label for="transformer[{{ identifier }}][{{ param.name }}" class="form-label">{{ _(param.label) }}</label> +<input id="transformer[{{ identifier }}][{{ param.name }}]" name="transformer[{{ identifier }}][{{ param.name }}]" type="text" value="{{ param.value }}" class="form-control" /> +{% endif %} +{% endfor %} +{% endmacro %} diff --git a/fietsboek/transformers/__init__.py b/fietsboek/transformers/__init__.py index 1f084a0..f3afb57 100644 --- a/fietsboek/transformers/__init__.py +++ b/fietsboek/transformers/__init__.py @@ -12,10 +12,9 @@ function to load and apply transformers. from abc import ABC, abstractmethod from collections.abc import Mapping from itertools import chain, islice -from typing import TypeVar +from typing import Literal, NamedTuple, TypeVar from gpxpy.gpx import GPX -from markupsafe import Markup from pydantic import BaseModel from pyramid.i18n import TranslationString from pyramid.request import Request @@ -25,6 +24,25 @@ _ = TranslationString T = TypeVar("T", bound="Transformer") +class ParameterDefinition(NamedTuple): + """A parameter definition for the UI to render.""" + + type: Literal["int", "str"] + """Type of the parameter.""" + + name: str + """Name of the parameter. + + This is the machine-readable identifier, not the human readable name. + """ + + label: TranslationString + """Human-readable label of the parameter.""" + + value: str + """The serialized value of the parameter.""" + + class Parameters(BaseModel): """Parameters for a transformer. @@ -32,26 +50,18 @@ class Parameters(BaseModel): parameters to be serialized from and to POST request parameters. """ - def html_ui(self, name_template: str) -> Markup: + def html_ui(self) -> list[ParameterDefinition]: """Renders a HTML UI for this parameter set. - :param name_template: The template for the HTML form element names, - with a %% placeholder for the parameter name. :return: The rendered UI, ready for inclusion. """ - # TODO: Implement this based on the model's fields - # This is probably done better in the actual template, we shouldn't - # return Markup straight away. - # Also think of the localization. - return Markup() + return [] def read_from_request(self, data: Mapping[str, str]): """Parses the parameters from the given request data. - :param prefix: The prefix of the input parameter names. :param data: The request data, e.g. from the POST values. """ - # TODO: Implement parsing class Transformer(ABC): |