After_Chido_Api/models/schemas.py

215 lines
5.4 KiB
Python

import json
from fastapi import Form, UploadFile
from pydantic import BaseModel, EmailStr, model_validator
from datetime import datetime
from typing import Any, List, Optional
class Role(BaseModel):
id: int
name: str
permissions: List[str]
class Config:
orm_mode = True
class UserUpdateRole(BaseModel):
email: EmailStr
new_role: str
class RoleResponse(BaseModel):
name: str
permissions: List[str]
class Config:
from_attributes = True
class UserBase(BaseModel):
email: EmailStr
full_name: str
phone: str
date_of_birth: datetime
organization: Optional[str] = None
class UserCreate(UserBase):
password: str
role: str
class UserResponse(BaseModel):
email: EmailStr
full_name: str
phone: str
date_of_birth: datetime
organization: Optional[str] = None
role: RoleResponse
is_banned: bool
is_blocked: bool
is_deleted: bool
# Validation au niveau du modèle
@model_validator(mode="before")
def convert_role_to_dict(cls, values):
role = values.get("role")
if isinstance(role, str):
values["role"] = {"id": 0, "name": role, "permissions": []}
return values
class Config:
from_attributes = True
class Permission(BaseModel):
id: int
name: str
class UserBlockBan(BaseModel):
email: EmailStr
class PermissionBase(BaseModel):
name: str
class PermissionResponse(PermissionBase):
id: int
class Config:
from_attributes = True
# Demande de besoin (NeedRequest)
class NeedRequestBase(BaseModel):
category: str
description: str
adults: int
children: int
vulnerable: int
location: str
gps_coordinates: Optional[str] = None
class NeedRequestCreate(NeedRequestBase):
requester_email: EmailStr
class NeedRequestUpdate(BaseModel):
category: Optional[str] = None
description: Optional[str] = None
adults: Optional[int] = None
children: Optional[int] = None
vulnerable: Optional[int] = None
location: Optional[str] = None
gps_coordinates: Optional[str] = None
status: Optional[str] = None
class NeedRequestResponse(NeedRequestBase):
id: int
requester_email: EmailStr
status: str
deleted: Optional[datetime] = None
class UserReport(BaseModel):
reporter_id: int
reported_user_id: int
reason: str
status: Optional[str] = "pending"
class UserReportUpdate(BaseModel):
#reason: Optional[str] = None
status: Optional[str] = None # Exemples : "pending", "resolved"
class TechnicalIssue(BaseModel):
user_id: int
description: str
status: str
class CreateTechnicalIssue(BaseModel):
description: str
status: str
class UpdateTechnicalIssue(BaseModel):
status: Optional[str] = None
class PersonReportBase(BaseModel):
full_name: str
date_of_birth: datetime
status: str # "missing", "safe", "deceased"
location: Optional[str] = None
gps_coordinates: Optional[str] = None
photo_url: Optional[str] = None
reporter_email: str
class PersonReportCreate(BaseModel):
full_name: Optional[str] = Form(None)
date_of_birth: Optional[datetime] = Form(None)
status: Optional[str] = Form(None)
location: Optional[str] = Form(None)
gps_coordinates: Optional[str] = Form(None)
@model_validator(mode='before')
@classmethod
def validate_to_json(cls, value: Any) -> Any:
print(value)
if isinstance(value, str):
return cls(**json.loads(value))
return value
class PersonReportUpdate(BaseModel):
status: Optional[str] = None
location: Optional[str] = None
gps_coordinates: Optional[str] = None
photo_url: Optional[str] = None
class Token(BaseModel):
access_token: str
token_type: str
class TokenData(BaseModel):
email: Optional[str] = None
class PointOfInterest(BaseModel):
label: str
description: Optional[str] = None
icon: Optional[str] = None # URL de l'icône
organization: Optional[str] = None
gps_coordinates: str
added_by: int # ID de l'utilisateur qui a ajouté ce point
class CreatePointOfInterest(BaseModel):
label: str
description: Optional[str] = None
icon: Optional[str] = None # URL de l'icône
organization: Optional[str] = None
gps_coordinates: str
class UpdatePointOfInterest(BaseModel):
description: Optional[str] = None
icon: Optional[str] = None # URL de l'icône
organization: Optional[str] = None
gps_coordinates: Optional[str] = None
class Shelter(BaseModel):
label: str
description: Optional[str] = None
status: str # "available", "full", "closed"
contact_person: Optional[str] = None
gps_coordinates: str
added_by: int # ID de l'utilisateur qui a ajouté cet abri
class CreateShelter(BaseModel):
label: str
description: Optional[str] = None
status: str # "available", "full", "closed"
contact_person: Optional[str] = None
contact_email: Optional[str] = None
contact_phone: Optional[str] = None
gps_coordinates: str
class UpdateShelter(BaseModel):
label: Optional[str] = None
description: Optional[str] = None
status: Optional[str] = None # "available", "full", "closed"
contact_person: Optional[str] = None
contact_email: Optional[str] = None
contact_phone: Optional[str] = None
gps_coordinates: Optional[str] = None
class PersonReportResponse(PersonReportBase):
id: int
created_at: datetime
updated_at: datetime