Ошибка - start_handler() missing 1 required positional argument: 'data'
Есть у меня задача: организовать доступ к разным разделам бота по ролям пользователей.
Есть таблица в БД, где колонка user_role. Есть кастомный фильтр.
class GroupRoleFilter(Filter):
"""
Фильтр для проверки роли группы.
"""
def __init__(self, role: Union[GroupRoleEnum, list[GroupRoleEnum]]):
if not isinstance(role, list):
role = [role]
self.roles = [r.value for r in role]
async def __call__(
self,
event: TelegramObject,
data: Dict[str, Any]
) -> bool:
"""
Проверяет, соответствует ли роль группы одной из разрешенных ролей.
Если пользователь - суперпользователь, разрешаем доступ.
"""
user_role: str = data.get("user_role")
group_role: str = data.get("group_role")
if user_role == UserRoleEnum.SUPERADMIN.value:
return True # Суперпользователь имеет доступ ко всему
return group_role in self.roles
Далее фильтры по ролям: Superadmin, Admin, User и т.д.:
# Фильтры для конкретных ролей пользователей
class SuperAdminFilter(RoleFilter):
def __init__(self):
super().__init__(role=UserRole.SUPERADMIN)
class AdminFilter(RoleFilter):
def __init__(self):
super().__init__(role=UserRole.ADMIN)
class UserFilter(RoleFilter):
Есть Middleware:
class DatabaseAndRoleMiddleware(BaseMiddleware):
def __init__(self, session_pool: async_sessionmaker):
self.session_pool = session_pool
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: Union[Message, CallbackQuery],
data: Dict[str, Any]
) -> Any:
async with self.session_pool() as session:
data["db"] = session
user_id = event.from_user.id
user, group = await get_user_with_group(session, user_id)
data["user"] = user
data["group"] = group
data["user_role"] = user.role if user else UserRoleEnum.GUEST
data["group_role"] = group.role if group else GroupRoleEnum.GUEST_GP
return await handler(event, data)
И под каждую роль роутеры.
В результате после запуска бота, при команде /start получаю ошибку:
"""start_handler() missing 1 required positional argument: 'data'"""
В предыдущих версиях моего кода получал такую ошибку:
TypeError: RoleFilter.__call__() missing 1 required positional argument: 'data'
Три дня потеряны, разобраться не могу, не смотря на изучение Traceback.
Гуру, что подскажете, какую еще предоставить инфу для понимания моей проблемы?