from typing import List, Optional from html import unescape from pydantic import BaseModel, Field from ..core.models import CrudDocument, RichtextMultiline, RichtextSingleline, DictionaryEntry from ..core.filter import Filter, FilterSchema class PartyTemplate(BaseModel): entity_id: str = Field( foreignKey={ "reference": { "resource": "entity", "schema": "Entity", } }, default="", title="Partie" ) part: str = Field(title="Rôle") representative_id: str = Field( foreignKey={ "reference": { "resource": "entity", "schema": "Entity", } }, default="", title="Représentant" ) class Config: title = 'Partie' def remove_html_tags(text): """Remove html tags from a string""" import re clean = re.compile('<.*?>') return re.sub(clean, '', text) class ProvisionTemplate(CrudDocument): """ Modèle de clause à décliner """ name: str = Field(title="Nom") title: str = RichtextSingleline(title="Titre") body: str = RichtextMultiline(title="Corps") def compute_label(self) -> str: return f"{self.name} - \"{unescape(remove_html_tags(self.title))}\"" class Settings(CrudDocument.Settings): fulltext_search = ['name', 'title', 'body'] class Config: title = 'Template de clause' class ProvisionTemplateReference(BaseModel): provision_template_id: str = Field( foreignKey={ "reference": { "resource": "template/provision", "schema": "ProvisionTemplate", "displayedFields": ['title', 'body'] }, }, props={"parametrized": True}, title="Template de clause" ) class Config: title = 'Clause' class ContractTemplate(CrudDocument): """ Modèle de contrat à décliner """ name: str = Field(title="Nom") title: str = Field(title="Titre") parties: List[PartyTemplate] = Field(default=[], title="Parties") provisions: List[ProvisionTemplateReference] = Field( default=[], props={"items-per-row": "1", "numbered": True}, title="Clauses" ) variables: List[DictionaryEntry] = Field( default=[], format="dictionary", title="Variables" ) def compute_label(self) -> str: return f"{self.name} - \"{unescape(remove_html_tags(self.title))}\"" class Settings(CrudDocument.Settings): fulltext_search = ['name', 'title'] class Config: title = 'Template de contrat' class ContractTemplateFilters(FilterSchema): class Constants(Filter.Constants): model = ContractTemplate search_model_fields = ["label"] class ProvisionTemplateFilters(FilterSchema): class Constants(Filter.Constants): model = ProvisionTemplate search_model_fields = ["label"]