dataflow-server / schemas.py
Ilirt's picture
upload
5aaca54 verified
Raw History Blame Contribute Delete
4.43 kB
"""
DataFlow Server β€” Pydantic Schemas
"""
from pydantic import BaseModel, EmailStr
from typing import Optional, List
from datetime import datetime
# ─── Auth ───
class UserLogin(BaseModel):
email: str
password: str
class UserRegister(BaseModel):
full_name: str
email: str
password: str
position: Optional[str] = None
role: str = "developer"
class Token(BaseModel):
access_token: str
token_type: str = "bearer"
user_id: str
full_name: str
role: str
class UserOut(BaseModel):
id: str
full_name: str
email: str
position: Optional[str]
role: str
language: str
currency: str
timezone: str
two_factor_enabled: bool
biometric_enabled: bool
model_config = {"from_attributes": True}
# ─── Project ───
class ProjectCreate(BaseModel):
name: str
description: str = ""
start_date: datetime
end_date: datetime
budget: float
status: str = "active"
class ProjectUpdate(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
end_date: Optional[datetime] = None
budget: Optional[float] = None
spent: Optional[float] = None
status: Optional[str] = None
progress: Optional[float] = None
risk_level: Optional[str] = None
class ProjectOut(BaseModel):
id: str
name: str
description: str
start_date: datetime
end_date: datetime
budget: float
spent: float
status: str
progress: float
risk_level: str
owner_id: Optional[str]
created_at: datetime
model_config = {"from_attributes": True}
# ─── Task ───
class SubTaskOut(BaseModel):
id: str
title: str
completed: bool
model_config = {"from_attributes": True}
class TaskCreate(BaseModel):
title: str
description: str = ""
project_id: str
status: str = "todo"
priority: str = "medium"
assignee_id: Optional[str] = None
assignee_name: Optional[str] = None
deadline: Optional[datetime] = None
tags: str = ""
class TaskUpdate(BaseModel):
title: Optional[str] = None
status: Optional[str] = None
priority: Optional[str] = None
assignee_id: Optional[str] = None
assignee_name: Optional[str] = None
deadline: Optional[datetime] = None
class TaskOut(BaseModel):
id: str
title: str
description: str
project_id: str
status: str
priority: str
assignee_id: Optional[str]
assignee_name: Optional[str]
deadline: Optional[datetime]
created_at: datetime
tags: str
subtasks: List[SubTaskOut] = []
model_config = {"from_attributes": True}
# ─── Expense ───
class ExpenseCreate(BaseModel):
project_id: str
title: str
amount: float
category: str
date: Optional[datetime] = None
description: Optional[str] = None
class ExpenseUpdate(BaseModel):
status: Optional[str] = None
amount: Optional[float] = None
title: Optional[str] = None
class ExpenseOut(BaseModel):
id: str
project_id: str
title: str
amount: float
category: str
date: datetime
status: str
description: Optional[str]
receipt_url: Optional[str]
created_at: datetime
model_config = {"from_attributes": True}
# ─── Document ───
class DocumentOut(BaseModel):
id: str
name: str
project_id: str
type: str
size_bytes: int
is_favorite: bool
extracted_text: Optional[str]
recognition_confidence: Optional[float]
detected_type: Optional[str]
extracted_amount: Optional[float]
extracted_date: Optional[datetime]
extracted_supplier: Optional[str]
uploaded_at: datetime
model_config = {"from_attributes": True}
# ─── Notification ───
class NotificationOut(BaseModel):
id: str
title: str
body: str
type: str
is_read: bool
created_at: datetime
model_config = {"from_attributes": True}
# ─── AI Forecast ───
class ForecastOut(BaseModel):
id: str
project_id: str
current_spent: float
planned_budget: float
risk_level: str
overrun_probability: float
optimistic_forecast: float
realistic_forecast: float
pessimistic_forecast: float
recommendations: str
generated_at: datetime
model_config = {"from_attributes": True}
class ForecastRequest(BaseModel):
project_id: str
class OCRRequest(BaseModel):
project_id: str