from datetime import datetime import random from werkzeug.security import generate_password_hash, check_password_hash from flask_login import UserMixin,AnonymousUserMixin from . import db, login_manager class Permission: FOLLOW = 1 COMMENT = 2 WRITE = 4 DETECT=8 class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) default = db.Column(db.Boolean, default=False, index=True) permissions = db.Column(db.Integer) users = db.relationship('User', backref='role', lazy='dynamic') def __init__(self, **kwargs): super(Role, self).__init__(**kwargs) if self.permissions is None: self.permissions = 0 @staticmethod def insert_roles(): roles = { 'User': [Permission.FOLLOW, Permission.COMMENT, Permission.WRITE], 'Doctor': [Permission.FOLLOW, Permission.COMMENT, Permission.WRITE, Permission.DETECT, ], } default_role = 'User' for r in roles: role = Role.query.filter_by(name=r).first() if role is None: role = Role(name=r) role.reset_permissions() for perm in roles[r]: role.add_permission(perm) role.default = (role.name == default_role) db.session.add(role) db.session.commit() def add_permission(self, perm): if not self.has_permission(perm): self.permissions += perm def remove_permission(self, perm): if self.has_permission(perm): self.permissions -= perm def reset_permissions(self): self.permissions = 0 def has_permission(self, perm): return self.permissions & perm == perm def __repr__(self): return '' % self.name class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(64), unique=True, index=True) username = db.Column(db.String(64), unique=True, index=True) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) password_hash = db.Column(db.String(128)) name = db.Column(db.String(64)) location = db.Column(db.String(256)) about_me = db.Column(db.Text()) last_seen = db.Column(db.DateTime(), default=datetime.utcnow) avatar_color = db.Column(db.String(10)) has_avatar = db.Column(db.Boolean, default=False) sex = db.Column(db.String(5)) phone=db.Column(db.String(15)) age=db.Column(db.Integer) department=db.Column(db.String(128)) id_number= db.Column(db.String(64)) posts=db.relationship('Post',backref='author',lazy='dynamic') #user表与comment为1对多, 即可通过一篇文章获得一个作者(用户) comments = db.relationship('Comment', backref='author', lazy='dynamic') def __init__(self, **kwargs): super(User, self).__init__(**kwargs) if self.role is None: default_role = Role.query.filter_by(default=True).first() self.role = default_role def can(self, perm): return self.role is not None and self.role.has_permission(perm) def is_administrator(self): return self.can(Permission.ADMIN) @property def is_authenticated(self): return True if self.id else False @property def password(self): raise AttributeError('password is not a readable attribute') @password.setter def password(self, password): self.password_hash = generate_password_hash(password) def verify_password(self, password): return check_password_hash(self.password_hash, password) def get_random_color(self): colors = ['red', 'blue', 'orange','green'] return random.choice(colors) def ping(self): self.last_seen = datetime.utcnow() db.session.add(self) db.session.commit() def __repr__(self): return '' % self.username class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.Text, nullable=False) content = db.Column(db.Text, nullable=False) img_count = db.Column(db.Integer, default=0) collect_num = db.Column(db.Integer, default=0) comment_num = db.Column(db.Integer, default=0) like_num = db.Column(db.Integer, default=0) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) author_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) #一个人可以发多个文章,但每篇文章对应一个用户 comments=db.relationship('Comment',backref='post',lazy='dynamic') class AnonymousUser(AnonymousUserMixin): def can(self, permissions): return False def is_administrator(self): return False login_manager.anonymous_user = AnonymousUser @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) class Comment(db.Model): __tablename__ = 'comments' id = db.Column(db.Integer, primary_key=True) body = db.Column(db.Text) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) author_id = db.Column(db.Integer, db.ForeignKey('users.id')) post_id = db.Column(db.Integer, db.ForeignKey('posts.id')) class DocComment(db.Model): __tablename__ = 'doccomments' id = db.Column(db.Integer, primary_key=True) body = db.Column(db.Text) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) author_id = db.Column(db.Integer, db.ForeignKey('users.id')) doc_id = db.Column(db.Integer, db.ForeignKey('users.id')) star_num=db.Column(db.Integer,default=5) class Like(db.Model): __tablename__ = 'likes' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id')) post_id = db.Column(db.Integer, db.ForeignKey('posts.id')) class Collect(db.Model): __tablename__ = 'collects' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id')) post_id = db.Column(db.Integer, db.ForeignKey('posts.id')) class Feedback(db.Model): __tablename__='feedbacks' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id')) feedback=db.Column(db.Text, nullable=False) class Workday(db.Model): __tablename__ = 'workday' id = db.Column(db.Integer, primary_key=True) doc_id=db.Column(db.Integer, db.ForeignKey('users.id')) date=db.Column(db.Date, index=True) #工作日期 morning_num=db.Column(db.Integer, default=0) temp_morning=db.Column(db.Integer, default=0) afternoon_num=db.Column(db.Integer, default=0) temp_afternoon = db.Column(db.Integer, default=0) cost=db.Column(db.Integer, default=30) class Appointment(db.Model): __tablename__='appointment' id = db.Column(db.Integer, primary_key=True) patient_id = db.Column(db.Integer, db.ForeignKey('users.id')) doc_id = db.Column(db.Integer, db.ForeignKey('users.id')) date=db.Column(db.Date, index=True) #预约日期 time=db.Column(db.Integer, default=-1) email = db.Column(db.String(256), index=True) id_number = db.Column(db.String(256)) name = db.Column(db.String(256)) gender = db.Column(db.String(256)) location = db.Column(db.String(256)) phone = db.Column(db.String(256)) age = db.Column(db.Integer) cost=db.Column(db.Integer) num = db.Column(db.Integer) class Call_number(db.Model): __tablename__ = 'call_numbers' id=db.Column(db.Integer, primary_key=True) appointment_id = db.Column(db.Integer, db.ForeignKey('appointment.id'), unique=True) notified = db.Column(db.Boolean, default=False) call_time=db.Column(db.DateTime, default=datetime.utcnow) class Report(db.Model): __tablename__='reports' id = db.Column(db.Integer, primary_key=True) appointment_id = db.Column(db.Integer, db.ForeignKey('appointment.id'), unique=True) diagnosis_result=db.Column(db.String(256)) diagnosis_date=db.Column(db.String(64)) diagnosis_advice=db.Column(db.Text, nullable=False) diagnosis_sign=db.Column(db.String(64)) class Private_message(db.Model): __tablename__ = 'private_messages' id = db.Column(db.Integer, primary_key=True) sender_id = db.Column(db.Integer, db.ForeignKey('users.id')) recipient_id= db.Column(db.Integer, db.ForeignKey('users.id')) body=db.Column(db.Text) time = db.Column(db.DateTime, default=datetime.now)