from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.orm import relationship
from sqlalchemy_utils import EmailType
from .exception import ZemfrogRoleNotFound, ZemfrogRolePermissionNotFound
from .helper import db_commit, db_update
[docs]class UserMixin:
"""
User model.
"""
[docs] id = Column(Integer, primary_key=True)
[docs] first_name = Column(String(255), nullable=False)
[docs] last_name = Column(String(255), nullable=False)
[docs] name = Column(String(255), nullable=False)
[docs] email = Column(EmailType, nullable=False, unique=True)
[docs] password = Column(String(255), nullable=False)
[docs] registration_date = Column(DateTime)
[docs] confirmed = Column(Boolean, default=False)
[docs] date_confirmed = Column(DateTime)
@declared_attr
[docs] def logs(cls):
return relationship("Log")
@declared_attr
[docs] def roles(cls):
return relationship("Role", secondary="role_links", lazy="dynamic")
[docs] def get_role(self, name, silently=False):
for role in self.roles:
if role.name == name:
return role
if silently:
return False
raise ZemfrogRoleNotFound
[docs] def has_role(self, name):
try:
self.get_role(name)
except ZemfrogRoleNotFound:
return False
else:
return True
[docs] def add_role(self, role):
have = self.get_role(role.name, silently=True)
if not have:
self.roles.append(role)
db_commit()
return True
return False
[docs] def delete_role(self, name):
role = self.get_role(name, silently=True)
if role:
self.roles.remove(role)
db_commit()
return True
return False
[docs] def update_role(self, name, **kwds):
role = self.get_role(name, silently=True)
if role:
db_update(role, **kwds)
return True
return False
[docs]class RoleMixin:
"""
Role user.
"""
[docs] id = Column(Integer, primary_key=True)
@declared_attr
[docs] def user_id(cls):
return Column(ForeignKey("user.id"))
[docs] name = Column(String(255), nullable=False, unique=True)
[docs] description = Column(String(255), nullable=False)
@declared_attr
[docs] def permissions(cls):
return relationship("Permission", secondary="permission_links", lazy="dynamic")
[docs] def get_perm(self, name, silently=False):
for perm in self.permissions:
if perm.name == name:
return perm
if silently:
return False
raise ZemfrogRolePermissionNotFound
[docs] def has_perm(self, name):
try:
self.get_perm(name)
except ZemfrogRolePermissionNotFound:
return False
else:
return True
[docs] def add_perm(self, perm):
have = self.get_perm(perm.name, silently=True)
if not have:
self.permissions.append(perm)
db_commit()
return True
return False
[docs] def delete_perm(self, name):
perm = self.get_perm(name, silently=True)
if perm:
self.permissions.remove(perm)
db_commit()
return True
return False
[docs] def update_perm(self, name, **kwds):
perm = self.get_perm(name, silently=True)
if perm:
db_update(perm, **kwds)
return True
return False
[docs]class PermissionMixin:
"""
Role permission.
"""
[docs] id = Column(Integer, primary_key=True)
@declared_attr
[docs] def role_id(cls):
return Column(ForeignKey("role.id"))
[docs] name = Column(String(255), nullable=False, unique=True)
[docs] description = Column(String(255), nullable=False)
[docs]class LogMixin:
"""
User activity log.
"""
[docs] id = Column(Integer, primary_key=True)
@declared_attr
[docs] def user_id(cls):
return Column(ForeignKey("user.id"))
[docs] login_date = Column(DateTime)
[docs] date_requested_password_reset = Column(DateTime)
[docs] date_set_new_password = Column(DateTime)
[docs]class RoleLinksMixin:
[docs] id = Column(Integer, primary_key=True)
@declared_attr
[docs] def user_id(cls):
return Column(ForeignKey("user.id"))
@declared_attr
[docs] def role_id(cls):
return Column(ForeignKey("role.id"))
[docs]class PermissionLinksMixin:
[docs] id = Column(Integer, primary_key=True)
@declared_attr
[docs] def role_id(cls):
return Column(ForeignKey("role.id"))
@declared_attr
[docs] def permission_id(cls):
return Column(ForeignKey("permission.id"))