Files
roleplay-contract/api/rpk-api/firm/template/models.py

89 lines
2.5 KiB
Python

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"]