215 lines
5.4 KiB
Python
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
|