from sqlalchemy import create_engine, Column, Integer, String, Boolean, Date, ForeignKey, CheckConstraint from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from psql_database import engine, Base from passlib.hash import bcrypt # Define the User model class User(Base): __tablename__ = 'users' user_id = Column(Integer, primary_key=True) first_name = Column(String(50), nullable=False) last_name = Column(String(50), nullable=False) email = Column(String(100), nullable=False, unique=True) password = Column(String(100), nullable=False) # HASHED PASSWORD todos = relationship('Todo', back_populates='user') def verify_password(self, plain_password): return bcrypt.verify(plain_password, self.password) # Define the Todo model class Todo(Base): __tablename__ = 'todos' todo_id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.user_id'), nullable=False) task_name = Column(String(100), nullable=False) task_description = Column(String) priority = Column(Integer, CheckConstraint('priority >= 1 AND priority <= 3', name="priority should be either 1 or 2 or 3"), nullable=False) # 1: high, 2: medium, 3: low category = Column(String(50)) due_date = Column(Date, nullable=False) status = Column(Boolean, default=False) user = relationship('User', back_populates='todos') # Create the tables def create_database_tables(): return Base.metadata.create_all(bind=engine)