/
tinypot
/
lab4
Обзор
Документация
Войти
/
tinypot
/
lab4
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server/database.py
131 строка
4 KB
Tim Polus
lab4: Task Management API через RabbitMQ
02 мар 2026, 06:17
02 мар 2026, 06:17
52ab147
Код
Авторство
О чём код?
import enum from datetime import datetime from sqlalchemy import ( Column, Integer, String, Text, DateTime, Boolean, Enum, ForeignKey, create_engine, UniqueConstraint, ) from sqlalchemy.orm import declarative_base, relationship, sessionmaker from sqlalchemy.sql import func Base = declarative_base() DB_PATH = "sqlite:///task_management.db" engine = create_engine(DB_PATH, echo=False) Session = sessionmaker(bind=engine) class TaskStatus(str, enum.Enum): PENDING = "pending" IN_PROGRESS = "in_progress" COMPLETED = "completed" CANCELLED = "cancelled" class TaskPriority(str, enum.Enum): LOW = "low" MEDIUM = "medium" HIGH = "high" URGENT = "urgent" class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) email = Column(String, unique=True, nullable=False) username = Column(String, unique=True, nullable=False) hashed_password = Column(String, nullable=False) full_name = Column(String, nullable=True) is_active = Column(Boolean, default=True) is_superuser = Column(Boolean, default=False) created_at = Column(DateTime, server_default=func.now()) tasks = relationship("Task", back_populates="user") categories = relationship("Category", back_populates="user") def to_dict(self): return { "id": self.id, "email": self.email, "username": self.username, "full_name": self.full_name, "is_active": self.is_active, "is_superuser": self.is_superuser, } class Category(Base): __tablename__ = "categories" id = Column(Integer, primary_key=True) name = Column(String, nullable=False) description = Column(Text, nullable=True) color = Column(String(7), nullable=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) created_at = Column(DateTime, server_default=func.now()) user = relationship("User", back_populates="categories") tasks = relationship("Task", back_populates="category") def to_dict(self): return { "id": self.id, "name": self.name, "description": self.description, "color": self.color, "user_id": self.user_id, } class Task(Base): __tablename__ = "tasks" id = Column(Integer, primary_key=True) title = Column(String, nullable=False) description = Column(Text, nullable=True) status = Column(Enum(TaskStatus), default=TaskStatus.PENDING) priority = Column(Enum(TaskPriority), default=TaskPriority.MEDIUM) due_date = Column(DateTime, nullable=True) completed_at = Column(DateTime, nullable=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) category_id = Column(Integer, ForeignKey("categories.id"), nullable=True) created_at = Column(DateTime, server_default=func.now()) user = relationship("User", back_populates="tasks") category = relationship("Category", back_populates="tasks") def to_dict(self): return { "id": self.id, "title": self.title, "description": self.description, "status": self.status.value if self.status else None, "priority": self.priority.value if self.priority else None, "due_date": self.due_date.isoformat() if self.due_date else None, "completed_at": self.completed_at.isoformat() if self.completed_at else None, "user_id": self.user_id, "category_id": self.category_id, } class IdempotencyRecord(Base): __tablename__ = "idempotency_records" id = Column(Integer, primary_key=True) request_id = Column(String, unique=True, nullable=False, index=True) response_body = Column(Text, nullable=False) created_at = Column(DateTime, server_default=func.now()) class ApiKey(Base): __tablename__ = "api_keys" id = Column(Integer, primary_key=True) key = Column(String, unique=True, nullable=False, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) is_active = Column(Boolean, default=True) def init_db(): Base.metadata.create_all(engine)