models.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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-12-17 09:13:38 (CST)
  9. # Last Update:星期六 2017-3-25 18:17:15 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask_maple.models import db, ModelMixin
  14. from sqlalchemy import event
  15. from sqlalchemy.orm import object_session
  16. from forums.api.user.models import User
  17. group_user = db.Table(
  18. 'group_user',
  19. db.Column('group_id', db.Integer, db.ForeignKey('groups.id')),
  20. db.Column('user_id', db.Integer, db.ForeignKey('users.id')))
  21. group_permission = db.Table(
  22. 'group_permission',
  23. db.Column('group_id', db.Integer, db.ForeignKey('groups.id')),
  24. db.Column('permission_id', db.Integer, db.ForeignKey('permissions.id')))
  25. router_permission = db.Table(
  26. 'router_permission',
  27. db.Column('router_id', db.Integer, db.ForeignKey('routers.id')),
  28. db.Column('permission_id', db.Integer, db.ForeignKey('permissions.id')))
  29. class Permission(db.Model, ModelMixin):
  30. __tablename__ = 'permissions'
  31. METHOD_GET = '0'
  32. METHOD_POST = '1'
  33. METHOD_PUT = '2'
  34. METHOD_DELETE = '3'
  35. METHOD_PATCH = '4'
  36. METHOD_ALL = '5'
  37. METHOD = (('0', 'GET 方式'), ('1', 'POST 方式'), ('2', 'PUT 方式'),
  38. ('3', 'DELETE 方式'), ('4', 'PATCH 方式'), ('5', '所有方式'))
  39. PERMISSION_DENY = '0'
  40. PERMISSION_ALLOW = '1'
  41. PERMISSION = (('0', '禁止'), ('1', '允许'))
  42. id = db.Column(db.Integer, primary_key=True)
  43. name = db.Column(db.String(512), nullable=False, unique=True)
  44. allow = db.Column(db.String(10), nullable=False, default=PERMISSION_ALLOW)
  45. method = db.Column(db.String(16), nullable=False, default=METHOD_GET)
  46. def __str__(self):
  47. return self.name
  48. def __repr__(self):
  49. return "<Permission %r>" % self.name
  50. def is_allowed(self):
  51. if self.allow == self.PERMISSION_ALLOW:
  52. return True
  53. return False
  54. def is_denied(self):
  55. if self.allow == self.PERMISSION_DENY:
  56. return True
  57. return False
  58. # class Callback(db.Model, ModelMixin):
  59. # __tablename__ = 'callbacks'
  60. # CALLBACK_TYPE_HTTP = '0'
  61. # CALLBACK_TYPE_JSON = '1'
  62. # CALLBACK_TYPE_REDIRECT = '2'
  63. # CALLBACK_TYPE = (('0', '403 Forbidden'), ('1', 'Json'), ('2', 'Redirect'))
  64. # id = db.Column(db.Integer, primary_key=True)
  65. # callback = db.Column(db.String(512), nullable=False, unique=True)
  66. # callback_type = db.Column(
  67. # db.String(10), nullable=False, default=CALLBACK_TYPE_HTTP)
  68. # description = db.Column(db.String(128), nullable=True)
  69. # def __str__(self):
  70. # return self.callback
  71. # def __repr__(self):
  72. # return "<Callback %r>" % self.callback
  73. class Group(db.Model, ModelMixin):
  74. __tablename__ = 'groups'
  75. id = db.Column(db.Integer, primary_key=True)
  76. name = db.Column(db.String(512), nullable=False, unique=True)
  77. permissions = db.relationship(
  78. Permission,
  79. secondary=group_permission,
  80. backref=db.backref(
  81. 'groups', lazy='dynamic'),
  82. lazy='dynamic')
  83. users = db.relationship(
  84. User,
  85. secondary=group_user,
  86. backref=db.backref(
  87. 'groups', lazy='dynamic'),
  88. lazy='dynamic')
  89. def __str__(self):
  90. return self.name
  91. def __repr__(self):
  92. return "<Group %r>" % self.name
  93. def get_permissions(self):
  94. return self.permissions.all()
  95. def has_perm(self, perm):
  96. if perm in self.get_permissions():
  97. return True
  98. return False
  99. def has_perms(self, perm_list):
  100. router_perm_list = set(perm_list)
  101. group_perm_list = set(self.get_permissions())
  102. common_perm_list = router_perm_list & group_perm_list
  103. if not common_perm_list:
  104. return False
  105. return True
  106. class Router(db.Model, ModelMixin):
  107. __tablename__ = 'routers'
  108. URL_TYPE_HTTP = '0'
  109. URL_TYPE_ENDPOINT = '1'
  110. URL_TYPE = (('0', 'HTTP'), ('1', 'Endpoint'))
  111. id = db.Column(db.Integer, primary_key=True)
  112. url = db.Column(db.String(512), nullable=False, unique=True)
  113. url_type = db.Column(db.String(10), nullable=False, default=URL_TYPE_HTTP)
  114. description = db.Column(db.String(128), nullable=True)
  115. # callback_id = db.Column(db.Integer, db.ForeignKey('callbacks.id'))
  116. # callback = db.relationship(
  117. # Callback, backref=db.backref(
  118. # 'routers', lazy='dynamic'),
  119. # lazy='joined')
  120. permissions = db.relationship(
  121. Permission,
  122. secondary=router_permission,
  123. backref=db.backref(
  124. 'routers', lazy='dynamic'),
  125. lazy='dynamic')
  126. def __repr__(self):
  127. return "<Router %r>" % self.url
  128. def _get_filter_dict(self, method):
  129. filter_dict = {}
  130. if method == "HEAD":
  131. method = "GET"
  132. if hasattr(Permission, 'METHOD_' + method):
  133. filter_dict.update(method=getattr(Permission, 'METHOD_' + method))
  134. return filter_dict
  135. def get_permissions(self):
  136. return self.permissions.all()
  137. def get_allow_permissions(self):
  138. return self.permissions.filter_by(
  139. allow=Permission.PERMISSION_ALLOW).all()
  140. def get_deny_permissions(self):
  141. return self.permissions.filter_by(allow=Permission.PERMISSION_DENY)
  142. def get_method_permissions(self, method):
  143. filter_dict = self._get_filter_dict(method)
  144. return self.permissions.filter_by(**filter_dict).all()
  145. def get_allow_method_permissions(self, method):
  146. filter_dict = self._get_filter_dict(method)
  147. filter_dict.update(allow=Permission.PERMISSION_ALLOW)
  148. return self.permissions.filter_by(**filter_dict).all()
  149. def get_deny_method_permissions(self, method):
  150. filter_dict = self._get_filter_dict(method)
  151. filter_dict.update(allow=Permission.PERMISSION_DENY)
  152. return self.permissions.filter_by(**filter_dict).all()
  153. @event.listens_for(Group, 'after_insert')
  154. def add_group_permission(mapper, connection, target):
  155. method_list = ['GET', 'POST', 'PUT', 'DELETE']
  156. perm_list = []
  157. for method in method_list:
  158. name = target.name + '组' + '允许' + method + '请求'
  159. perm = Permission.query.filter_by(name=name).first()
  160. if perm is None:
  161. perm = Permission()
  162. perm.name = name
  163. perm.allow = Permission.PERMISSION_ALLOW
  164. perm.method = getattr(Permission, 'METHOD_' + method)
  165. object_session(target).add(perm)
  166. perm_list.append(perm)
  167. name = target.name + '组' + '禁止' + method + '请求'
  168. perm = Permission.query.filter_by(name=name).first()
  169. if perm is None:
  170. perm = Permission()
  171. perm.name = name
  172. perm.allow = Permission.PERMISSION_DENY
  173. perm.method = getattr(Permission, 'METHOD_' + method)
  174. object_session(target).add(perm)
  175. perm_list.append(perm)
  176. for perm in perm_list:
  177. target.permissions.append(perm)
  178. @event.listens_for(Group, 'before_delete')
  179. def delete_group_permission(mapper, connection, target):
  180. method_list = ['GET', 'POST', 'PUT', 'DELETE']
  181. for method in method_list:
  182. name = target.name + '组' + '允许' + method + '请求'
  183. perm = Permission.query.filter_by(
  184. name=name, allow=Permission.PERMISSION_ALLOW).first()
  185. if perm is not None:
  186. object_session(target).delete(perm)
  187. name = target.name + '组' + '禁止' + method + '请求'
  188. perm = Permission.query.filter_by(
  189. name=name, allow=Permission.PERMISSION_DENY).first()
  190. if perm is not None:
  191. object_session(target).delete(perm)