from typing import List, Dict from html import unescape from pydantic import BaseModel, Field, validator from ..core.models import CrudDocument, RichtextMultiline, RichtextSingleline class PartyTemplate(BaseModel): entity_id: str = Field( foreignKey={ "reference": { "resource": "entity", "schema": "Entity", } }, default="" ) part: str def remove_html_tags(text): """Remove html tags from a string""" import re clean = re.compile('<.*?>') return re.sub(clean, '', text) class ProvisionTemplate(CrudDocument): name: str title: str = RichtextSingleline() label: str = "" body: str = RichtextMultiline(size=8) @validator("label", always=True) def generate_label(cls, v, values, **kwargs): return "{} - \"{}\"".format(values['name'], unescape(remove_html_tags(values['title']))) class Settings(CrudDocument.Settings): fulltext_search = ['name', 'title', 'body'] class ProvisionTemplateReference(BaseModel): provision_template_id: str = Field( foreignKey={ "reference": { "resource": "template/provision", "schema": "ProvisionTemplate", "displayedFields": ['title', 'body'] }, }, props={"parametrized": True} ) class DictionaryEntry(BaseModel): key: str value: str = "" class ContractTemplate(CrudDocument): name: str parties: List[PartyTemplate] = [] provisions: List[ProvisionTemplateReference] = Field( default=[], props={"items-per-row": "1", "numbered": True} ) variables: List[DictionaryEntry] = Field( default=[], format="dictionary", )