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_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