diff --git a/openslides_backend/action/action_handler.py b/openslides_backend/action/action_handler.py index 85423e218a..299f1a7249 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) @@ -144,20 +142,28 @@ 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: try: - result = self.execute_write_requests( - lambda e: transform_to_list( - self.perform_action(e) - ), - element, - ) + 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()) 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/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( diff --git a/openslides_backend/shared/base_service_provider.py b/openslides_backend/shared/base_service_provider.py index 908900b3c4..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 @@ -37,5 +34,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() 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: