import datetime from typing import List from beanie import PydanticObjectId from pydantic import BaseModel, Field from firm.contract.models import ContractDraft, DraftProvision, DraftParty, Contract from firm.entity.models import Entity from firm.core.schemas import Writer, Reader from firm.core.models import DictionaryEntry, ForeignKey class ContractDraftRead(Reader, ContractDraft): pass class ContractDraftCreate(Writer): name: str = Field(title='Nom') title: str = Field(title='Titre') parties: List[DraftParty] = Field(title='Parties') provisions: List[DraftProvision] = Field( props={"items-per-row": "1", "numbered": True}, title='Clauses' ) variables: List[DictionaryEntry] = Field( default=[], props={"display": "dictionary"}, title='Variables' ) async def validate_foreign_key(self, db): for p in self.parties: if p.entity_id: p.entity = await Entity.get(db, p.entity_id) if p.entity is None: raise ValueError class ContractDraftUpdate(ContractDraftCreate): pass class ForeignEntityRead(BaseModel): label: str class Config: title = "Avocat" class PartyRead(BaseModel): signature_affixed: bool = Field(title='Signature apposée?') signature_uuid: str = Field(props={"display": "signature-link"}, title="Lien vers signature") part: str = Field(title='Rôle') entity: ForeignEntityRead = Field(title='Client') class Config: title = "Partie" class ContractRead(Reader, Contract): parties: List[PartyRead] lawyer: ForeignEntityRead class Config: title = "Contrat" class ContractCreate(Writer): date: datetime.date location: str draft_id: PydanticObjectId = ForeignKey(resource="contracts/drafts", schema="ContractDraft") class ContractInit(BaseModel): date: datetime.date location: str lawyer: dict name: str title: str parties: List[dict] provisions: List[dict] class ContractUpdate(BaseModel): pass