Prepare ERP source for Gitea deployment

This commit is contained in:
A R R R Associates
2026-06-20 15:01:44 +05:30
commit 5c75eb6bd9
450 changed files with 67698 additions and 0 deletions
+133
View File
@@ -0,0 +1,133 @@
from __future__ import annotations
from dataclasses import dataclass
from math import ceil
from sqlalchemy import or_, select
from sqlalchemy.orm import Session
from app.modules.core.iam.models import User
from app.modules.core.iam.scope import (
UserScope,
get_manageable_roles,
get_user_role_names,
list_visible_branches,
list_visible_tenants,
)
from app.modules.core.tenancy.models import Branch, Tenant
@dataclass
class PageResult:
items: list
page: int
per_page: int
total: int
pages: int
@property
def has_prev(self) -> bool:
return self.page > 1
@property
def has_next(self) -> bool:
return self.page < self.pages
def paginate_list(items: list, page: int = 1, per_page: int = 10) -> PageResult:
total = len(items)
per_page = max(1, min(per_page, 100))
pages = max(1, ceil(total / per_page)) if total else 1
page = max(1, min(page, pages))
start = (page - 1) * per_page
end = start + per_page
return PageResult(items=items[start:end], page=page, per_page=per_page, total=total, pages=pages)
def search_scoped_users(db: Session, scope: UserScope, q: str | None = None) -> list[User]:
stmt = select(User)
if not scope.is_system_admin:
stmt = stmt.where(User.tenant_id == scope.actor.tenant_id)
if scope.branch_scoped:
stmt = stmt.where(User.branch_id == scope.actor.branch_id)
query = (q or "").strip()
if query:
like = f"%{query}%"
stmt = stmt.where(or_(User.email.ilike(like), User.full_name.ilike(like)))
return db.execute(stmt.order_by(User.full_name, User.email, User.id)).scalars().all()
def build_user_listing_payload(
db: Session,
scope: UserScope,
q: str | None = None,
page: int = 1,
per_page: int = 10,
) -> dict:
users = search_scoped_users(db, scope, q=q)
paged = paginate_list(users, page=page, per_page=per_page)
user_ids = [u.id for u in paged.items]
roles = {user_id: get_user_role_names(db, user_id) for user_id in user_ids}
tenants = {t.id: t for t in list_visible_tenants(db, scope)}
if scope.is_system_admin:
branch_rows = db.execute(select(Branch).order_by(Branch.name)).scalars().all()
else:
branch_rows = list_visible_branches(db, scope, scope.actor.tenant_id)
branches = {b.id: b for b in branch_rows}
return {
"users_page": paged,
"users": paged.items,
"user_roles": roles,
"tenants": tenants,
"branches": branches,
"filters": {
"q": (q or "").strip(),
"per_page": paged.per_page,
},
}
def build_user_form_payload(
db: Session,
scope: UserScope,
actor: User,
user_obj: User | None = None,
assigned_role_ids: list[int] | None = None,
) -> dict:
tenants = list_visible_tenants(db, scope)
if user_obj:
selected_tenant_id = user_obj.tenant_id
selected_branch_id = user_obj.branch_id
else:
if scope.is_system_admin:
selected_tenant_id = actor.tenant_id or (tenants[0].id if tenants else None)
else:
selected_tenant_id = actor.tenant_id
selected_branch_id = actor.branch_id if scope.branch_scoped else None
branches = list_visible_branches(db, scope, selected_tenant_id)
selected_tenant = next((t for t in tenants if t.id == selected_tenant_id), None)
selected_branch = next((b for b in branches if b.id == selected_branch_id), None)
manageable_roles = get_manageable_roles(db, scope)
return {
"user_obj": user_obj,
"assigned_role_ids": assigned_role_ids or [],
"roles": manageable_roles,
"tenants": tenants,
"branches": branches,
"scope": scope,
"selected_tenant_id": selected_tenant_id,
"selected_branch_id": selected_branch_id,
"selected_tenant_name": selected_tenant.name if selected_tenant else "",
"selected_branch_name": selected_branch.name if selected_branch else "",
"can_change_tenant": scope.is_system_admin,
}