models.py 2.81 KB


from sqlalchemy import Table, Column, ForeignKey, Integer, Float, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship


# ===========================================================================
#   Declare ORM
Base = declarative_base()

# ---------------------------------------------------------------------------
class Student(Base):
    __tablename__ = 'students'
    id = Column(String, primary_key=True)
    name = Column(String)
    password = Column(String)

    # ---
    tests = relationship('Test', back_populates='student')
    questions = relationship('Question', back_populates='student')

    def __repr__(self):
        return f'Student:\n\
        id: "{self.id}"\n\
        name: "{self.name}"\n\
        password: "{self.password}"'


# ---------------------------------------------------------------------------
class Test(Base):
    __tablename__ = 'tests'
    id = Column(Integer, primary_key=True) # auto_increment
    ref = Column(String)
    title = Column(String)  # FIXME depends on ref and should come from another table...
    grade = Column(Float)
    state = Column(String)  # ONGOING, FINISHED, QUIT, NULL
    comment = Column(String)
    starttime = Column(String)
    finishtime = Column(String)
    filename = Column(String)
    student_id = Column(String, ForeignKey('students.id'))

    # ---
    student = relationship('Student', back_populates='tests')
    questions = relationship('Question', back_populates='test')

    def __repr__(self):
        return f'Test:\n\
        id: "{self.id}"\n\
        ref: "{self.ref}"\n\
        title: "{self.title}"\n\
        grade: "{self.grade}"\n\
        state: "{self.state}"\n\
        comment: "{self.comment}"\n\
        starttime: "{self.starttime}"\n\
        finishtime: "{self.finishtime}"\n\
        filename: "{self.filename}"\n\
        student_id: "{self.student_id}"\n'


# ---------------------------------------------------------------------------
class Question(Base):
    __tablename__ = 'questions'
    id = Column(Integer, primary_key=True) # auto_increment
    ref = Column(String)
    grade = Column(Float)
    starttime = Column(String)
    finishtime = Column(String)
    student_id = Column(String, ForeignKey('students.id'))
    test_id = Column(String, ForeignKey('tests.id'))

    # ---
    student = relationship('Student', back_populates='questions')
    test = relationship('Test', back_populates='questions')

    def __repr__(self):
        return f'Question:\n\
        id: "{self.id}"\n\
        ref: "{self.ref}"\n\
        grade: "{self.grade}"\n\
        starttime: "{self.starttime}"\n\
        finishtime: "{self.finishtime}"\n\
        student_id: "{self.student_id}"\n\
        test_id: "{self.test_id}"\n'


# ---------------------------------------------------------------------------