from sqlmodel import SQLModel, Field from typing import Optional from datetime import datetime, timezone class User(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) gitea_id: Optional[int] = Field(default=None, unique=True, index=True) username: str = Field(unique=True, index=True) password_hash: Optional[str] = None full_name: Optional[str] = None email: Optional[str] = Field(default=None, unique=True) organization: Optional[str] = None role: str = Field(default="student") is_active: bool = Field(default=True) is_verified: bool = Field(default=False) created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class UserSession(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) session_token: str = Field(unique=True, index=True) user_id: int = Field(foreign_key="user.id") ip_address: Optional[str] = None user_agent: Optional[str] = None created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class Event(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) title: str event_type: str = Field(default="lecture") start_time: datetime end_time: datetime location: Optional[str] = None description: Optional[str] = None status: str = Field(default="scheduled") is_public: bool = Field(default=True) google_event_id: Optional[str] = Field(default=None, unique=True, index=True) manually_edited: bool = Field(default=False) created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class GlobalStatus(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) status: str = Field(default="free") delay_minutes: int = Field(default=0) message: Optional[str] = None updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class Project(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) title: str description: Optional[str] = None status: str = Field(default="idea") # idea, in_progress, completed, frozen visibility: str = Field(default="public") # public, internal, private gitea_url: Optional[str] = None owner_id: int = Field(foreign_key="user.id") created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) # --- НОВАЯ МОДЕЛЬ --- class ProjectMember(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) project_id: int = Field(foreign_key="project.id") user_id: int = Field(foreign_key="user.id") role: str = Field(default="member") # lead, member joined_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class PortalFile(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) original_name: str stored_name: str size_bytes: int uploaded_by: int = Field(foreign_key="user.id") uploaded_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))