/
Befun
/
FamalyControlle
Обзор
Документация
Войти
/
Befun
/
FamalyControlle
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
models.py
156 строк
7 KB
BeFun
Init project
07 май 2026, 10:43
07 май 2026, 10:43
7e96900
Код
Авторство
О чём код?
""" SQLAlchemy модели данных. Таблицы: users, restrictions, schedules, history. """ from datetime import datetime from sqlalchemy import ( Column, Integer, String, Text, DateTime, Boolean, ForeignKey, JSON, Enum as SAEnum, ) from sqlalchemy.orm import DeclarativeBase, relationship, sessionmaker from sqlalchemy import create_engine class Base(DeclarativeBase): pass # ═══════════════════════════════════════════════════════════════ # Users # ═══════════════════════════════════════════════════════════════ class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, autoincrement=True) max_user_id = Column(String(128), unique=True, nullable=False, index=True) display_name = Column(String(128), default="Пользователь") role = Column(String(32), default="child") # admin | family | child created_at = Column(DateTime, default=datetime.utcnow) is_active = Column(Boolean, default=True) # Отношения restrictions = relationship("Restriction", back_populates="creator") history_entries = relationship("HistoryEntry", back_populates="user") def to_dict(self) -> dict: return { "id": self.id, "max_user_id": self.max_user_id, "display_name": self.display_name, "role": self.role, "created_at": self.created_at.isoformat() + "Z" if self.created_at else None, "is_active": self.is_active, } # ═══════════════════════════════════════════════════════════════ # Restrictions (ограничения) # ═══════════════════════════════════════════════════════════════ class Restriction(Base): __tablename__ = "restrictions" id = Column(Integer, primary_key=True, autoincrement=True) category = Column(String(64), nullable=False) # games, browsers, downloads, app, shutdown, restart target = Column(String(256), default="*") # * (все в категории) или имя процесса is_active = Column(Boolean, default=True) expires_at = Column(DateTime, nullable=True) # для временных ограничений created_by = Column(Integer, ForeignKey("users.id"), nullable=False) created_at = Column(DateTime, default=datetime.utcnow) # Отношения creator = relationship("User", back_populates="restrictions") def to_dict(self) -> dict: return { "id": self.id, "category": self.category, "target": self.target, "is_active": self.is_active, "expires_at": self.expires_at.isoformat() + "Z" if self.expires_at else None, "created_by": self.created_by, "created_at": self.created_at.isoformat() + "Z" if self.created_at else None, } # ═══════════════════════════════════════════════════════════════ # Schedules (расписания) # ═══════════════════════════════════════════════════════════════ class Schedule(Base): __tablename__ = "schedules" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(128), nullable=False) # "Сон", "Отдых" schedule_type = Column(String(32), nullable=False) # sleep | rest start_time = Column(String(8), nullable=False) # "22:00" end_time = Column(String(8), nullable=False) # "07:00" days = Column(JSON, default=list) # [0,1,2,3,4] — номера дней (0=пн) is_active = Column(Boolean, default=True) created_by = Column(Integer, ForeignKey("users.id"), nullable=False) created_at = Column(DateTime, default=datetime.utcnow) def to_dict(self) -> dict: return { "id": self.id, "name": self.name, "schedule_type": self.schedule_type, "start_time": self.start_time, "end_time": self.end_time, "days": self.days, "is_active": self.is_active, "created_by": self.created_by, "created_at": self.created_at.isoformat() + "Z" if self.created_at else None, } # ═══════════════════════════════════════════════════════════════ # History (лог действий) # ═══════════════════════════════════════════════════════════════ class HistoryEntry(Base): __tablename__ = "history" id = Column(Integer, primary_key=True, autoincrement=True) action = Column(String(64), nullable=False) # block, unblock, schedule_create, etc. target = Column(String(256), default="") # что затронуто details = Column(Text, default="") # доп. информация user_id = Column(Integer, ForeignKey("users.id"), nullable=False) created_at = Column(DateTime, default=datetime.utcnow) # Отношения user = relationship("User", back_populates="history_entries") def to_dict(self) -> dict: return { "id": self.id, "action": self.action, "target": self.target, "details": self.details, "user_id": self.user_id, "created_at": self.created_at.isoformat() + "Z" if self.created_at else None, } # ═══════════════════════════════════════════════════════════════ # Database Manager # ═══════════════════════════════════════════════════════════════ class DatabaseManager: """Менеджер БД — создаёт таблицы, предоставляет Session.""" def __init__(self, database_url: str): self._engine = create_engine(database_url, echo=False, connect_args={"check_same_thread": False}) self._SessionLocal = sessionmaker(bind=self._engine) Base.metadata.create_all(self._engine) @property def session_factory(self): return self._SessionLocal def get_session(self): """Контекстный менеджер сессии.""" return self._SessionLocal()