111 lines
4.1 KiB
Python
111 lines
4.1 KiB
Python
from pydantic import BaseModel, Field, validator
|
|
from typing import Optional, ClassVar
|
|
|
|
|
|
class Contact(BaseModel):
|
|
numero: Optional[str] = Field(None, description="Code du tiers parent (CT_Num)")
|
|
contact_numero: Optional[int] = Field(
|
|
None, description="Numéro unique du contact (CT_No)"
|
|
)
|
|
n_contact: Optional[int] = Field(
|
|
None, description="Numéro de référence contact (N_Contact)"
|
|
)
|
|
|
|
civilite: Optional[str] = Field(
|
|
None, description="Civilité : M., Mme, Mlle (CT_Civilite)"
|
|
)
|
|
nom: Optional[str] = Field(None, description="Nom de famille (CT_Nom)")
|
|
prenom: Optional[str] = Field(None, description="Prénom (CT_Prenom)")
|
|
fonction: Optional[str] = Field(None, description="Fonction/Titre (CT_Fonction)")
|
|
|
|
service_code: Optional[int] = Field(None, description="Code du service (N_Service)")
|
|
|
|
telephone: Optional[str] = Field(None, description="Téléphone fixe (CT_Telephone)")
|
|
portable: Optional[str] = Field(
|
|
None, description="Téléphone mobile (CT_TelPortable)"
|
|
)
|
|
telecopie: Optional[str] = Field(None, description="Fax (CT_Telecopie)")
|
|
email: Optional[str] = Field(None, description="Adresse email (CT_EMail)")
|
|
|
|
facebook: Optional[str] = Field(None, description="Profil Facebook (CT_Facebook)")
|
|
linkedin: Optional[str] = Field(None, description="Profil LinkedIn (CT_LinkedIn)")
|
|
skype: Optional[str] = Field(None, description="Identifiant Skype (CT_Skype)")
|
|
|
|
est_defaut: Optional[bool] = Field(False, description="Contact par défaut")
|
|
|
|
civilite_map: ClassVar[dict] = {
|
|
0: "M.",
|
|
1: "Mme",
|
|
2: "Mlle",
|
|
3: "Société",
|
|
}
|
|
|
|
@validator("civilite", pre=True, always=True)
|
|
def convert_civilite(cls, v):
|
|
if v is None:
|
|
return v
|
|
if isinstance(v, int):
|
|
return cls.civilite_map.get(v, str(v))
|
|
return v
|
|
|
|
|
|
class ContactCreate(BaseModel):
|
|
numero: str = Field(..., description="Code du client parent (obligatoire)")
|
|
|
|
civilite: Optional[str] = Field(None, description="M., Mme, Mlle, Société")
|
|
nom: str = Field(..., description="Nom de famille (obligatoire)")
|
|
prenom: Optional[str] = Field(None, description="Prénom")
|
|
fonction: Optional[str] = Field(None, description="Fonction/Titre")
|
|
|
|
est_defaut: Optional[bool] = Field(
|
|
False, description="Définir comme contact par défaut du client"
|
|
)
|
|
|
|
service_code: Optional[int] = Field(None, description="Code du service")
|
|
|
|
telephone: Optional[str] = Field(None, description="Téléphone fixe")
|
|
portable: Optional[str] = Field(None, description="Téléphone mobile")
|
|
telecopie: Optional[str] = Field(None, description="Fax")
|
|
email: Optional[str] = Field(None, description="Email")
|
|
|
|
facebook: Optional[str] = Field(None, description="URL Facebook")
|
|
linkedin: Optional[str] = Field(None, description="URL LinkedIn")
|
|
skype: Optional[str] = Field(None, description="Identifiant Skype")
|
|
|
|
@validator("civilite")
|
|
def validate_civilite(cls, v):
|
|
if v and v not in ["M.", "Mme", "Mlle", "Société"]:
|
|
raise ValueError("Civilité doit être: M., Mme, Mlle ou Société")
|
|
return v
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"numero": "CLI000001",
|
|
"civilite": "M.",
|
|
"nom": "Dupont",
|
|
"prenom": "Jean",
|
|
"fonction": "Directeur Commercial",
|
|
"telephone": "0123456789",
|
|
"portable": "0612345678",
|
|
"email": "j.dupont@exemple.fr",
|
|
"linkedin": "https://linkedin.com/in/jeandupont",
|
|
"est_defaut": True,
|
|
}
|
|
}
|
|
|
|
|
|
class ContactUpdate(BaseModel):
|
|
civilite: Optional[str] = None
|
|
nom: Optional[str] = None
|
|
prenom: Optional[str] = None
|
|
fonction: Optional[str] = None
|
|
service_code: Optional[int] = None
|
|
telephone: Optional[str] = None
|
|
portable: Optional[str] = None
|
|
telecopie: Optional[str] = None
|
|
email: Optional[str] = None
|
|
facebook: Optional[str] = None
|
|
linkedin: Optional[str] = None
|
|
skype: Optional[str] = None
|
|
est_defaut: Optional[bool] = None
|