Skip to content

Commit a46899a

Browse files
Implement a way to return the sequential_number after create (#3326)
* Implement a way to return the sequential_number after create * Remove commented out code from database writer
1 parent 1dbc890 commit a46899a

File tree

33 files changed

+181
-106
lines changed

33 files changed

+181
-106
lines changed

openslides_backend/action/action.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ def original_instances(method: Callable) -> Callable:
8282

8383
T = TypeVar("T", bound=WriteRequest)
8484

85+
EditFunction = Callable[[dict, dict[FullQualifiedId, dict[str, Any]]], None]
86+
8587

8688
class Action(BaseServiceProvider, metaclass=SchemaProvider):
8789
"""
@@ -817,6 +819,13 @@ def execute_presenter(
817819
presenter_instance.validate()
818820
return presenter_instance.get_result()
819821

822+
def get_post_edit_function(self) -> EditFunction | None:
823+
"""
824+
Returns a function that allows post-editing the action result
825+
with the return data from the database writer.
826+
"""
827+
return None
828+
820829

821830
def merge_history_informations(
822831
a: HistoryInformation | None, *other: HistoryInformation | None

openslides_backend/action/action_handler.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@
6868
}
6969
)
7070

71+
META_POST_EDIT_FN_KEY = "META_EDIT_FN_GHETZHSRHSRGG"
72+
7173

7274
class ActionHandler(BaseHandler):
7375
"""
@@ -122,6 +124,7 @@ def handle_request(
122124

123125
try:
124126
with get_new_os_conn() as conn:
127+
self.post_edit_necessary = False
125128
self.datastore = ExtendedDatabase(conn, self.logging, self.env)
126129
results: ActionsResponseResults = []
127130
if atomic:
@@ -190,7 +193,8 @@ def execute_write_requests(
190193
try:
191194
write_requests, data = get_write_requests(*args)
192195
if write_requests:
193-
self.datastore.write(write_requests)
196+
results = self.datastore.write(write_requests)
197+
data = self.update_action_data_with_write_results(data, results)
194198
return data
195199
except DatastoreLockedException as exception:
196200
retries += 1
@@ -199,6 +203,20 @@ def execute_write_requests(
199203
else:
200204
self.datastore.reset()
201205

206+
def update_action_data_with_write_results(
207+
self, data: T, results: dict[str, dict[str, Any]]
208+
) -> T:
209+
if self.post_edit_necessary:
210+
if isinstance(data, list):
211+
for element in data:
212+
if element:
213+
self.update_action_data_with_write_results(element, results)
214+
elif isinstance(data, dict):
215+
edit_fn = data.pop(META_POST_EDIT_FN_KEY, None)
216+
if edit_fn:
217+
return edit_fn(data, results)
218+
return data
219+
202220
def parse_actions(
203221
self, payload: Payload
204222
) -> tuple[list[WriteRequest], ActionsResponseResults]:
@@ -275,6 +293,12 @@ def perform_action(
275293
write_request, results = action.perform(
276294
action_data, self.user_id, internal=self.internal
277295
)
296+
if results and (edit_fn := action.get_post_edit_function()):
297+
for element in results:
298+
if element and isinstance(element, dict):
299+
element[META_POST_EDIT_FN_KEY] = edit_fn
300+
self.post_edit_necessary = True
301+
278302
if write_request:
279303
action.validate_write_request(write_request)
280304

openslides_backend/action/actions/assignment/create_update_delete.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from ...action_set import ActionSet
99
from ...generics.update import UpdateAction
1010
from ...mixins.create_action_with_dependencies import CreateActionWithDependencies
11+
from ...mixins.sequential_numbers_mixin import SequentialNumbersMixin
1112
from ...util.default_schema import DefaultSchema
1213
from ...util.register import register_action_set
1314
from ..agenda_item.agenda_creation import (
@@ -25,6 +26,7 @@
2526

2627
class AssignmentCreate(
2728
AttachmentMixin,
29+
SequentialNumbersMixin,
2830
CreateActionWithDependencies,
2931
CreateActionWithAgendaItemMixin,
3032
CreateActionWithListOfSpeakersMixin,

openslides_backend/action/actions/motion/base_create_forwarded.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,14 @@ def create_action_result_element(
352352
result.update(self.id_to_result_extra_data.get(result["id"], {}))
353353
return result
354354

355+
def post_edit_fn(self, data: dict, results: dict[str, dict[str, Any]]) -> None:
356+
super().post_edit_fn(data, results)
357+
dates = [*data.get("amendment_result_data", [])]
358+
while len(dates):
359+
date = dates.pop(0)
360+
super().post_edit_fn(date, results)
361+
dates.extend(date.get("amendment_result_data", []))
362+
355363
def handle_number(self, instance: dict[str, Any]) -> dict[str, Any]:
356364
origin = self.datastore.get(
357365
fqid_from_collection_and_id("motion", instance["origin_id"]),

openslides_backend/action/actions/motion/create_base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from ....models.models import Motion
66
from ....shared.patterns import fqid_from_collection_and_id
77
from ...mixins.create_action_with_dependencies import CreateActionWithDependencies
8+
from ...mixins.sequential_numbers_mixin import SequentialNumbersMixin
89
from ..agenda_item.agenda_creation import CreateActionWithAgendaItemMixin
910
from ..agenda_item.create import AgendaItemCreate
1011
from ..list_of_speakers.create import ListOfSpeakersCreate
@@ -22,6 +23,7 @@ class MotionCreateBase(
2223
MeetingUserHelperMixin,
2324
CreateActionWithDependencies,
2425
CreateActionWithAgendaItemMixin,
26+
SequentialNumbersMixin,
2527
SetNumberMixin,
2628
CreateActionWithListOfSpeakersMixin,
2729
):

openslides_backend/action/actions/motion_block/create_update_delete.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from ....permissions.permissions import Permissions
33
from ...action_set import ActionSet
44
from ...mixins.create_action_with_dependencies import CreateActionWithDependencies
5+
from ...mixins.sequential_numbers_mixin import SequentialNumbersMixin
56
from ...util.default_schema import DefaultSchema
67
from ...util.register import register_action_set
78
from ..agenda_item.agenda_creation import (
@@ -16,6 +17,7 @@
1617

1718

1819
class MotionBlockCreate(
20+
SequentialNumbersMixin,
1921
CreateActionWithDependencies,
2022
CreateActionWithAgendaItemMixin,
2123
CreateActionWithListOfSpeakersMixin,

openslides_backend/action/actions/motion_category/create_update_delete.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
from ....models.models import MotionCategory
44
from ....permissions.permissions import Permissions
55
from ...action_set import ActionSet
6-
from ...generics.create import CreateAction
6+
from ...mixins.sequential_numbers_mixin import SequentialNumbersMixin
77
from ...mixins.weight_mixin import WeightMixin
88
from ...util.default_schema import DefaultSchema
99
from ...util.register import register_action_set
1010

1111

12-
class MotionCategoryCreate(CreateAction, WeightMixin):
12+
class MotionCategoryCreate(SequentialNumbersMixin, WeightMixin):
1313
def update_instance(self, instance: dict[str, Any]) -> dict[str, Any]:
1414
instance["weight"] = self.get_weight(instance["meeting_id"])
1515
return super().update_instance(instance)

openslides_backend/action/actions/motion_comment_section/create.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22

33
from ....models.models import MotionCommentSection
44
from ....permissions.permissions import Permissions
5-
from ...generics.create import CreateAction
65
from ...mixins.forbid_anonymous_group_mixin import ForbidAnonymousGroupMixin
6+
from ...mixins.sequential_numbers_mixin import SequentialNumbersMixin
77
from ...util.default_schema import DefaultSchema
88
from ...util.register import register_action
99

1010

1111
@register_action("motion_comment_section.create")
12-
class MotionCommentSectionCreateAction(CreateAction, ForbidAnonymousGroupMixin):
12+
class MotionCommentSectionCreateAction(
13+
SequentialNumbersMixin, ForbidAnonymousGroupMixin
14+
):
1315
"""
1416
Create Action with default weight.
1517
"""

openslides_backend/action/actions/motion_workflow/create.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from ....models.models import MotionWorkflow
55
from ....permissions.permissions import Permissions
66
from ...action import Action
7-
from ...generics.create import CreateAction
87
from ...mixins.create_action_with_dependencies import CreateActionWithDependencies
8+
from ...mixins.sequential_numbers_mixin import SequentialNumbersMixin
99
from ...util.action_type import ActionType
1010
from ...util.default_schema import DefaultSchema
1111
from ...util.register import register_action
@@ -16,7 +16,7 @@
1616

1717

1818
@register_action("motion_workflow.create")
19-
class MotionWorkflowCreateAction(CreateActionWithDependencies):
19+
class MotionWorkflowCreateAction(SequentialNumbersMixin, CreateActionWithDependencies):
2020
"""
2121
Action to create a motion workflow.
2222
"""
@@ -43,7 +43,7 @@ def get_dependent_action_data(
4343
@register_action(
4444
"motion_workflow.create_simple_workflow", action_type=ActionType.BACKEND_INTERNAL
4545
)
46-
class MotionWorkflowCreateSimpleWorkflowAction(CreateAction):
46+
class MotionWorkflowCreateSimpleWorkflowAction(SequentialNumbersMixin):
4747
"""
4848
Action to create a simple motion workflow.
4949
"""
@@ -113,7 +113,7 @@ def update_instance(self, instance: dict[str, Any]) -> dict[str, Any]:
113113
@register_action(
114114
"motion_workflow.create_complex_workflow", action_type=ActionType.BACKEND_INTERNAL
115115
)
116-
class MotionWorkflowCreateComplexWorkflowAction(CreateAction):
116+
class MotionWorkflowCreateComplexWorkflowAction(SequentialNumbersMixin):
117117
"""
118118
Action to create a complex motion workflow.
119119
"""

openslides_backend/action/actions/motion_workflow/import_.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
from ....permissions.permissions import Permissions
66
from ....shared.exceptions import ActionException
77
from ....shared.schema import str_list_schema
8-
from ...generics.create import CreateAction
8+
from ...mixins.sequential_numbers_mixin import SequentialNumbersMixin
99
from ...util.default_schema import DefaultSchema
1010
from ...util.register import register_action
1111
from ..motion_state.create import MotionStateCreateAction
1212
from ..motion_state.update import MotionStateUpdateAction
1313

1414

1515
@register_action("motion_workflow.import")
16-
class MotionWorkflowImport(CreateAction):
16+
class MotionWorkflowImport(SequentialNumbersMixin):
1717
"""
1818
Action to import a motion workflow.
1919
"""

0 commit comments

Comments
 (0)