Improved Scene handler and action inheritance mechanism (#1585)

* #1583 Improved Scene handler and action inheritance mechanism

Enhanced the inheritance of handlers and actions in scenes. Refactored to eliminate the copying of previously connected handlers and actions from parent scenes. Now, handlers are dynamically rebuilt based on the current class, properly utilizing class inheritance and enabling handler overrides.

* Added more tests

* Added more tests for non-function handlers
This commit is contained in:
Alex Root Junior 2024-10-06 16:37:18 +03:00 committed by GitHub
parent 080878be86
commit 1dbdcf0516
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 125 additions and 9 deletions

View file

@ -316,10 +316,6 @@ class Scene:
if not parent_scene_config:
continue
handlers.extend(parent_scene_config.handlers)
for action, action_handlers in parent_scene_config.actions.items():
actions[action].update(action_handlers)
if reset_data_on_enter is None:
reset_data_on_enter = parent_scene_config.reset_data_on_enter
if reset_history_on_enter is None:
@ -327,9 +323,7 @@ class Scene:
if callback_query_without_state is None:
callback_query_without_state = parent_scene_config.callback_query_without_state
for name in vars(cls):
value = getattr(cls, name)
for name, value in inspect.getmembers(cls):
if scene_handlers := getattr(value, "__aiogram_handler__", None):
handlers.extend(scene_handlers)
if isinstance(value, ObserverDecorator):