class Witness(Model): __tablename__ = 'witness' address = Column(db.String(255), primary_key=True) name = Column(db.String(255)) address_b58c = Column(db.String(64)) def __str__(self): return '(%s, %s, %s)' % (self.name, self.address_b58c, self.address)
class Block(Model): __tablename__ = 'block' number = Column(db.Integer, primary_key=True) witness_address = Column(db.String(255)) timestamp = Column(db.BigInteger) blockid = Column(db.String(255)) parenthash = Column(db.String(255)) version = Column(db.Integer) utc0time = db.Column(db.DateTime, default=func.from_unixtime(timestamp))
class WitnessSchedule(SurrogatePK, Model): __tablename__ = 'witness_schedule' timestamp_start = Column(db.Integer) timestamp_end = Column(db.Integer) witness_list = Column(db.String(4096)) block_number_start = Column(db.Integer) block_number_end = Column(db.Integer)
class TireModel(db.Model): __tablename__ = 'tire' tire_id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) bike_id = db.Column(UUID(as_uuid=True), db.ForeignKey('bike.bike_id'), nullable=False) active = db.Column(db.Boolean, nullable=True, default=False) rim = db.Column(db.String(15), nullable=True) category = db.Column(db.String(5), nullable=False) manufacturer = db.Column(db.String(15), nullable=False) name = db.Column(db.String(25), nullable=True) compound = db.Column(db.String(10), nullable=True) axis = db.Column(db.String(5), nullable=False) dimension = db.Column(db.String(15), nullable=True) dot = db.Column(db.String(4), nullable=False) condition = db.Column(JSON, nullable=False, default={ "left_outer": 1.0, "left_middle": 1.0, "center": 1.0, "right_middle": 1.0, "right_outer": 1.0 }) operating_hours = db.Column(db.Float, nullable=False) comment = db.Column(db.Text, nullable=True) datetime_created = db.Column(db.DateTime, nullable=False, default=db.utcnow) datetime_last_modified = db.Column(db.DateTime, nullable=False, default=db.utcnow, onupdate=db.utcnow) def __repr__(self): return f"Maintenance[" \ f"'{self.maintenance_id}': (" \ f"'{self.category}', " \ f"'{self.name}', " \ f"'{self.interval_amount}', " \ f"'{self.interval_unit}', " \ f"'{self.interval_type}'" \ f")]"
class SessionModel(db.Model): __tablename__ = 'session' session_id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) training_id = db.Column(UUID(as_uuid=True), db.ForeignKey('training.training_id'), nullable=False) setup_id = db.Column(UUID(as_uuid=True), db.ForeignKey('setup.setup_id'), nullable=True) bike_id = db.Column(UUID(as_uuid=True), db.ForeignKey('bike.bike_id'), nullable=True) application = db.Column(db.String(50), nullable=True) datetime_created = db.Column(db.DateTime, nullable=False, default=db.utcnow) datetime_last_modified = db.Column(db.DateTime, nullable=False, default=db.utcnow, onupdate=db.utcnow) datetime_display = db.Column(db.DateTime, nullable=False, default=db.utcnow) bike = db.relationship('BikeModel', backref=db.backref( 'sessions', order_by='SessionModel.datetime_display.asc()')) training = db.relationship( 'TrainingModel', backref=db.backref('sessions', order_by='SessionModel.datetime_display.asc()')) setup = db.relationship( 'SetupModel', backref=db.backref('sessions', order_by='SessionModel.datetime_display.asc()')) def __repr__(self): return f"Session[" \ f"'{self.session_id}': (" \ f"'{self.datetime_display}', " \ f"training_id: '{self.training_id}', " \ f"bike_id: '{self.bike_id}', " \ f"setup_id: '{self.setup_id}', " \ f")]"
class MaintenanceModel(db.Model): __tablename__ = 'maintenance' maintenance_id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) bike_id = db.Column(UUID(as_uuid=True), db.ForeignKey('bike.bike_id'), nullable=False) category = db.Column(db.String(20), nullable=False) name = db.Column(db.String(100), unique=True, nullable=False) interval_type = db.Column(db.String(25), nullable=False) interval_amount = db.Column(db.Float, nullable=True) interval_unit = db.Column(db.String(25), nullable=True) tags_default = db.Column(ARRAY(db.String), nullable=True) datetime_created = db.Column(db.DateTime, nullable=False, default=db.utcnow) datetime_last_modified = db.Column(db.DateTime, nullable=False, default=db.utcnow, onupdate=db.utcnow) def __repr__(self): return f"Maintenance[" \ f"'{self.maintenance_id}': (" \ f"'{self.category}', " \ f"'{self.name}', " \ f"'{self.interval_amount}', " \ f"'{self.interval_unit}', " \ f"'{self.interval_type}'" \ f")]"
class CoachModel(db.Model): __tablename__ = 'coach' coach_id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) category = db.Column(db.String(6), nullable=False) symptom = db.Column(db.JSON, nullable=False) notes = db.Column(db.Text, nullable=True) questions = db.Column(ARRAY(db.String), nullable=True, default=[]) advice = db.Column(JSON, nullable=False) datetime_created = db.Column(db.DateTime, nullable=False, default=db.utcnow) datetime_last_modified = db.Column(db.DateTime, nullable=False, default=db.utcnow, onupdate=db.utcnow) def __repr__(self): return f"Coach[" \ f"'{self.coach_id}': (" \ f"'{self.category}', " \ f"'{self.symptom}'" \ f")]"
class BikeModel(db.Model): __tablename__ = 'bike' bike_id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) operating_hours = db.Column(db.Float, nullable=False) manufacturer = db.Column(db.String(15), nullable=False) model = db.Column(db.String(15), nullable=False) year = db.Column(db.Integer, nullable=False) ccm = db.Column(db.Float, nullable=True) stroke = db.Column(db.Float, nullable=True) piston = db.Column(db.Float, nullable=True) slick_front_name = db.Column(db.String(50), nullable=True) slick_front_notes = db.Column(db.Text, nullable=True) slick_front_pressure = db.Column(JSON, default=[], nullable=False) slick_rear_name = db.Column(db.String(50), nullable=True) slick_rear_notes = db.Column(db.Text, nullable=True) slick_rear_pressure = db.Column(JSON, default=[], nullable=False) rain_front_name = db.Column(db.String(50), nullable=True) rain_front_notes = db.Column(db.Text, nullable=True) rain_front_pressure = db.Column(JSON, default=[], nullable=False) rain_rear_name = db.Column(db.String(50), nullable=True) rain_rear_notes = db.Column(db.Text, nullable=True) rain_rear_pressure = db.Column(JSON, default=[], nullable=False) setup = db.Column(JSON, default=[], nullable=False) datetime_created = db.Column(db.DateTime, nullable=False, default=db.utcnow) datetime_last_modified = db.Column(db.DateTime, nullable=False, default=db.utcnow, onupdate=db.utcnow) def __repr__(self): return f"Bike[" \ f"'{self.bike_id}': (" \ f"'{self.manufacturer}', " \ f"'{self.model}', " \ f"'{self.year}', " \ f"'{self.operating_hours}'h" \ f")]"
class User(db.Model): __tablename__ = 'user' id = db.Column(UUIDType(), primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) hash = db.Column(db.BINARY(256), nullable=False) salt = db.Column(db.BINARY(256), nullable=False) role = db.Column(db.String(10), nullable=False) @staticmethod def new_user(username, password, role) -> 'User': if not role in roles: raise ValueError(f"Invalid role '{role}'") hash, salt = User.create_hash(password) return User( id = uuid4(), username = username, hash = hash, salt = salt, role = role ) @staticmethod def create_hash(password, salt=None) -> (bytes, bytes): if salt == None: salt = os.urandom(32) hash = hashlib.pbkdf2_hmac( 'sha256', password.encode('utf-8'), salt, 100000 ) return hash, salt @staticmethod def username_available(username) -> bool: result = User.query.filter_by(username = username).all() return len(result) == 0 def check_password(self, password) -> bool: input_hash, salt = User.create_hash(password, self.salt) return self.hash == input_hash def json(self) -> dict: return { "id": str(self.id), "username": self.username, "role": self.role } @staticmethod def get_by_id(id) -> 'User': if type(id) != UUID: try: id = UUID(id) except: raise AttributeError("Invalid UUID") query = User.query.filter_by(id=id) if query.count() == 0: raise ValueError(f"User {str(id)} not found.") return query.first() @staticmethod def get_by_username(username) -> 'User': query = User.query.filter_by(username=username) if query.count() == 0: raise ValueError(f"User '{username}' not found.") return query.first()
class Account(Model): __tablename__ = 'account' address = Column(db.String(255), primary_key=True) balance = Column(db.Integer)
class VersionModel(db.Model): id = db.Column(db.Integer, primary_key=True) version = db.Column(db.String(10))