54 lines
2.2 KiB
Python
54 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from sqlalchemy import or_, select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.modules.core.iam.scope import UserScope, get_manageable_roles
|
|
from app.modules.core.rbac.models import Permission, Role, RolePermission
|
|
from app.modules.core.iam.services import paginate_list
|
|
|
|
|
|
def search_roles(db: Session, scope: UserScope, q: str | None = None) -> list[Role]:
|
|
roles = db.execute(select(Role).order_by(Role.name)).scalars().all() if scope.is_system_admin else get_manageable_roles(db, scope)
|
|
query = (q or '').strip().lower()
|
|
if not query:
|
|
return roles
|
|
return [r for r in roles if query in (r.name or '').lower()]
|
|
|
|
|
|
def permissions_by_role(db: Session, roles: list[Role]) -> dict[int, list[str]]:
|
|
return {
|
|
role.id: [code for (code,) in db.execute(
|
|
select(Permission.code)
|
|
.join(RolePermission, RolePermission.permission_id == Permission.id)
|
|
.where(RolePermission.role_id == role.id)
|
|
.order_by(Permission.code)
|
|
).all()]
|
|
for role in roles
|
|
}
|
|
|
|
|
|
def build_roles_payload(db: Session, scope: UserScope, q: str | None = None, page: int = 1, per_page: int = 10) -> dict:
|
|
roles = search_roles(db, scope, q=q)
|
|
paged = paginate_list(roles, page=page, per_page=per_page)
|
|
return {
|
|
'roles': paged.items,
|
|
'roles_page': paged,
|
|
'permissions_by_role': permissions_by_role(db, paged.items),
|
|
'filters': {'q': (q or '').strip(), 'per_page': paged.per_page},
|
|
}
|
|
|
|
|
|
def search_permissions(db: Session, q: str | None = None) -> list[Permission]:
|
|
permissions = db.execute(select(Permission).order_by(Permission.code)).scalars().all()
|
|
query = (q or '').strip().lower()
|
|
if not query:
|
|
return permissions
|
|
return [p for p in permissions if query in (p.code or '').lower() or query in (p.name or '').lower()]
|
|
|
|
|
|
def build_permissions_payload(db: Session, q: str | None = None, page: int = 1, per_page: int = 15) -> dict:
|
|
permissions = search_permissions(db, q=q)
|
|
paged = paginate_list(permissions, page=page, per_page=per_page)
|
|
return {'permissions': paged.items, 'permissions_page': paged, 'filters': {'q': (q or '').strip(), 'per_page': paged.per_page}}
|