Files
2026-06-20 15:01:44 +05:30

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}}