Source code for zemfrog.mixins

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"))