from typing import List, Optional from html import unescape from beanie import PydanticObjectId from pydantic import BaseModel, Field from firm.core.models import CrudDocument, RichtextMultiline, RichtextSingleline, DictionaryEntry, ForeignKey from firm.core.filter import Filter, FilterSchema class PartyTemplate(BaseModel): 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") 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 = ForeignKey( "templates/provisions", "TemplateProvision", ['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"]