Prepare ERP source for Gitea deployment
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
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}}
|
||||
Reference in New Issue
Block a user