72 lines
3.1 KiB
Python
72 lines
3.1 KiB
Python
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))
|