78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
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",
|
|
"TemplateProvision",
|
|
['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"]
|