Пример #1
0
class User(db.Model, UserMixin):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    first_name = db.Column(db.String(60), nullable=False)
    middle_name = db.Column(db.String(60))
    last_name = db.Column(db.String(60), nullable=False)
    university = db.Column(db.String(120))
    group_id = db.Column(db.String(36))
    password = db.Column(db.String(128), nullable=False)
    image = db.Column(db.String(20), nullable=False, default="default.png")

    answers = db.relationship("Answer", backref="author", lazy=True)
    questions = db.relationship("Question", backref="author", lazy=True)
    tests = db.relationship("Test", backref="author", lazy="dynamic")
    results = db.relationship("TestResult", backref="author", lazy="dynamic")

    def get_need_review(self, limit=None):
        need_review = set()
        for q in self.questions:
            for a in q.answers.filter_by(flagged=True).limit(limit).all():
                need_review.add(a.result)
        return need_review

    def get_user_score(self):
        # TODO: Переписать на запрос
        score = 0
        for a in self.answers:
            if a.grade:
                score += a.grade
        return score

    def __repr__(self):
        return f"User({self.first_name} {self.middle_name} {self.last_name})"
Пример #2
0
class Test(db.Model):
    __tablename__ = "test"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False, unique=True)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    cat_id = db.Column(db.Integer, db.ForeignKey("category.id"))
    draft = db.Column(db.Boolean, default=True, nullable=False)

    results = db.relationship("TestResult", backref="test", lazy=True)

    def __repr__(self):
        return f"Test ({self.id})"
Пример #3
0
class Question(db.Model):
    __tablename__ = "question"
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    text = db.Column(db.Text, nullable=False)

    tests = db.relationship("Test",
                            secondary=test_to_questions,
                            backref="questions")
    answers = db.relationship("Answer", backref="question", lazy="dynamic")

    def __repr__(self):
        return f"Question ({self.id})"
Пример #4
0
class Category(db.Model):
    __tablename__ = "category"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False, unique=True)
    description = db.Column(db.Text, nullable=True)
    image = db.Column(db.String(20), nullable=False, default=get_random_image)

    tests = db.relationship("Test", backref="category", lazy=True)

    def get_image_path(self):
        return url_for("static", filename="images/categories/" + self.image)

    def __repr__(self):
        return f"Category ({self.name})"
Пример #5
0
class Answer(db.Model):
    __tablename__ = "answer"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    q_id = db.Column(db.Integer, db.ForeignKey("question.id"))
    res_id = db.Column(db.Integer, db.ForeignKey("test_result.id"))
    text = db.Column(db.Text)
    grade = db.Column(db.Float)
    flagged = db.Column(db.Boolean, default=False)
    reviewed = db.Column(db.Boolean, default=False)

    def __repr__(self):
        return f"Answer ({self.id})"
Пример #6
0
class TestResult(db.Model):
    __tablename__ = "test_result"
    id = db.Column(db.Integer, primary_key=True)
    test_id = db.Column(db.Integer, db.ForeignKey("test.id"), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)

    answers = db.relationship("Answer", backref="result", lazy=True)

    def get_status(self):
        for a in self.answers:
            if a.grade == None:
                return 2
        for a in self.answers:
            if a.flagged:
                return 3
        return 1

    def get_score(self):
        return sum([a.grade if a.grade else 0 for a in self.answers])

    def __repr__(self):
        return f"Test Result ({self.id})"
Пример #7
0
from datetime import datetime

from tea_site import db, login_manager
from flask import current_app, url_for
from datetime import datetime
from flask_login import UserMixin

test_to_questions = db.Table(
    "test_to_questions",
    db.Model.metadata,
    db.Column("test_id", db.Integer, db.ForeignKey("test.id")),
    db.Column("q_id", db.Integer, db.ForeignKey("question.id")),
)

# TODO: Поревьювить модельки снова, расставить nullable и каскадинг


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


class User(db.Model, UserMixin):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    first_name = db.Column(db.String(60), nullable=False)
    middle_name = db.Column(db.String(60))
    last_name = db.Column(db.String(60), nullable=False)
    university = db.Column(db.String(120))
    group_id = db.Column(db.String(36))