from pydantic import BaseModel, EmailStr from datetime import datetime from typing import List, Optional class RoleBase(BaseModel): name: str class RoleCreate(RoleBase): permissions: List[str] class RoleResponse(RoleBase): id: int permissions: List[str] class Config: orm_mode = 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: str organization: Optional[str] = None role: RoleResponse is_active: bool is_banned: bool class UserUpdateRole(BaseModel): email: EmailStr new_role: str class UserBlockBan(BaseModel): email: EmailStr class PermissionBase(BaseModel): name: str class PermissionResponse(PermissionBase): id: int class Config: orm_mode = 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 UpdateTechnicalIssue(BaseModel): status: Optional[str] = None description: 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(PersonReportBase): pass 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 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 PersonReportResponse(PersonReportBase): id: int created_at: datetime updated_at: datetime