diff --git a/backend-py/app/main.py b/backend-py/app/main.py index 85a4e83..bf15fa5 100644 --- a/backend-py/app/main.py +++ b/backend-py/app/main.py @@ -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": diff --git a/backend-py/app/sheets.py b/backend-py/app/sheets.py index f3dea50..5eeb9d2 100644 --- a/backend-py/app/sheets.py +++ b/backend-py/app/sheets.py @@ -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 # Новый пользователь