models.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import datetime
  2. from flask import g
  3. from sqlalchemy import (
  4. Boolean,
  5. Column,
  6. DateTime,
  7. ForeignKey,
  8. Index,
  9. Integer,
  10. Sequence,
  11. String,
  12. Table,
  13. UniqueConstraint,
  14. )
  15. from sqlalchemy.ext.declarative import declared_attr
  16. from sqlalchemy.orm import backref, relationship
  17. from ... import Model
  18. from ..._compat import as_unicode
  19. _dont_audit = False
  20. class Permission(Model):
  21. __tablename__ = "ab_permission"
  22. id = Column(Integer, Sequence("ab_permission_id_seq"), primary_key=True)
  23. name = Column(String(100), unique=True, nullable=False)
  24. def __repr__(self):
  25. return self.name
  26. class ViewMenu(Model):
  27. __tablename__ = "ab_view_menu"
  28. id = Column(Integer, Sequence("ab_view_menu_id_seq"), primary_key=True)
  29. name = Column(String(250), unique=True, nullable=False)
  30. def __eq__(self, other):
  31. return (isinstance(other, self.__class__)) and (self.name == other.name)
  32. def __neq__(self, other):
  33. return self.name != other.name
  34. def __repr__(self):
  35. return self.name
  36. assoc_permissionview_role = Table(
  37. "ab_permission_view_role",
  38. Model.metadata,
  39. Column("id", Integer, Sequence("ab_permission_view_role_id_seq"), primary_key=True),
  40. Column("permission_view_id", Integer, ForeignKey("ab_permission_view.id")),
  41. Column("role_id", Integer, ForeignKey("ab_role.id")),
  42. UniqueConstraint("permission_view_id", "role_id"),
  43. Index("idx_permission_view_id", "permission_view_id"),
  44. Index("idx_role_id", "role_id"),
  45. )
  46. class Role(Model):
  47. __tablename__ = "ab_role"
  48. id = Column(Integer, Sequence("ab_role_id_seq"), primary_key=True)
  49. name = Column(String(64), unique=True, nullable=False)
  50. permissions = relationship(
  51. "PermissionView",
  52. secondary=assoc_permissionview_role,
  53. backref="role",
  54. )
  55. def __repr__(self):
  56. return self.name
  57. class PermissionView(Model):
  58. __tablename__ = "ab_permission_view"
  59. __table_args__ = (
  60. UniqueConstraint("permission_id", "view_menu_id"),
  61. Index("idx_permission_id", "permission_id"),
  62. Index("idx_view_menu_id", "view_menu_id"),
  63. )
  64. id = Column(Integer, Sequence("ab_permission_view_id_seq"), primary_key=True)
  65. permission_id = Column(Integer, ForeignKey("ab_permission.id"))
  66. permission = relationship("Permission", lazy="joined")
  67. view_menu_id = Column(Integer, ForeignKey("ab_view_menu.id"))
  68. view_menu = relationship("ViewMenu", lazy="joined")
  69. def __repr__(self):
  70. return str(self.permission).replace("_", " ") + " on " + str(self.view_menu)
  71. assoc_user_role = Table(
  72. "ab_user_role",
  73. Model.metadata,
  74. Column("id", Integer, Sequence("ab_user_role_id_seq"), primary_key=True),
  75. Column("user_id", Integer, ForeignKey("ab_user.id")),
  76. Column("role_id", Integer, ForeignKey("ab_role.id")),
  77. UniqueConstraint("user_id", "role_id"),
  78. )
  79. class User(Model):
  80. __tablename__ = "ab_user"
  81. id = Column(Integer, Sequence("ab_user_id_seq"), primary_key=True)
  82. first_name = Column(String(64), nullable=False)
  83. last_name = Column(String(64), nullable=False)
  84. username = Column(String(64), unique=True, nullable=False)
  85. password = Column(String(256))
  86. active = Column(Boolean)
  87. email = Column(String(320), unique=True, nullable=False)
  88. last_login = Column(DateTime)
  89. login_count = Column(Integer)
  90. fail_login_count = Column(Integer)
  91. roles = relationship("Role", secondary=assoc_user_role, backref="user")
  92. created_on = Column(
  93. DateTime, default=lambda: datetime.datetime.now(), nullable=True
  94. )
  95. changed_on = Column(
  96. DateTime, default=lambda: datetime.datetime.now(), nullable=True
  97. )
  98. @declared_attr
  99. def created_by_fk(self):
  100. return Column(
  101. Integer, ForeignKey("ab_user.id"), default=self.get_user_id, nullable=True
  102. )
  103. @declared_attr
  104. def changed_by_fk(self):
  105. return Column(
  106. Integer, ForeignKey("ab_user.id"), default=self.get_user_id, nullable=True
  107. )
  108. created_by = relationship(
  109. "User",
  110. backref=backref("created", uselist=True),
  111. remote_side=[id],
  112. primaryjoin="User.created_by_fk == User.id",
  113. uselist=False,
  114. )
  115. changed_by = relationship(
  116. "User",
  117. backref=backref("changed", uselist=True),
  118. remote_side=[id],
  119. primaryjoin="User.changed_by_fk == User.id",
  120. uselist=False,
  121. )
  122. @classmethod
  123. def get_user_id(cls):
  124. try:
  125. return g.user.id
  126. except Exception:
  127. return None
  128. @property
  129. def is_authenticated(self):
  130. return True
  131. @property
  132. def is_active(self):
  133. return self.active
  134. @property
  135. def is_anonymous(self):
  136. return False
  137. def get_id(self):
  138. return as_unicode(self.id)
  139. def get_full_name(self):
  140. return "{0} {1}".format(self.first_name, self.last_name)
  141. def __repr__(self):
  142. return self.get_full_name()
  143. class RegisterUser(Model):
  144. __tablename__ = "ab_register_user"
  145. id = Column(Integer, Sequence("ab_register_user_id_seq"), primary_key=True)
  146. first_name = Column(String(64), nullable=False)
  147. last_name = Column(String(64), nullable=False)
  148. username = Column(String(64), unique=True, nullable=False)
  149. password = Column(String(256))
  150. email = Column(String(64), nullable=False)
  151. registration_date = Column(DateTime, default=datetime.datetime.now, nullable=True)
  152. registration_hash = Column(String(256))