Skip to content
Snippets Groups Projects
models.py 8.27 KiB
Newer Older
  • Learn to ignore specific revisions
  • from app import bcrypt, db
    
    Victor Löfgren's avatar
    Victor Löfgren committed
    from sqlalchemy.ext.declarative import declared_attr
    
    from sqlalchemy.ext.hybrid import hybrid_method, hybrid_property
    
    STRING_SIZE = 254
    
    Victor Löfgren's avatar
    Victor Löfgren committed
    
    
    class Blacklist(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        jti = db.Column(db.String, unique=True, nullable=False)
    
        def __init__(self, jti):
            self.jti = jti
    
    
    
    class Role(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(STRING_SIZE), unique=True)
    
        users = db.relationship("User", backref="role")
    
        def __init__(self, name):
            self.name = name
    
    
    class City(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(STRING_SIZE), unique=True)
    
        users = db.relationship("User", backref="city")
    
        def __init__(self, name):
            self.name = name
    
    
    
    Victor Löfgren's avatar
    Victor Löfgren committed
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(254), unique=True, nullable=False)
        name = db.Column(db.String(50), nullable=True)
    
        _password = db.Column(db.LargeBinary(60), nullable=False)
        authenticated = db.Column(db.Boolean, default=False)
    
        twoAuthConfirmed = db.Column(db.Boolean, default=True)  # Change to false for Two factor authen
        twoAuthCode = db.Column(db.String(100), nullable=True)
    
    
        role_id = db.Column(db.Integer, db.ForeignKey("role.id"), nullable=True)  # Change to false
        city_id = db.Column(db.Integer, db.ForeignKey("city.id"), nullable=True)  # Change to false
    
        media = db.relationship("Media", backref="upload_by")
    
        def __init__(self, email, plaintext_password, role_id=None, city_id=None, name=None):
    
    Victor Löfgren's avatar
    Victor Löfgren committed
            self._password = bcrypt.generate_password_hash(plaintext_password)
            self.email = email
    
            self.role_id = role_id
            self.city_id = city_id
    
    Victor Löfgren's avatar
    Victor Löfgren committed
            self.name = name
            self.authenticated = False
    
        def get_dict(self):
            return {"id": self.id, "email": self.email, "name": self.name}
    
        @hybrid_property
        def password(self):
            return self._password
    
        @password.setter
        def set_password(self, plaintext_password):
            self._password = bcrypt.generate_password_hash(plaintext_password)
    
        @hybrid_method
        def is_correct_password(self, plaintext_password):
            return bcrypt.check_password_hash(self._password, plaintext_password)
    
    
    
    class Media(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        filename = db.Column(db.String(STRING_SIZE), unique=True)
        type = db.Column(db.String(STRING_SIZE), nullable=False)
        upload_by_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    
        def __init__(self, filename, type, upload_by_id):
            self.filename = filename
            self.type = type
            self.upload_by_id = upload_by_id
    
    
    class Style(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(STRING_SIZE), unique=True)
        css = db.Column(db.Text, nullable=True)
        bg_image_id = db.Column(db.Integer, db.ForeignKey("media.id"), nullable=True)
    
        bg_image = db.relationship("Media", foreign_keys=[bg_image_id], uselist=False)
    
        def __init__(self, name, css=None, bg_image_id=None):
            self.name = name
            self.css = css
            self.bg_image_id = bg_image_id
    
    
    class Competition(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(STRING_SIZE), unique=True)
        style_id = db.Column(db.Integer, db.ForeignKey("style.id"), nullable=False)
        city_id = db.Column(db.Integer, db.ForeignKey("city.id"), nullable=False)
    
        style = db.relationship("Style", foreign_keys=[style_id], uselist=False)
        city = db.relationship("City", foreign_keys=[city_id], uselist=False)
    
        def __init__(self, name, style_id, city_id):
            self.name = name
            self.style_id = style_id
            self.city_id = city_id
    
    
    class Team(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(STRING_SIZE), unique=True)
        competition_id = db.Column(db.Integer, db.ForeignKey("competition.id"), nullable=False)
        competition = db.relationship("Competition", foreign_keys=[competition_id], uselist=False)
    
        def __init__(self, name, competition_id):
            self.name = name
            self.competition_id = competition_id
    
    
    class Slide(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(STRING_SIZE), unique=True)
        order = db.Column(db.Integer, nullable=False)
        tweak_settings = db.Column(db.Text, nullable=True)
        competition_id = db.Column(db.Integer, db.ForeignKey("competition.id"), nullable=False)
    
        competition = db.relationship("Competition", foreign_keys=[competition_id], uselist=False)
    
        def __init__(self, name, order, competition_id, tweak_settings=None):
            self.name = name
            self.order = order
            self.competition_id = competition_id
            self.tweak_settings = tweak_settings
    
    
    class Question(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(STRING_SIZE), unique=True)
        title = db.Column(db.String(STRING_SIZE), nullable=False)
        timer = db.Column(db.Integer, nullable=False)
        slide_id = db.Column(db.Integer, db.ForeignKey("slide.id"), nullable=False)
    
        slide = db.relationship("Slide", foreign_keys=[slide_id], uselist=False)
    
        def __init__(self, name, title, timer, slide_id):
            self.name = name
            self.title = title
            self.timer = timer
            self.slide_id = slide_id
    
    
    class TrueFalseQuestion(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        true_false = db.Column(db.Boolean, nullable=False, default=False)
        question_id = db.Column(db.Integer, db.ForeignKey("question.id"), nullable=False)
    
        question = db.relationship("Question", foreign_keys=[question_id], uselist=False)
    
        def __init__(self, true_false, question_id):
            self.true_false = true_false
            self.question_id = question_id
    
    
    class TextQuestion(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        question_id = db.Column(db.Integer, db.ForeignKey("question.id"), nullable=False)
        question = db.relationship("Question", foreign_keys=[question_id], uselist=False)
    
        def __init__(self, question_id):
            self.question_id = question_id
    
    
    class TextQuestionAlternative(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        text = db.Column(db.String(STRING_SIZE), nullable=False)
        text_question_id = db.Column(db.Integer, db.ForeignKey("text_question.id"), nullable=False)
        text_question = db.relationship("TextQuestion", foreign_keys=[text_question_id], uselist=False)
    
        def __init__(self, text, text_question_id):
            self.text = text
            self.text_question_id = text_question_id
    
    
    class MCQuestion(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(STRING_SIZE), nullable=False)
        timer = db.Column(db.Integer, nullable=False)
        question_id = db.Column(db.Integer, db.ForeignKey("question.id"), nullable=False)
    
        question = db.relationship("Question", foreign_keys=[question_id], uselist=False)
    
        def __init__(self, title, timer, slide_id):
            self.title = title
            self.timer = timer
            self.slide_id = slide_id
    
    
    class MCQuestionAlternative(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        text = db.Column(db.String(STRING_SIZE), nullable=False)
        true_false = db.Column(db.Boolean, nullable=False, default=False)
        mc_id = db.Column(db.Integer, db.ForeignKey("mc_question.id"), nullable=False)
    
        mc = db.relationship("MCQuestion", foreign_keys=[mc_id], uselist=False)
    
        def __init__(self, text, true_false, mc_id):
            self.text = text
            self.true_false = true_false
            self.mc_id = mc_id
    
    
    class AnsweredQuestion(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        data = db.Column(db.Text, nullable=False)
        score = db.Column(db.Integer, nullable=False)
        question_id = db.Column(db.Integer, db.ForeignKey("question.id"), nullable=False)
        team_id = db.Column(db.Integer, db.ForeignKey("team.id"), nullable=False)
    
        question = db.relationship("Question", foreign_keys=[question_id], uselist=False)
        team = db.relationship("Team", foreign_keys=[team_id], uselist=False)
    
        def __init__(self, data, score, question_id, team_id):
            self.data = data
            self.score = score
            self.question_id = question_id
            self.team_id = team_id