morozovka-portal/app/models.py

62 lines
2.6 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) # Теперь может быть None, если регаемся локально
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)
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")
gitea_url: Optional[str] = None
owner_id: int = Field(foreign_key="user.id")
is_public: bool = Field(default=True)
created_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))