models.py 3.06 KB
'''
SQLAlchemy ORM

The classes below correspond to database tables
'''


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


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


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

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

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


# ----------------------------------------------------------------------------
class Test(Base):
    '''Test table'''
    __tablename__ = 'tests'
    id = Column(Integer, primary_key=True)  # auto_increment
    ref = Column(String)
    title = Column(String)
    grade = Column(Float)
    state = Column(String)  # ACTIVE, 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 __str__(self):
        return (f'Test:\n'
                f'  id:         {self.id}\n'
                f'  ref:        "{self.ref}"\n'
                f'  title:      "{self.title}"\n'
                f'  grade:      {self.grade}\n'
                f'  state:      "{self.state}"\n'
                f'  comment:    "{self.comment}"\n'
                f'  starttime:  "{self.starttime}"\n'
                f'  finishtime: "{self.finishtime}"\n'
                f'  filename:   "{self.filename}"\n'
                f'  student_id: "{self.student_id}"\n')


# ---------------------------------------------------------------------------
class Question(Base):
    '''Question table'''
    __tablename__ = 'questions'
    id = Column(Integer, primary_key=True)  # auto_increment
    number = Column(Integer)    # question number (ref may be not be unique)
    ref = Column(String)
    grade = Column(Float)
    comment = Column(String)
    starttime = Column(String)
    finishtime = Column(String)
    test_id = Column(String, ForeignKey('tests.id'))

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

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