From 7676148ce2c27ed7c112028a886d98eac6da8fd9 Mon Sep 17 00:00:00 2001 From: Hannes Janott Date: Wed, 18 Feb 2026 11:22:15 +0100 Subject: [PATCH 1/6] improve handle separately --- openslides_backend/action/action_handler.py | 22 +++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/openslides_backend/action/action_handler.py b/openslides_backend/action/action_handler.py index 85423e218a..7735c45cfb 100644 --- a/openslides_backend/action/action_handler.py +++ b/openslides_backend/action/action_handler.py @@ -151,18 +151,20 @@ def transform_to_list( ) for element in payload: - try: - result = self.execute_write_requests( - lambda e: transform_to_list( + for list_element in element["data"]: + try: + result = self.execute_write_requests( + lambda e: transform_to_list( self.perform_action(e) ), - element, - ) - results.append(result) - except ActionException as exception: - error = cast(ActionError, exception.get_json()) - results.append(error) - self.datastore.reset() + element, + ) + self.datastore.connection.commit() + results.append(result) + except ActionException as exception: + error = cast(ActionError, exception.get_json()) + results.append(error) + self.datastore.reset() # execute cleanup methods for on_success in self.on_success: From 8e49f28b060ffea4d9ba677bb925adf40bc5c5e6 Mon Sep 17 00:00:00 2001 From: Hannes Janott Date: Wed, 18 Feb 2026 11:23:18 +0100 Subject: [PATCH 2/6] remove unused connection objects --- openslides_backend/action/action_handler.py | 14 ++++++-------- openslides_backend/shared/base_service_provider.py | 2 -- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/openslides_backend/action/action_handler.py b/openslides_backend/action/action_handler.py index 7735c45cfb..9c6b295e9d 100644 --- a/openslides_backend/action/action_handler.py +++ b/openslides_backend/action/action_handler.py @@ -118,15 +118,13 @@ def handle_request( parsing all actions. In the end it sends everything to the event store. """ with make_span(self.env, "handle request"): - with get_new_os_conn() as db_connection: - self.db_connection = db_connection - self.user_id = user_id - self.internal = internal + self.user_id = user_id + self.internal = internal - try: - payload_schema(payload) - except fastjsonschema.JsonSchemaException as exception: - raise ActionException(exception.message) + try: + payload_schema(payload) + except fastjsonschema.JsonSchemaException as exception: + raise ActionException(exception.message) retry_count = int(self.env.ACTION_MAX_RETRIES or 1) retry_timeout = float(self.env.ACTION_RETRY_TIMEOUT or 0.4) diff --git a/openslides_backend/shared/base_service_provider.py b/openslides_backend/shared/base_service_provider.py index 908900b3c4..1a14f20e3b 100644 --- a/openslides_backend/shared/base_service_provider.py +++ b/openslides_backend/shared/base_service_provider.py @@ -37,5 +37,3 @@ def __init__( self.vote_service = services.vote() self.datastore = datastore self.logging = logging - os_conn_pool = get_current_os_conn_pool() - self.db_connection = os_conn_pool.connection() From d8848dd59c9c7fec13fa5851f8c9fafeab46c006 Mon Sep 17 00:00:00 2001 From: Hannes Janott Date: Wed, 18 Feb 2026 11:33:30 +0100 Subject: [PATCH 3/6] use data element --- openslides_backend/action/action_handler.py | 9 ++++++--- openslides_backend/shared/base_service_provider.py | 3 --- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openslides_backend/action/action_handler.py b/openslides_backend/action/action_handler.py index 9c6b295e9d..0669b69e71 100644 --- a/openslides_backend/action/action_handler.py +++ b/openslides_backend/action/action_handler.py @@ -153,9 +153,12 @@ def transform_to_list( try: result = self.execute_write_requests( lambda e: transform_to_list( - self.perform_action(e) - ), - element, + self.perform_action(e) + ), + { + "action": element["action"], + "data": [data_element], + }, ) self.datastore.connection.commit() results.append(result) diff --git a/openslides_backend/shared/base_service_provider.py b/openslides_backend/shared/base_service_provider.py index 1a14f20e3b..9740014b2f 100644 --- a/openslides_backend/shared/base_service_provider.py +++ b/openslides_backend/shared/base_service_provider.py @@ -1,9 +1,6 @@ from openslides_backend.services.auth.interface import AuthenticationService from openslides_backend.services.database.interface import Database from openslides_backend.services.media.interface import MediaService -from openslides_backend.services.postgresql.db_connection_handling import ( - get_current_os_conn_pool, -) from openslides_backend.services.vote.interface import VoteService from openslides_backend.shared.interfaces.logging import Logger, LoggingModule from openslides_backend.shared.interfaces.services import Services From 3d77d467f4603931fe84fd4d9dca6fc00b7acbe8 Mon Sep 17 00:00:00 2001 From: Hannes Janott Date: Wed, 18 Feb 2026 15:20:45 +0100 Subject: [PATCH 4/6] improve readability --- openslides_backend/services/database/database_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openslides_backend/services/database/database_writer.py b/openslides_backend/services/database/database_writer.py index ee79514cdd..be17e512da 100644 --- a/openslides_backend/services/database/database_writer.py +++ b/openslides_backend/services/database/database_writer.py @@ -400,7 +400,7 @@ def delete_from_intermediate_tables( table_name=sql.Identifier(intermediate_table), own_column=sql.Identifier(own_column), other_column=sql.Identifier(other_column), - negation=sql.SQL("") if directly else sql.SQL("NOT "), + negation=sql.SQL("" if directly else "NOT "), id=id_, ) self.execute_sql( From 0cfba13364d2e51e63bdcfb8e07c6da642b66de5 Mon Sep 17 00:00:00 2001 From: Hannes Janott Date: Fri, 20 Feb 2026 13:25:52 +0100 Subject: [PATCH 5/6] merge results from data list --- openslides_backend/action/action_handler.py | 33 +++++++++++---------- openslides_backend/action/action_worker.py | 1 + tests/integration/test_handle_request.py | 2 +- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/openslides_backend/action/action_handler.py b/openslides_backend/action/action_handler.py index 0669b69e71..2b4e093f8a 100644 --- a/openslides_backend/action/action_handler.py +++ b/openslides_backend/action/action_handler.py @@ -149,23 +149,26 @@ def transform_to_list( ) for element in payload: - for list_element in element["data"]: - try: - result = self.execute_write_requests( - lambda e: transform_to_list( - self.perform_action(e) - ), - { - "action": element["action"], - "data": [data_element], - }, + try: + result: list[Any] = [] + for data_element in element["data"]: + result.extend( + self.execute_write_requests( + lambda e: transform_to_list( + self.perform_action(e) + ), + { + "action": element["action"], + "data": [data_element], + }, + ) ) self.datastore.connection.commit() - results.append(result) - except ActionException as exception: - error = cast(ActionError, exception.get_json()) - results.append(error) - self.datastore.reset() + results.append(result) + except ActionException as exception: + error = cast(ActionError, exception.get_json()) + results.append(error) + self.datastore.reset() # execute cleanup methods for on_success in self.on_success: diff --git a/openslides_backend/action/action_worker.py b/openslides_backend/action/action_worker.py index b26a7366b6..4e5dc692f5 100644 --- a/openslides_backend/action/action_worker.py +++ b/openslides_backend/action/action_worker.py @@ -144,6 +144,7 @@ def initial_action_worker_write(self, extended_db: ExtendedDatabase) -> str: locked_fields={}, ) ) + # Assert worker exists in db. extended_db.get(self.fqid, [], lock_result=False, use_changed_models=False) message = f"Action ({self.action_names}) lasts too long. {self.fqid} written to database. Get the result from database, when the job is done." self.written = True diff --git a/tests/integration/test_handle_request.py b/tests/integration/test_handle_request.py index d362784caa..560cb90d46 100644 --- a/tests/integration/test_handle_request.py +++ b/tests/integration/test_handle_request.py @@ -108,7 +108,7 @@ def test_success_actions_with_result_atomic(action_handler: ActionHandler) -> No ] response = action_handler.handle_request(payload, 0, False) assert response["success"] is True - assert response["results"] == [[], [{"id": 1}, {"id": 42}]] + assert response["results"] == [[], [{"id": 1}, {"id": 42}, {"id": 1}, {"id": 42}]] def test_with_error(action_handler: ActionHandler) -> None: From f1c0f1e2ed19f1f511656492ad4eb1400e4f1bad Mon Sep 17 00:00:00 2001 From: Hannes Janott Date: Mon, 27 Apr 2026 11:53:04 +0200 Subject: [PATCH 6/6] fix linter --- openslides_backend/action/action_handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openslides_backend/action/action_handler.py b/openslides_backend/action/action_handler.py index 2b4e093f8a..299f1a7249 100644 --- a/openslides_backend/action/action_handler.py +++ b/openslides_backend/action/action_handler.py @@ -142,10 +142,10 @@ def handle_request( def transform_to_list( tuple: tuple[WriteRequest | None, ActionResults | None], - ) -> tuple[list[WriteRequest], ActionResults | None]: + ) -> tuple[list[WriteRequest], ActionResults]: return ( [tuple[0]] if tuple[0] is not None else [], - tuple[1], + tuple[1] if tuple[1] is not None else [], ) for element in payload: