231 lines
8.4 KiB
Python
231 lines
8.4 KiB
Python
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 '<Role %r>' % 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 '<User %r>' % 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) |