class TestCategory(db.Model, DbModel): __tablename__ = 'test_categories' id = db.Column(db.String(80), primary_key=True, default=generate_id) name = db.Column(db.String(120), index=True, unique=True, nullable=False) tests = db.relationship("Test", backref="category", lazy="dynamic", cascade="all, delete-orphan") def __repr__(self): return '<TestCategory %r>' % self.name
class Article(db.Model, DbModel): __tablename__ = 'articles' id = db.Column(db.String(80), primary_key=True, default=generate_id) name = db.Column(db.String(120), index=True, unique=True, nullable=False) category_id = db.Column(db.String(80), db.ForeignKey('article_categories.id'), index=True, nullable=True) content = db.Column(db.Text, unique=False, nullable=True) def __repr__(self): return '<Article %r>' % self.name
class User(db.Model, DbModel): __tablename__ = 'users' id = db.Column(db.String(80), primary_key=True, default=generate_id) name = db.Column(db.String(80), index=True, unique=True, nullable=False) password = db.Column(db.String(120), unique=False, nullable=True) first_name = db.Column(db.String(120), index=True, unique=False, nullable=True) second_name = db.Column(db.String(120), index=True, unique=False, nullable=True) last_name = db.Column(db.String(120), index=True, unique=False, nullable=True) is_admin = db.Column(db.Boolean, index=True, unique=False, nullable=False, default=False) results = db.relationship("TestResult", backref="user", lazy="dynamic") def __repr__(self): return '<User %r>' % self.name def __init__(self, **kwargs): super(User, self).__init__(**kwargs) for param, value in kwargs.items(): if param != 'password': setattr(self, param, value) else: self.set_password(value) def set_password(self, password): self.password = generate_password_hash(password) def verify_password(self, password): return check_password_hash(self.password, password) @hybrid_property def category(self): return 'Administrators' if self.is_admin else 'Users'
class Test(db.Model, DbModel): __tablename__ = 'tests' id = db.Column(db.String(80), primary_key=True, default=generate_id) name = db.Column(db.String(120), index=True, unique=True, nullable=False) category_id = db.Column(db.String(80), db.ForeignKey('test_categories.id'), index=True, nullable=True) not_before = db.Column(db.Date, nullable=True) not_after = db.Column(db.Date, nullable=True) max_duration = db.Column(db.Integer, nullable=True) items = db.relationship("TestItem", backref="test", lazy="dynamic", cascade="all, delete-orphan") @hybrid_property def items_count(self): return self.items.count() results = db.relationship("TestResult", backref="test", lazy="dynamic") def __repr__(self): return '<Test %r>' % self.name
class TestItem(db.Model, DbModel): __tablename__ = 'tests_items' id = db.Column(db.Integer, primary_key=True, autoincrement=True) item_no = db.Column(db.Integer, index=True, nullable=False) test_id = db.Column(db.String(80), db.ForeignKey('tests.id'), index=True, nullable=False) content = db.Column(db.Text, nullable=True) answers = db.relationship("TestAnswer", backref="item", lazy="dynamic", cascade="all, delete-orphan") def __repr__(self): return '<TestItem %r %r>' % (self.test_id, self.item_no)
class TestResult(db.Model, DbModel): __tablename__ = 'test_results' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.String(80), db.ForeignKey('users.id'), index=True, nullable=False) test_id = db.Column(db.String(80), db.ForeignKey('tests.id'), index=True, nullable=False) begin = db.Column(db.DateTime, unique=False, nullable=False, default=func.current_timestamp()) end = db.Column(db.DateTime, unique=False, nullable=True, default=func.current_timestamp(), onupdate=func.current_timestamp()) last_item = db.Column(db.Integer, index=True, unique=False, nullable=False, default=1) is_finished = db.Column(db.Boolean, index=True, unique=False, nullable=False, default=False) @hybrid_property def score(self): return self.answers.filter_by(result=True).count() @hybrid_property def percent(self): return round(self.score / self.test.items_count * 100) @hybrid_property def mark(self): percent = int(self.percent) if percent >= 86: return 5 if percent >= 70: return 4 if percent >= 50: return 3 if percent > 0: return 2 return 1 answers = db.relationship("TestAnswer", backref="test_results", lazy="dynamic") @hybrid_property def category(self): return 'Finished tests' if self.is_finished else 'Time over tests' def __repr__(self): return '<TestResult %r>' % self.id