from datetime import datetime from pydantic import BaseModel, EmailStr, ConfigDict from typing import Optional, List from tortoise.contrib.pydantic import pydantic_model_creator from mywebdav.models import Folder, File, Share, FileVersion class UserCreate(BaseModel): username: str email: EmailStr password: str class UserLogin(BaseModel): username: str password: str class UserLoginWith2FA(UserLogin): two_factor_code: Optional[str] = None class UserAdminUpdate(BaseModel): username: Optional[str] = None email: Optional[EmailStr] = None password: Optional[str] = None is_active: Optional[bool] = None is_superuser: Optional[bool] = None storage_quota_bytes: Optional[int] = None plan_type: Optional[str] = None is_2fa_enabled: Optional[bool] = None class Token(BaseModel): access_token: str token_type: str class TokenData(BaseModel): username: str | None = None two_factor_verified: bool = False class FolderCreate(BaseModel): name: str parent_id: Optional[int] = None class FolderUpdate(BaseModel): name: Optional[str] = None parent_id: Optional[int] = None class ShareCreate(BaseModel): file_id: Optional[int] = None folder_id: Optional[int] = None expires_at: Optional[datetime] = None password: Optional[str] = None permission_level: str = "viewer" invite_email: Optional[EmailStr] = None class TeamCreate(BaseModel): name: str class TeamOut(BaseModel): id: int name: str owner_id: int created_at: datetime model_config = ConfigDict(from_attributes=True) class ActivityOut(BaseModel): id: int user_id: Optional[int] = None action: str target_type: str target_id: int ip_address: Optional[str] = None timestamp: datetime model_config = ConfigDict(from_attributes=True) class FileRequestCreate(BaseModel): title: str description: Optional[str] = None target_folder_id: int expires_at: Optional[datetime] = None class FileRequestOut(BaseModel): id: int title: str description: Optional[str] = None token: str owner_id: int target_folder_id: int created_at: datetime expires_at: Optional[datetime] = None is_active: bool model_config = ConfigDict(from_attributes=True) FolderOut = pydantic_model_creator(Folder, name="FolderOut") FileOut = pydantic_model_creator(File, name="FileOut") ShareOut = pydantic_model_creator(Share, name="ShareOut") FileVersionOut = pydantic_model_creator(FileVersion, name="FileVersionOut") class ErrorResponse(BaseModel): code: int message: str details: Optional[str] = None class BatchFileOperation(BaseModel): file_ids: List[int] operation: str # e.g., "delete", "move", "copy", "star", "unstar" class BatchFolderOperation(BaseModel): folder_ids: List[int] operation: str # e.g., "delete", "move", "star", "unstar" class BatchMoveCopyPayload(BaseModel): target_folder_id: Optional[int] = None