Phasing out Pydantic v1's class Config

This commit is contained in:
2025-05-03 22:28:41 +02:00
parent 90a46ada2d
commit a9e9f97c14
7 changed files with 45 additions and 66 deletions

View File

@@ -4,7 +4,7 @@ from enum import Enum
from uuid import UUID from uuid import UUID
from beanie import PydanticObjectId from beanie import PydanticObjectId
from pydantic import BaseModel, Field from pydantic import BaseModel, Field, ConfigDict
from pydantic.json_schema import SkipJsonSchema from pydantic.json_schema import SkipJsonSchema
from firm.core.models import CrudDocument, RichtextSingleline, RichtextMultiline, DictionaryEntry, ForeignKey from firm.core.models import CrudDocument, RichtextSingleline, RichtextMultiline, DictionaryEntry, ForeignKey
@@ -27,13 +27,13 @@ class ContractDraftStatus(str, Enum):
class DraftParty(BaseModel): class DraftParty(BaseModel):
model_config = ConfigDict(title='Partie')
entity_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Partie") entity_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Partie")
part: str = Field(title="Rôle") part: str = Field(title="Rôle")
representative_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Représentant") representative_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Représentant")
entity: SkipJsonSchema[Entity] = Field(default=None, exclude=True, ) entity: SkipJsonSchema[Entity] = Field(default=None, exclude=True, )
class Config:
title = 'Partie'
class Party(BaseModel): class Party(BaseModel):
@@ -49,15 +49,16 @@ class ContractProvisionType(Enum):
template = 'template' template = 'template'
class ProvisionGenuine(BaseModel): class ProvisionGenuine(BaseModel):
model_config = ConfigDict(title='Clause personalisée')
type: Literal['genuine'] = ContractProvisionType.genuine type: Literal['genuine'] = ContractProvisionType.genuine
title: str = RichtextSingleline(props={"parametrized": True}, default="", title="Titre") title: str = RichtextSingleline(props={"parametrized": True}, default="", title="Titre")
body: str = RichtextMultiline(props={"parametrized": True}, default="", title="Corps") body: str = RichtextMultiline(props={"parametrized": True}, default="", title="Corps")
class Config:
title = 'Clause personalisée'
class ContractProvisionTemplateReference(BaseModel): class ContractProvisionTemplateReference(BaseModel):
model_config = ConfigDict(title='Template de clause')
type: Literal['template'] = ContractProvisionType.template type: Literal['template'] = ContractProvisionType.template
provision_template_id: PydanticObjectId = ForeignKey( provision_template_id: PydanticObjectId = ForeignKey(
"templates/provisions", "templates/provisions",
@@ -68,15 +69,11 @@ class ContractProvisionTemplateReference(BaseModel):
title="Template de clause" title="Template de clause"
) )
class Config:
title = 'Template de clause'
class DraftProvision(BaseModel): class DraftProvision(BaseModel):
provision: ContractProvisionTemplateReference | ProvisionGenuine = Field(..., discriminator='type') model_config = ConfigDict(title='Clause')
class Config: provision: ContractProvisionTemplateReference | ProvisionGenuine = Field(..., discriminator='type')
title = 'Clause'
class Provision(BaseModel): class Provision(BaseModel):
@@ -91,6 +88,7 @@ class ContractDraft(CrudDocument):
""" """
Brouillon de contrat à remplir Brouillon de contrat à remplir
""" """
model_config = ConfigDict(title='Brouillon de contrat')
name: str = Field(title="Nom") name: str = Field(title="Nom")
title: str = Field(title="Titre") title: str = Field(title="Titre")
@@ -109,9 +107,6 @@ class ContractDraft(CrudDocument):
hour=0, minute=0, second=0) hour=0, minute=0, second=0)
} }
class Config:
title = 'Brouillon de contrat'
async def check_is_ready(self, db): async def check_is_ready(self, db):
if self.status == ContractDraftStatus.published: if self.status == ContractDraftStatus.published:
return return

View File

@@ -2,7 +2,7 @@ import datetime
from typing import List from typing import List
from beanie import PydanticObjectId from beanie import PydanticObjectId
from pydantic import BaseModel, Field from pydantic import BaseModel, Field, ConfigDict
from firm.contract.models import ContractDraft, DraftProvision, DraftParty, Contract from firm.contract.models import ContractDraft, DraftProvision, DraftParty, Contract
@@ -42,32 +42,29 @@ class ContractDraftUpdate(ContractDraftCreate):
class ForeignEntityRead(BaseModel): class ForeignEntityRead(BaseModel):
label: str model_config = ConfigDict(title='Avocat')
class Config: label: str
title = "Avocat"
class PartyRead(BaseModel): class PartyRead(BaseModel):
model_config = ConfigDict(title='Partie')
signature_affixed: bool = Field(title='Signature apposée?') signature_affixed: bool = Field(title='Signature apposée?')
signature_uuid: str = Field(props={"display": "signature-link"}, title="Lien vers signature") signature_uuid: str = Field(props={"display": "signature-link"}, title="Lien vers signature")
part: str = Field(title='Rôle') part: str = Field(title='Rôle')
entity: ForeignEntityRead = Field(title='Client') entity: ForeignEntityRead = Field(title='Client')
class Config:
title = "Partie"
class ContractRead(Reader, Contract): class ContractRead(Reader, Contract):
model_config = ConfigDict(title='Contrat')
parties: List[PartyRead] = Field( parties: List[PartyRead] = Field(
props={"items_per_row": "2"}, props={"items_per_row": "2"},
title='Parties' title='Parties'
) )
lawyer: ForeignEntityRead lawyer: ForeignEntityRead
class Config:
title = "Contrat"
class ContractCreate(Writer): class ContractCreate(Writer):
date: datetime.date date: datetime.date

View File

@@ -1,7 +1,7 @@
from datetime import date, datetime from datetime import date, datetime
from typing import List, Literal, Optional from typing import List, Literal, Optional
from pydantic import Field, BaseModel from pydantic import Field, BaseModel, ConfigDict
from beanie import Indexed, PydanticObjectId from beanie import Indexed, PydanticObjectId
from firm.core.models import CrudDocument, ForeignKey from firm.core.models import CrudDocument, ForeignKey
@@ -15,6 +15,8 @@ class EntityType(BaseModel):
class Individual(EntityType): class Individual(EntityType):
model_config = ConfigDict(title='Particulier')
type: Literal['individual'] = 'individual' type: Literal['individual'] = 'individual'
firstname: Indexed(str) = Field(title='Prénom') firstname: Indexed(str) = Field(title='Prénom')
middlename: Indexed(str) = Field(default="", title='Autres prénoms') middlename: Indexed(str) = Field(default="", title='Autres prénoms')
@@ -33,39 +35,35 @@ class Individual(EntityType):
# return '{} "{}" {}'.format(self.firstname, self.surnames[0], self.lastname) # return '{} "{}" {}'.format(self.firstname, self.surnames[0], self.lastname)
return f"{self.firstname} {self.lastname}" return f"{self.firstname} {self.lastname}"
class Config:
title = 'Particulier'
class Employee(BaseModel): class Employee(BaseModel):
model_config = ConfigDict(title='Fiche Employé')
position: Indexed(str) = Field(title='Poste') position: Indexed(str) = Field(title='Poste')
entity_id: PydanticObjectId = ForeignKey("entities", "Entity", title='Employé') entity_id: PydanticObjectId = ForeignKey("entities", "Entity", title='Employé')
class Config:
title = 'Fiche Employé'
class Corporation(EntityType): class Corporation(EntityType):
model_config = ConfigDict(title='Entreprise')
type: Literal['corporation'] = 'corporation' type: Literal['corporation'] = 'corporation'
title: Indexed(str) = Field(title='Dénomination sociale') title: Indexed(str) = Field(title='Dénomination sociale')
activity: Indexed(str) = Field(title='Activité') activity: Indexed(str) = Field(title='Activité')
employees: List[Employee] = Field(default=[], title='Employés') employees: List[Employee] = Field(default=[], title='Employés')
class Config:
title = 'Entreprise'
class Institution(Corporation): class Institution(Corporation):
type: Literal['institution'] = 'institution' model_config = ConfigDict(title='Institution')
class Config: type: Literal['institution'] = 'institution'
title = 'Institution'
class Entity(CrudDocument): class Entity(CrudDocument):
""" """
Fiche d'un client Fiche d'un client
""" """
model_config = ConfigDict(title='Client')
entity_data: Individual | Corporation | Institution = Field(..., discriminator='type') entity_data: Individual | Corporation | Institution = Field(..., discriminator='type')
address: str = Field(default="", title='Adresse') address: str = Field(default="", title='Adresse')
@@ -83,9 +81,6 @@ class Entity(CrudDocument):
hour=0, minute=0, second=0) hour=0, minute=0, second=0)
} }
class Config:
title = 'Client'
class EntityFilters(FilterSchema): class EntityFilters(FilterSchema):
class Constants(Filter.Constants): class Constants(Filter.Constants):

View File

@@ -1,4 +1,4 @@
from pydantic import Field from pydantic import Field, ConfigDict
from firm.entity.models import Entity, Institution, Individual, Corporation from firm.entity.models import Entity, Institution, Individual, Corporation
from firm.core.schemas import Writer, Reader from firm.core.schemas import Writer, Reader
@@ -7,12 +7,11 @@ class EntityRead(Reader, Entity):
pass pass
class EntityCreate(Writer): class EntityCreate(Writer):
model_config = ConfigDict(title="Création d'un client")
entity_data: Individual | Corporation | Institution = Field(..., discriminator='type') entity_data: Individual | Corporation | Institution = Field(..., discriminator='type')
address: str = Field(default="", title='Adresse') address: str = Field(default="", title='Adresse')
class Config:
title = "Création d'un client"
class EntityIndividualCreate(EntityCreate): class EntityIndividualCreate(EntityCreate):
entity_data: Individual entity_data: Individual

View File

@@ -2,20 +2,19 @@ from typing import List, Optional
from html import unescape from html import unescape
from beanie import PydanticObjectId from beanie import PydanticObjectId
from pydantic import BaseModel, Field from pydantic import BaseModel, Field, ConfigDict
from firm.core.models import CrudDocument, RichtextMultiline, RichtextSingleline, DictionaryEntry, ForeignKey from firm.core.models import CrudDocument, RichtextMultiline, RichtextSingleline, DictionaryEntry, ForeignKey
from firm.core.filter import Filter, FilterSchema from firm.core.filter import Filter, FilterSchema
class PartyTemplate(BaseModel): class PartyTemplate(BaseModel):
model_config = ConfigDict(title="Partie")
entity_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Partie") entity_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Partie")
part: str = Field(title="Rôle") part: str = Field(title="Rôle")
representative_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Représentant") representative_id: Optional[PydanticObjectId] = ForeignKey("entities", "Entity", default=None, title="Représentant")
class Config:
title = 'Partie'
def remove_html_tags(text): def remove_html_tags(text):
"""Remove html tags from a string""" """Remove html tags from a string"""
@@ -28,6 +27,7 @@ class ProvisionTemplate(CrudDocument):
""" """
Modèle de clause à décliner Modèle de clause à décliner
""" """
model_config = ConfigDict(title="Template de clause")
name: str = Field(title="Nom") name: str = Field(title="Nom")
title: str = RichtextSingleline(title="Titre") title: str = RichtextSingleline(title="Titre")
@@ -39,11 +39,10 @@ class ProvisionTemplate(CrudDocument):
class Settings(CrudDocument.Settings): class Settings(CrudDocument.Settings):
fulltext_search = ['name', 'title', 'body'] fulltext_search = ['name', 'title', 'body']
class Config:
title = 'Template de clause'
class ProvisionTemplateReference(BaseModel): class ProvisionTemplateReference(BaseModel):
model_config = ConfigDict(title="Clause")
provision_template_id: PydanticObjectId = ForeignKey( provision_template_id: PydanticObjectId = ForeignKey(
"templates/provisions", "templates/provisions",
"TemplateProvision", "TemplateProvision",
@@ -52,14 +51,13 @@ class ProvisionTemplateReference(BaseModel):
title="Template de clause" title="Template de clause"
) )
class Config:
title = 'Clause'
class ContractTemplate(CrudDocument): class ContractTemplate(CrudDocument):
""" """
Modèle de contrat à décliner Modèle de contrat à décliner
""" """
model_config = ConfigDict(title="Template de contrat")
name: str = Field(title="Nom") name: str = Field(title="Nom")
title: str = Field(title="Titre") title: str = Field(title="Titre")
parties: List[PartyTemplate] = Field(default=[], title="Parties") parties: List[PartyTemplate] = Field(default=[], title="Parties")
@@ -72,9 +70,6 @@ class ContractTemplate(CrudDocument):
class Settings(CrudDocument.Settings): class Settings(CrudDocument.Settings):
fulltext_search = ['name', 'title'] fulltext_search = ['name', 'title']
class Config:
title = 'Template de contrat'
class ContractTemplateFilters(FilterSchema): class ContractTemplateFilters(FilterSchema):
class Constants(Filter.Constants): class Constants(Filter.Constants):

View File

@@ -1,4 +1,4 @@
from pydantic import Field from pydantic import Field, ConfigDict
from typing import List from typing import List
from firm.template.models import ContractTemplate, ProvisionTemplate, PartyTemplate, ProvisionTemplateReference, DictionaryEntry from firm.template.models import ContractTemplate, ProvisionTemplate, PartyTemplate, ProvisionTemplateReference, DictionaryEntry
@@ -11,6 +11,8 @@ class ContractTemplateRead(Reader, ContractTemplate):
class ContractTemplateCreate(Writer): class ContractTemplateCreate(Writer):
model_config = ConfigDict(title="Template de Contrat")
name: str = Field(title="Nom") name: str = Field(title="Nom")
title: str = Field(title="Titre") title: str = Field(title="Titre")
parties: List[PartyTemplate] = Field( parties: List[PartyTemplate] = Field(
@@ -28,9 +30,6 @@ class ContractTemplateCreate(Writer):
title="Variables" title="Variables"
) )
class Config:
title = 'Template de Contrat'
class ContractTemplateUpdate(ContractTemplateCreate): class ContractTemplateUpdate(ContractTemplateCreate):
pass pass
@@ -41,13 +40,12 @@ class ProvisionTemplateRead(Reader, ProvisionTemplate):
class ProvisionTemplateCreate(Writer): class ProvisionTemplateCreate(Writer):
model_config = ConfigDict(title="Template de Clause")
name: str = Field(title="Nom") name: str = Field(title="Nom")
title: str = RichtextSingleline(title="Titre") title: str = RichtextSingleline(title="Titre")
body: str = RichtextMultiline(title="Corps") body: str = RichtextMultiline(title="Corps")
class Config:
title = 'Template de Clause'
class ProvisionTemplateUpdate(ProvisionTemplateCreate): class ProvisionTemplateUpdate(ProvisionTemplateCreate):
pass pass

View File

@@ -229,7 +229,7 @@
"resource_plural": "Contract Templates" "resource_plural": "Contract Templates"
}, },
"party_template": { "party_template": {
"entity_id": "Party Template", "entity_id": "Entity",
"representative_id": "Representative", "representative_id": "Representative",
"part": "Part", "part": "Part",
"resource_title": "Party" "resource_title": "Party"