core/auth/usermodel.py

120 lines
3.9 KiB
Python
Raw Permalink Normal View History

2024-11-01 12:06:21 +00:00
import time
2025-02-11 09:00:35 +00:00
from sqlalchemy import (
JSON,
Boolean,
Column,
DateTime,
ForeignKey,
Integer,
String,
func,
)
from sqlalchemy.orm import relationship
2023-10-30 21:00:55 +00:00
2024-11-01 12:06:21 +00:00
from services.db import Base
class Permission(Base):
__tablename__ = "permission"
id = Column(String, primary_key=True, unique=True, nullable=False, default=None)
resource = Column(String, nullable=False)
operation = Column(String, nullable=False)
class Role(Base):
__tablename__ = "role"
id = Column(String, primary_key=True, unique=True, nullable=False, default=None)
name = Column(String, nullable=False)
permissions = relationship(Permission)
class AuthorizerUser(Base):
__tablename__ = "authorizer_users"
id = Column(String, primary_key=True, unique=True, nullable=False, default=None)
key = Column(String)
email = Column(String, unique=True)
email_verified_at = Column(Integer)
family_name = Column(String)
gender = Column(String)
given_name = Column(String)
is_multi_factor_auth_enabled = Column(Boolean)
middle_name = Column(String)
nickname = Column(String)
password = Column(String)
phone_number = Column(String, unique=True)
phone_number_verified_at = Column(Integer)
# preferred_username = Column(String, nullable=False)
picture = Column(String)
revoked_timestamp = Column(Integer)
roles = Column(String, default="author,reader")
signup_methods = Column(String, default="magic_link_login")
created_at = Column(Integer, default=lambda: int(time.time()))
updated_at = Column(Integer, default=lambda: int(time.time()))
2023-10-26 17:56:42 +00:00
2022-09-03 10:50:14 +00:00
class UserRating(Base):
2022-09-03 10:50:14 +00:00
__tablename__ = "user_rating"
2023-10-30 21:00:55 +00:00
id = None
rater: Column = Column(ForeignKey("user.id"), primary_key=True, index=True)
user: Column = Column(ForeignKey("user.id"), primary_key=True, index=True)
value: Column = Column(Integer)
2021-08-23 08:02:45 +00:00
2022-11-19 11:35:34 +00:00
@staticmethod
def init_table():
pass
2021-08-20 08:08:32 +00:00
2021-11-24 09:09:47 +00:00
class UserRole(Base):
2022-09-03 10:50:14 +00:00
__tablename__ = "user_role"
2023-10-30 21:00:55 +00:00
id = None
2022-11-30 06:27:12 +00:00
user = Column(ForeignKey("user.id"), primary_key=True, index=True)
role = Column(ForeignKey("role.id"), primary_key=True, index=True)
2021-11-24 09:09:47 +00:00
2021-08-17 09:14:26 +00:00
class User(Base):
2022-09-03 10:50:14 +00:00
__tablename__ = "user"
2022-11-19 11:35:34 +00:00
default_user = None
2022-09-03 10:50:14 +00:00
email = Column(String, unique=True, nullable=False, comment="Email")
username = Column(String, nullable=False, comment="Login")
password = Column(String, nullable=True, comment="Password")
2022-12-01 10:04:38 +00:00
bio = Column(String, nullable=True, comment="Bio") # status description
about = Column(String, nullable=True, comment="About") # long and formatted
2022-09-03 10:50:14 +00:00
userpic = Column(String, nullable=True, comment="Userpic")
name = Column(String, nullable=True, comment="Display name")
slug = Column(String, unique=True, comment="User's slug")
2024-11-01 12:06:21 +00:00
links = Column(JSON, nullable=True, comment="Links")
2022-09-03 10:50:14 +00:00
oauth = Column(String, nullable=True)
2024-11-03 08:32:05 +00:00
oid = Column(String, nullable=True)
muted = Column(Boolean, default=False)
confirmed = Column(Boolean, default=False)
created_at = Column(DateTime(timezone=True), nullable=False, server_default=func.now(), comment="Created at")
updated_at = Column(DateTime(timezone=True), nullable=False, server_default=func.now(), comment="Updated at")
last_seen = Column(DateTime(timezone=True), nullable=False, server_default=func.now(), comment="Was online at")
deleted_at = Column(DateTime(timezone=True), nullable=True, comment="Deleted at")
2022-09-03 10:50:14 +00:00
ratings = relationship(UserRating, foreign_keys=UserRating.user)
roles = relationship(lambda: Role, secondary=UserRole.__tablename__)
2024-11-03 08:32:05 +00:00
2022-12-01 13:24:05 +00:00
def get_permission(self):
2022-09-03 10:50:14 +00:00
scope = {}
for role in self.roles:
2022-09-03 10:50:14 +00:00
for p in role.permissions:
if p.resource not in scope:
scope[p.resource] = set()
scope[p.resource].add(p.operation)
2022-12-01 08:12:48 +00:00
print(scope)
2022-09-03 10:50:14 +00:00
return scope
2022-12-02 08:47:55 +00:00
# if __name__ == "__main__":
2023-10-30 21:00:55 +00:00
# print(User.get_permission(user_id=1))