models.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #!/usr/bin/env python
  2. # -*- coding=UTF-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: models.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-05-20 13:24:19 (CST)
  9. # Last Update:星期六 2016-7-30 13:23:46 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from maple import db
  14. from maple.tag.models import Tags
  15. from maple.mine.models import Follow
  16. from maple.topic.models import Topic
  17. from datetime import datetime
  18. from flask_login import UserMixin
  19. from werkzeug.security import (generate_password_hash, check_password_hash)
  20. __all__ = ['User', 'UserRole', 'Role', 'UserInfor', 'UserSetting', 'OpenID']
  21. class UserRole(db.Model):
  22. __tablename__ = 'user_role'
  23. id = db.Column(db.Integer, primary_key=True)
  24. user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
  25. roles_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
  26. class User(db.Model, UserMixin):
  27. __tablename__ = 'users'
  28. id = db.Column(db.Integer, primary_key=True)
  29. username = db.Column(db.String(49), unique=True)
  30. email = db.Column(db.String(81), unique=True)
  31. password = db.Column(db.String, nullable=False)
  32. is_superuser = db.Column(db.Boolean, default=False)
  33. is_confirmed = db.Column(db.Boolean, default=False)
  34. register_time = db.Column(db.DateTime, default=datetime.now())
  35. following_tags = db.relationship(
  36. 'Tags',
  37. secondary='follows',
  38. primaryjoin="User.id==follows.c.follower_id",
  39. lazy='dynamic',
  40. backref=db.backref('followers', lazy='dynamic'))
  41. following_topics = db.relationship(
  42. 'Topic',
  43. secondary='follows',
  44. primaryjoin="User.id==follows.c.follower_id",
  45. lazy='dynamic',
  46. backref=db.backref('followers', lazy='dynamic'))
  47. following_collects = db.relationship(
  48. 'Collect',
  49. secondary='follows',
  50. primaryjoin="User.id==follows.c.follower_id",
  51. lazy='dynamic',
  52. backref=db.backref('followers', lazy='dynamic'))
  53. following_users = db.relationship(
  54. 'User',
  55. secondary='follows',
  56. primaryjoin="User.id==follows.c.follower_id",
  57. secondaryjoin="User.id==follows.c.following_user_id",
  58. lazy='dynamic',
  59. backref=db.backref('followers', lazy='dynamic'), )
  60. setting_id = db.Column(db.Integer,
  61. db.ForeignKey('usersetting.id',
  62. ondelete="CASCADE"))
  63. setting = db.relationship("UserSetting",
  64. backref="user",
  65. cascade='all,delete',
  66. uselist=False)
  67. infor_id = db.Column(db.Integer,
  68. db.ForeignKey('userinfor.id',
  69. ondelete="CASCADE"))
  70. infor = db.relationship("UserInfor",
  71. backref=db.backref('user', lazy='joined'),
  72. cascade='all,delete',
  73. uselist=False)
  74. roles = db.relationship('Role',
  75. secondary='user_role',
  76. backref=db.backref('users'),
  77. lazy='dynamic')
  78. def __str__(self):
  79. return self.username
  80. def __repr__(self):
  81. return '<User %r>' % self.username
  82. # @property
  83. # def password(self):
  84. # return "密码不是可读形式!"
  85. # @password.setter
  86. # def password(self, password):
  87. # self.password_hash = generate_password_hash(password)
  88. # def verify_password(self, password):
  89. # return check_password_hash(password)
  90. @staticmethod
  91. def set_password(password):
  92. pw_hash = generate_password_hash(password)
  93. return pw_hash
  94. def check_password(self, password):
  95. return check_password_hash(self.password, password)
  96. roles_parents = db.Table(
  97. 'roles_parents',
  98. db.Column('role_id', db.Integer, db.ForeignKey('roles.id')),
  99. db.Column('parent_id', db.Integer, db.ForeignKey('roles.id')))
  100. class Role(db.Model):
  101. __tablename__ = 'roles'
  102. id = db.Column(db.Integer, primary_key=True)
  103. name = db.Column(db.String(81), nullable=False, default='unconfirmed')
  104. description = db.Column(db.String(255), nullable=True)
  105. parents = db.relationship('Role',
  106. secondary=roles_parents,
  107. primaryjoin=(id == roles_parents.c.role_id),
  108. secondaryjoin=(id == roles_parents.c.parent_id),
  109. backref=db.backref('children'))
  110. def __str__(self):
  111. return self.name
  112. def __repr__(self):
  113. return '<Role %r>' % self.name
  114. class UserInfor(db.Model):
  115. __tablename__ = 'userinfor'
  116. id = db.Column(db.Integer, primary_key=True)
  117. # confirmed_time = db.Column(db.DateTime, nullable=True)
  118. # registered_time = db.Column(db.DateTime, nullable=False)
  119. # score = db.Column(db.Integer, nullable=False, default=100)
  120. avatar = db.Column(db.String)
  121. word = db.Column(db.Text, nullable=True)
  122. introduce = db.Column(db.Text, nullable=True)
  123. school = db.Column(db.String, nullable=True)
  124. def __repr__(self):
  125. return "<UserInfor %r>" % self.id
  126. class UserSetting(db.Model):
  127. '''
  128. 1:all user
  129. 2:logined user
  130. 3:only own
  131. '''
  132. __tablename__ = 'usersetting'
  133. id = db.Column(db.Integer, primary_key=True)
  134. online_status = db.Column(db.Integer, nullable=False, default=1)
  135. topic_list = db.Column(db.Integer, nullable=False, default=1)
  136. rep_list = db.Column(db.Integer, nullable=False, default=1)
  137. ntb_list = db.Column(db.Integer, nullable=False, default=3)
  138. collect_list = db.Column(db.Integer, nullable=False, default=2)
  139. locale = db.Column(db.String(32), default='zh')
  140. timezone = db.Column(db.String(32), default='UTC')
  141. def __repr__(self):
  142. return "<UserSetting %r>" % self.id
  143. # class OpenID(db.Model):
  144. # __tablename__ = 'openids'
  145. # id = db.Column(db.Integer, primary_key=True)
  146. # openid = db.Column(db.Integer, nullable=False)
  147. # openid_type = db.Column(db.String, nullable=False)
  148. # nickname = db.Column(db.String, nullable=False)
  149. # email = db.Column(db.String)
  150. # avatar = db.Column(db.String)
  151. # user_id = db.Column(db.Integer,
  152. # db.ForeignKey('users.id',
  153. # ondelete="CASCADE"))
  154. # user = db.relationship('User',
  155. # backref=db.backref('openids',
  156. # cascade='all,delete-orphan',
  157. # lazy='dynamic'))
  158. from . import events