from typing import List, Optional from html import unescape from beanie import PydanticObjectId from pydantic import BaseModel, Field, ConfigDict from firm.core.models import CrudDocument, RichtextMultiline, RichtextSingleline, DictionaryEntry, ForeignKey from firm.core.filter import Filter, FilterSchema class PartyTemplate(BaseModel): model_config = ConfigDict(title="Partie") entity_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Partie") part: str = Field(title="Rôle") representative_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Représentant") 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 """ model_config = ConfigDict(title="Template de clause") 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 ProvisionTemplateReference(BaseModel): model_config = ConfigDict(title="Clause") provision_template_id: PydanticObjectId = ForeignKey( "templates/provisions", "ProvisionTemplate", ['title', 'body'], props={"parametrized": True}, title="Template de clause" ) class ContractTemplate(CrudDocument): """ Modèle de contrat à décliner """ model_config = ConfigDict(title="Template de contrat") 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 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"]