models.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from public import db
  2. from libs.model import ModelMixin
  3. import datetime
  4. from werkzeug.security import generate_password_hash, check_password_hash
  5. from sqlalchemy import text
  6. class User(db.Model, ModelMixin):
  7. __tablename__ = 'account_users'
  8. id = db.Column(db.Integer, primary_key=True)
  9. role_id = db.Column(db.Integer, db.ForeignKey('account_roles.id'))
  10. username = db.Column(db.String(50), unique=True, nullable=False)
  11. nickname = db.Column(db.String(50))
  12. password_hash = db.Column(db.String(100), nullable=False)
  13. email = db.Column(db.String(120))
  14. mobile = db.Column(db.String(30))
  15. is_supper = db.Column(db.Boolean, default=False)
  16. is_active = db.Column(db.Boolean, default=True)
  17. access_token = db.Column(db.String(32))
  18. token_expired = db.Column(db.Integer)
  19. role = db.relationship('Role')
  20. @property
  21. def password(self):
  22. raise AttributeError('password only can write')
  23. @password.setter
  24. def password(self, plain):
  25. self.password_hash = generate_password_hash(plain)
  26. @property
  27. def permissions(self):
  28. if self.is_supper:
  29. return set()
  30. return Role.get_permissions(self.role_id)
  31. def verify_password(self, password):
  32. return check_password_hash(self.password_hash, password)
  33. def check_deploy_permission(self, env_id, app_id):
  34. if self.is_supper:
  35. return True
  36. env_ids = self.role.env_ids.split(',') if self.role.env_ids else []
  37. app_ids = self.role.app_ids.split(',') if self.role.app_ids else []
  38. return str(env_id) in env_ids and str(app_id) in app_ids
  39. def __repr__(self):
  40. return '<User %r>' % self.username
  41. class Role(db.Model, ModelMixin):
  42. __tablename__ = 'account_roles'
  43. id = db.Column(db.Integer, primary_key=True)
  44. name = db.Column(db.String(50), unique=True, nullable=False)
  45. desc = db.Column(db.String(255))
  46. env_ids = db.Column(db.TEXT)
  47. app_ids = db.Column(db.TEXT)
  48. @staticmethod
  49. def get_permissions(role_id):
  50. sql = text('select p.name from account_role_permission_rel r, account_permissions p where r.role_id=%d and r.permission_id=p.id' % role_id)
  51. result = db.engine.execute(sql)
  52. return {x[0] for x in result}
  53. def __repr__(self):
  54. return '<Role %r>' % self.name
  55. class Permission(db.Model, ModelMixin):
  56. __tablename__ = 'account_permissions'
  57. id = db.Column(db.Integer, primary_key=True)
  58. name = db.Column(db.String(50), unique=True, nullable=False)
  59. desc = db.Column(db.String(255))
  60. def __repr__(self):
  61. return '<Permission %r>' % self.name
  62. class RolePermissionRel(db.Model, ModelMixin):
  63. __tablename__ = 'account_role_permission_rel'
  64. __table_args__ = (
  65. db.PrimaryKeyConstraint('role_id', 'permission_id'),
  66. )
  67. role_id = db.Column(db.Integer, db.ForeignKey('account_roles.id', ondelete='CASCADE'))
  68. permission_id = db.Column(db.Integer, db.ForeignKey('account_permissions.id', ondelete='CASCADE'))