class User(UserMixin, SurrogatePK, Model): """A user of the app.""" __tablename__ = "users" username = Column(db.String(80), unique=True, nullable=False) email = Column(db.String(80), unique=True, nullable=False) #: The hashed password password = Column(db.LargeBinary(128), nullable=True) created_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) active = Column(db.Boolean(), default=False) is_admin = Column(db.Boolean(), default=False) is_instructor = Column(db.Boolean(), default=False) is_static = Column(db.Boolean(), default=False) # static: user belongs to one group only (for generated groups) def __init__(self, username, email, password=None, **kwargs): """Create instance.""" db.Model.__init__(self, username=username, email=email, **kwargs) if password: self.set_password(password) else: self.password = None def set_password(self, password): """Set password.""" self.password = bcrypt.generate_password_hash(password) def check_password(self, value): """Check password.""" return bcrypt.check_password_hash(self.password, value) def __repr__(self): """Represent instance as a unique string.""" return f"<User({self.username!r})>"
class StudentGroups(UserMixin, SurrogatePK, Model): """"Groupts of Users""" __tablename__ = "groups" name = Column(db.String(40), unique=True, nullable=False) owner_id = reference_col("users", nullable=False) owner = relationship("User", backref="groups") code = Column(db.String(8), unique=True, nullable=True, default=generate_registration_code())
class Scenarios(UserMixin, SurrogatePK, Model): """An exercise """ __tablename__ = "scenarios" name = Column(db.String(40), unique=False, nullable=False) description = Column(db.String(80), unique=False, nullable=True) owner_id = reference_col("users", nullable=False) owner = relationship("User", backref="scenarios") created_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) status = Column(db.Integer, default=0, nullable=False)
class Scenarios(UserMixin, SurrogatePK, Model): """An exercise """ __tablename__ = "scenarios" name = Column(db.String(40), unique=False, nullable=False) description = Column(db.String(80), unique=False, nullable=True) owner_id = reference_col("users", nullable=False) owner = relationship("User", backref="scenarios", lazy="subquery") created_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) status = Column(db.Integer, default=0, nullable=False) attempt = Column(db.Integer, default=0, nullable=False, server_default="0") resps = relationship("Responses", backref="scenarios", cascade="all, delete-orphan") def __repr__(self): """Represent instance as a unique string.""" return f"<Scenario({self.name!r})>"
class Responses(UserMixin, SurrogatePK, Model): """Student responses to scenario questions""" __tablename__ = "responses" user_id = reference_col("users", nullable=False) user = relationship("User", backref="responses") scenario_id = reference_col("scenarios", nullable=False) scenario = relationship("Scenarios", backref="responses") question = Column(db.Integer, default=0, nullable=False) student_response = Column(db.String(40), unique=False, nullable=True) #correct = Column(db.Boolean(), default=False) points = Column(db.Integer, default=0, nullable=False) response_time = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) attempt = Column(db.Integer, default=0, nullable=False)
class BashHistory(UserMixin, SurrogatePK, Model): """Bash Histories, associated with users and scenarios""" __tablename__ = "bash_history" scenario_name = Column(db.String(40), unique=False, nullable=False) container_name = Column(db.String(40), nullable=False, unique=False) timestamp = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) current_directory = Column(db.String(200), nullable=False, unique=False) input = Column(db.String(250), nullable=False, unique=False) output = Column(db.String(10000), nullable=False, unique=False) prompt = Column(db.String(80), nullable=False, unique=False)
class Notification(UserMixin, SurrogatePK, Model): #more columns could be added. Type of notification is one thing detail = Column(db.String(60), unique=False, nullable=False) date = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow)