class Tag(db.Model): '''finger-style, classic songs, etude, new hot songs''' __tablename__ = 'tag' id = db.Column(db.String(50), primary_key=True, unique=True) name = db.Column(db.String, nullable=False) update_time = db.Column(db.String(20)) def __init__(self, id, name): self.id = id self.name = name self.update_time = time.strftime('%Y-%m-%d %H:%M:%S') def __repr__(self): return '<Tag %r>' % self.name
class TabFile(db.Model): __tablename__ = 'tabfile' id = db.Column(db.String(50), primary_key=True, unique=True) filename = db.Column(db.String(200), nullable=False) update_time = db.Column(db.String(20), nullable=False) tab_id = db.Column(db.String(50), db.ForeignKey('tab.id', ondelete='CASCADE')) def __init__(self, id, tab_id, filename): self.id = id self.tab_id = tab_id self.filename = filename self.update_time = strftime('%Y-%m-%d %H:%M:%S') def __repr__(self): return '<TabFile %r %r>' % (self.id, self.file_basename) @property def file_relpath(self): return os.path.join(current_app.config['TAB_FILE_FOLDER'], self.tab_id, self.filename) @property def file_abspath(self): return os.path.join(get_tabfile_upload_abspath(), self.tab_id, self.filename) @property def file_basename(self): return self.filename.split('/')[-1] @property def serialize(self): """Return object data in easily serializeable format""" return { 'id': self.id, 'tab_id': self.tab_id, 'update_time': self.update_time, 'file_basename': self.file_basename, 'file_relpath': self.file_relpath }
class Administrator(db.Model): __tablename__ = 'administrator' id = db.Column(db.String(50), primary_key=True, unique=True) name = db.Column(db.String(50), nullable=False) email = db.Column(db.String, nullable=False) password = db.Column(db.String, nullable=False) status = db.Column(db.Integer, nullable=False, default=1) def __init__(self, id, name, email, password, status): self.id = id self.name = name self.email = email self.password = password self.status = status def check_password(self, password): return check_password_hash(self.password, password) def update_password(self, new_password): self.password = generate_password_hash(new_password, salt_length=8) def is_authenticated(self): return True def is_active(self): return self.status def is_anonymous(self): return False def get_id(self): return self.id def __repr__(self): return '<AdminUser %r>' % self.name
class Artist(db.Model): __tablename__ = 'artist' id = db.Column(db.String(50), primary_key=True, unique=True) name = db.Column(db.String(50), nullable=False) letter = db.Column(db.String(5), nullable=False, index=True) photo = db.Column(db.String) region_id = db.Column(db.Integer, nullable=False, default=1) category_id = db.Column(db.Integer, nullable=False, default=1) update_time = db.Column(db.String(20), nullable=False, index=True) tabs = db.relationship('Tab', backref='artist', cascade='all,delete-orphan', lazy='dynamic') def __init__(self, id, name, letter, photo, region_id, category_id): self.id = id self.name = name self.letter = letter self.photo = photo self.category_id = category_id self.region_id = region_id self.update_time = time.strftime('%Y-%m-%d %H:%M:%S') def __repr__(self): return '<Artist %r>' % self.name @property def region_text(self): return ArtistRegion.get_item_text(self.region_id) @property def category_text(self): return ArtistCategory.get_item_text(self.category_id) @property def photo_relative_path(self): nophoto_path = url_for('static', filename='images/nophoto.png') if self.photo == '': return nophoto_path photo_path = os.path.join(current_app.config['ARTIST_PHOTO_FOLDER'], self.photo) if os.path.isfile(oshelper.get_abspath(photo_path)): return photo_path else: return nophoto_path @property def serialize(self): """Return object data in easily serializeable format""" return { 'id': self.id, 'name': self.name, 'letter': self.letter, 'category_id': self.category_id, 'category_text': self.category_text, 'region_id': self.region_id, 'region_text': self.region_text, 'photo_relative_path': self.photo_relative_path, 'update_time': self.update_time }
class Tab(db.Model): __tablename__ = 'tab' id = db.Column(db.String(50), primary_key=True, unique=True) title = db.Column(db.String(50), nullable=False) audio_url = db.Column(db.String) format_id = db.Column(db.Integer, nullable=False) difficulty_id = db.Column(db.Integer, nullable=False, default=1) style_id = db.Column(db.Integer, nullable=False, default=1) artist_id = db.Column(db.String(50), db.ForeignKey('artist.id'), index=True) hits = db.Column(db.Integer, nullable=False, index=True, default=0) update_time = db.Column(db.String(20), nullable=False, index=True) tags = db.relationship('Tag', secondary=tag_tab, backref='tabs', lazy='dynamic', passive_deletes=True) tabfiles = db.relationship('TabFile', backref='tab', cascade='all,delete-orphan', lazy='dynamic', passive_deletes=True) def __init__(self, id, title, format_id, artist_id, difficulty_id, style_id, audio_url, tags): self.id = id self.title = title self.format_id = format_id self.artist_id = artist_id self.difficulty_id = difficulty_id self.style_id = style_id self.audio_url = audio_url self.hit = 0 self.update_time = time.strftime('%Y-%m-%d %H:%M:%S') if tags: self.set_tags(tags) def __repr__(self): return '<Tab %r>' % self.title @property def difficulty_text(self): return DifficultyDegree.get_item_text(self.difficulty_id) @property def style_text(self): return MusicStyle.get_item_text(self.style_id) @property def format_text(self): return TabFormat.get_item_text(self.format_id) def set_tags(self, value): if self.tags: for tag in self.tags: self.tags.remove(tag) if value: for tag in value: self.append_tag(tag) def append_tag(self, tag): if tag and isinstance(tag, Tag): # reload tag by id to void error that <object xxx is already attached in session> renew_tag = Tag.query.get(tag.id) if tag: self.tags.append(renew_tag)
#!/usr/bin/env python # -*- coding: utf-8 -*- import time from guitarfan.extensions.flasksqlalchemy import db from guitarfan.models.tag import Tag from enums import * # tag-tab link table tag_tab = db.Table( 'tag_tab', db.Column('tag_id', db.Integer, db.ForeignKey('tag.id', ondelete='CASCADE'), index=True), db.Column('tab_id', db.Integer, db.ForeignKey('tab.id', ondelete='CASCADE'), index=True)) class Tab(db.Model): __tablename__ = 'tab' id = db.Column(db.String(50), primary_key=True, unique=True) title = db.Column(db.String(50), nullable=False) audio_url = db.Column(db.String) format_id = db.Column(db.Integer, nullable=False) difficulty_id = db.Column(db.Integer, nullable=False, default=1) style_id = db.Column(db.Integer, nullable=False, default=1) artist_id = db.Column(db.String(50),