from typing import List from html import unescape from beanie import PydanticObjectId from pydantic import BaseModel, Field from firm.core.models import CrudDocument, RichtextMultiline, RichtextSingleline, DictionaryEntry from firm.core.filter import Filter, FilterSchema class PartyTemplate(BaseModel): entity_id: PydanticObjectId = Field( foreignKey={ "reference": { "resource": "entities", "schema": "Entity", } }, default="", title="Partie" ) part: str = Field(title="Rôle") representative_id: PydanticObjectId = Field( foreignKey={ "reference": { "resource": "entities", "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: PydanticObjectId = Field( foreignKey={ "reference": { "resource": "templates/provisions", "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=[], title="Clauses") variables: List[DictionaryEntry] = Field(default=[], 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"]