fix: после grant_role существующий dict не обновлял поле role

При входе менеджером (?role=manager) get_or_create_user обновлял CSV
в Sheets, но в памяти существующего dict обновлял только roles[],
а старое поле role оставалось со старым значением. _handle_me читал
role и не находил 'manager' → fallback на client cabinet.

Теперь после grant_role перечитываем строку из Sheets и обновляем
оба поля (role + roles). Плюс в _handle_me предпочитаем roles[]
если он уже распарсен.
This commit is contained in:
wasrusgen 2026-05-12 20:18:10 +03:00
parent 4848b3a3ef
commit 865c3eaf40
2 changed files with 9 additions and 3 deletions

View File

@ -432,7 +432,9 @@ def _handle_me(body: dict[str, Any]) -> dict[str, Any]:
start_param = body.get("startParam") or auth.get("start_param")
explicit_role = body.get("role") if body.get("role") in ("manager", "client", "staff") else None
user = sheets.get_or_create_user(tg_user, start_param, explicit_role)
roles = sheets.parse_roles(user.get("role", ""))
# Берём roles из словаря если они уже распарсены (после grant_role),
# иначе fallback на парсинг сырой CSV-колонки
roles = user.get("roles") or sheets.parse_roles(user.get("role", ""))
# Staff (замерщик / сборщик) — отдельный кабинет, доступен только тем у кого роль выдана
if explicit_role == "staff":

View File

@ -206,14 +206,18 @@ def get_or_create_user(tg_user: dict[str, Any], start_param: str | None,
if tg_id == admin_id and not has_role(existing, "manager"):
grant_role(tg_id, "manager")
ensure_admin_manager(tg_user)
existing["roles"] = parse_roles((find_user(tg_id) or {}).get("role", ""))
fresh = find_user(tg_id) or {}
existing["role"] = fresh.get("role", existing.get("role", ""))
existing["roles"] = fresh.get("roles", [])
# explicit_role из query (?role=manager|client|staff) — не перетираем уже выданные роли,
# только добавляем если человек впервые открыл эту секцию
elif explicit_role and explicit_role in VALID_ROLES and not has_role(existing, explicit_role):
# client/manager — стандартные роли любой может получить через выбор в боте
if explicit_role in ("manager", "client"):
grant_role(tg_id, explicit_role)
existing["roles"] = parse_roles((find_user(tg_id) or {}).get("role", ""))
fresh = find_user(tg_id) or {}
existing["role"] = fresh.get("role", existing.get("role", ""))
existing["roles"] = fresh.get("roles", [])
return existing
# Новый пользователь