from sqlalchemy import Column, Integer, String, Text, DateTime, JSON, ForeignKey, Enum as SAEnum from sqlalchemy.orm import relationship from sqlalchemy.sql import func from database import Base class Courseware(Base): __tablename__ = "coursewares" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) title = Column(String(200), nullable=False) subject = Column(String(50), default="") grade = Column(String(50), default="") description = Column(Text, default="") content = Column(JSON, default=list) cover_image = Column(String(500), default="") status = Column(SAEnum("draft", "published", "archived", name="cw_status"), default="draft") version = Column(Integer, default=1) tags = Column(JSON, default=list) created_at = Column(DateTime, server_default=func.now()) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) author = relationship("User", back_populates="coursewares") class CoursewareShare(Base): __tablename__ = "courseware_shares" id = Column(Integer, primary_key=True, index=True) courseware_id = Column(Integer, ForeignKey("coursewares.id"), nullable=False, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True) token = Column(String(64), unique=True, nullable=False, index=True) title = Column(String(200), nullable=False) subject = Column(String(50), default="") grade = Column(String(50), default="") description = Column(Text, default="") content = Column(JSON, default=list) tags = Column(JSON, default=list) views = Column(Integer, default=0) status = Column(String(20), default="active") created_at = Column(DateTime, server_default=func.now()) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) courseware = relationship("Courseware") author = relationship("User")