class Solution(db.Model):
    __tablename__ = 'solutions'

    solution_id = db.Column(db.Integer, primary_key=True)
    file_id = db.Column(db.Integer, db.ForeignKey('savefiles.file_id'))
    user_id = db.Column(db.Integer, db.ForeignKey('users.user_id'))
    level_id = db.Column(db.Integer, db.ForeignKey('levels.level_id'))
    cycle_count = db.Column(db.Integer)
    symbol_count = db.Column(db.Integer)
    reactor_count = db.Column(db.Integer)
    upload_time = db.Column(db.DateTime, default=func.now())
    description = db.Column(db.String(255))
    youtube = db.Column(db.String(255))
    approved = db.Column(db.Boolean, default=True)

    savefile = db.relationship('SaveFile', backref='solutions')
    user = db.relationship('User', backref='solutions')
    level = db.relationship('Level', backref='solutions')

    def __init__(self,
                 file_id,
                 user_id,
                 level_id,
                 cycle_count,
                 symbol_count,
                 reactor_count,
                 approved=True):
        self.file_id = file_id
        self.user_id = user_id
        self.level_id = level_id
        self.cycle_count = cycle_count
        self.symbol_count = symbol_count
        self.reactor_count = reactor_count
        self.approved = approved
class OfficialScores(db.Model):
    __tablename__ = 'official_scores'

    level_id = db.Column(db.Integer,
                         db.ForeignKey('levels.level_id'),
                         primary_key=True)
    fetch_date = db.Column(db.Date, primary_key=True, default=func.now())
    reactor_counts = db.Column(db.String(255))
    symbol_counts = db.Column(db.String(255))
    cycle_counts = db.Column(db.String(255))

    level = db.relationship('Level', backref='official_scores')
class Level(db.Model):
    __tablename__ = 'levels'

    level_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255))
    internal_name = db.Column(db.String(255))
    number = db.Column(db.String(5))
    slug = db.Column(db.String(255))
    order1 = db.Column(db.Integer)
    order2 = db.Column(db.Integer)
    category = db.Column(db.String(255))
    outside_view = db.Column(db.Boolean, default=False)
class User(db.Model):
    __tablename__ = 'users'

    user_id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(30))
    email = db.Column(db.String(255))
    password = db.Column(db.String(255))

    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.set_password(password)

    def set_password(self, password):
        self.password = password  #bcrypt.hashpw(password, bcrypt.gensalt())

    def check_password(self, password):
        return password == self.password  # bcrypt.hashpw(password, self.password)
示例#5
0
class User(db.Model):
    __tablename__ = 'users'

    user_id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(30))
    email = db.Column(db.String(255))
    password = db.Column(db.String(255))

    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.set_password(password)

    def set_password(self, pw):
        pwhash = bcrypt.hashpw(pw.encode('utf8'), bcrypt.gensalt())
        self.password = pwhash.decode('utf8')

    def check_password(self, password):
        return bcrypt.checkpw(password.encode('utf8'),
                              self.password.encode('utf8'))
class FixedComponent(db.Model):
    __tablename__ = 'components_fixed'

    fixedcomponent_id = db.Column(db.Integer, primary_key=True)
    level_id = db.Column(db.Integer, db.ForeignKey('levels.level_id'))
    type = db.Column(db.String(255))
    x = db.Column(db.Integer)
    y = db.Column(db.Integer)

    level = db.relationship('Level',
                            backref=db.backref(
                                'fixedcomponents',
                                order_by=(x, y),
                                cascade='save-update, merge, delete'))
class Component(db.Model):
    __tablename__ = 'components'

    component_id = db.Column(db.Integer, primary_key=True)
    solution_id = db.Column(db.Integer, db.ForeignKey('solutions.solution_id'))
    type = db.Column(db.String(255))
    x = db.Column(db.Integer)
    y = db.Column(db.Integer)

    solution = db.relationship('Solution',
                               backref=db.backref(
                                   'components',
                                   order_by=(x, y),
                                   cascade='save-update, merge, delete'))

    def __init__(self, solution_id, type, x, y):
        self.solution_id = solution_id
        self.type = type
        self.x = x
        self.y = y
class Member(db.Model):
    __tablename__ = 'members'

    member_id = db.Column(db.Integer, primary_key=True)
    component_id = db.Column(db.Integer,
                             db.ForeignKey('components.component_id'))
    type = db.Column(db.String(255))
    arrow_dir = db.Column(db.Integer)
    choice = db.Column(db.Integer)
    layer = db.Column(db.Integer)
    x = db.Column(db.Integer)
    y = db.Column(db.Integer)
    element_type = db.Column(db.Integer)
    element = db.Column(db.Integer)

    component = db.relationship('Component',
                                backref=db.backref(
                                    'members',
                                    cascade='save-update, merge, delete'))

    @property
    def color(self):
        if self.layer in (16, 32):
            return "blue"
        elif self.layer in (64, 128):
            return "red"
        else:
            return "feature"

    ARROW_DIRS = {180: "l", -90: "u", 0: "r", 90: "d"}
    ELEMENTS = str.split(
        'XX H He Li Be B C N O F Ne Na Mg Al Si P S Cl Ar K '
        'Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr '
        'Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe '
        'Cs Ba La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu '
        'Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn Fr Ra '
        'Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr Rf Db Sg '
        'Bh Hs Mt')

    def __init__(self, component_id, type, arrow_dir, choice, layer, x, y,
                 element_type, element):
        self.component_id = component_id
        self.type = type
        self.arrow_dir = arrow_dir
        self.choice = choice
        self.layer = layer
        self.x = x
        self.y = y
        self.element_type = element_type
        self.element = element

    @property
    def image_name(self):
        variant = ""

        if self.type == "feature-bonder":
            return "feature-bonder.png"
        elif self.type == "feature-bonder-minus":
            return "feature-bonder_minus.png"
        elif self.type == "feature-bonder-plus":
            return "feature-bonder_plus.png"
        elif self.type == "feature-fuser":
            return "feature-fuser.png"
        elif self.type == "feature-sensor":
            return "feature-sensor.png"
        elif self.type == "feature-splitter":
            return "feature-splitter.png"
        elif self.type == "feature-tunnel":
            return "feature-tunnel.png"
        elif self.type == "instr-arrow":
            return self.color + "-arrow_" + self.ARROW_DIRS[
                self.arrow_dir] + ".png"
        elif self.type == "instr-bond":
            if self.choice == 0:
                variant = "_plus"
            elif self.choice == 1:
                variant = "_minus"
            return self.color + "-bond" + variant + ".png"
        elif self.type == "instr-control":
            if self.choice == 0:
                variant = "a"
            elif self.choice == 1:
                variant = "b"
            elif self.choice == 2:
                variant = "c"
            elif self.choice == 3:
                variant = "d"
            return self.color + "-control_" + variant + "_" + self.ARROW_DIRS[
                self.arrow_dir] + ".png"
        elif self.type == "instr-debug":
            return self.color + "-debug.png"
        elif self.type == "instr-fuse":
            return self.color + "-fuse.png"
        elif self.type == "instr-grab":
            if self.choice == 0:
                variant = "grab_drop"
            elif self.choice == 1:
                variant = "grab"
            elif self.choice == 2:
                variant = "drop"
            return self.color + "-" + variant + ".png"
        elif self.type == "instr-input":
            if self.choice == 0:
                variant = "1"
            elif self.choice == 1:
                variant = "2"
            return self.color + "-in_" + variant + ".png"
        elif self.type == "instr-output":
            if self.choice == 0:
                variant = "1"
            elif self.choice == 1:
                variant = "2"
            return self.color + "-out_" + variant + ".png"
        elif self.type == "instr-rotate":
            if self.choice == 0:
                variant = "cw"
            elif self.choice == 1:
                variant = "ccw"
            return self.color + "-rotate_" + variant + ".png"
        elif self.type == "instr-sensor":
            return self.color + "-sensor_" + self.ARROW_DIRS[
                self.arrow_dir] + ".png"
        elif self.type == "instr-split":
            return self.color + "-split.png"
        elif self.type == "instr-start":
            return self.color + "-start_" + self.ARROW_DIRS[
                self.arrow_dir] + ".png"
        elif self.type == "instr-swap":
            return self.color + "-swap.png"
        elif self.type == "instr-sync":
            return self.color + "-sync.png"
        elif self.type == "instr-toggle":
            return self.color + "-toggle_" + self.ARROW_DIRS[
                self.arrow_dir] + ".png"
class Leaderboard(db.Model):
    __tablename__ = 'leaderboards'

    leaderboard_id = db.Column(db.Integer, primary_key=True)
    slug = db.Column(db.String(255))
    description = db.Column(db.String(255))