Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion meta
6 changes: 4 additions & 2 deletions openslides_backend/action/action.py
Original file line number Diff line number Diff line change
Expand Up @@ -781,8 +781,10 @@ def merge_history_informations(
if fqid in a:
if entries := information.get("entries"):
a[fqid].setdefault("entries", list()).extend(entries)
if changed_fields := information.get("changed_fields"):
a[fqid].setdefault("changed_fields", dict()).update(changed_fields)
if structured_information := information.get("structured_information"):
a[fqid].setdefault("structured_information", dict()).update(
structured_information
)
else:
a[fqid] = information
return a
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,7 @@ def get_history_information(self) -> HistoryInformation | None:
):
information[
fqid_from_collection_and_id("meeting_user", meeting_user["id"])
] = build_history_information_data(changed_fields={"is_present": False})
] = build_history_information_data(
structured_information={"is_present": False}
)
return information
42 changes: 22 additions & 20 deletions openslides_backend/action/actions/meeting_user/history_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

class ActionHistoryInformationData(TypedDict):
entries: NotRequired[list[tuple[str, ...]]]
changed_fields: NotRequired[dict[Field, Any]]
structured_information: NotRequired[dict[Field, Any]]


ActionHistoryInformation = dict[FullQualifiedId, ActionHistoryInformationData]
Expand Down Expand Up @@ -109,7 +109,7 @@ def get_history_information(self) -> HistoryInformation | None:
return {
fqid: build_history_information_data(
[string for entry in history.get("entries", []) for string in entry],
history.get("changed_fields", {}),
history.get("structured_information", {}),
)
for fqid, history in information.items()
}
Expand All @@ -121,7 +121,7 @@ def add_updated_meeting_user_history_information(
information: ActionHistoryInformation,
) -> None:
user_entries: list[tuple[str, ...]] = []
meeting_user_changed_fields: dict[str, dict[str, list[int]]] = {}
meeting_user_structured_information: dict[str, dict[str, list[int]]] = {}
user_id = db_instance["user_id"]
meeting_id = db_instance["meeting_id"]

Expand All @@ -143,7 +143,7 @@ def add_updated_meeting_user_history_information(

self.handle_group_updates(
user_entries,
meeting_user_changed_fields,
meeting_user_structured_information,
instance,
db_instance,
)
Expand All @@ -155,10 +155,10 @@ def add_updated_meeting_user_history_information(
user_entries,
for_user_id=user_id,
)
if meeting_user_changed_fields:
if meeting_user_structured_information:
information[
fqid_from_collection_and_id("meeting_user", db_instance["id"])
] = {"changed_fields": meeting_user_changed_fields}
] = {"structured_information": meeting_user_structured_information}

def add_created_meeting_user_history_information(
self,
Expand Down Expand Up @@ -205,7 +205,7 @@ def add_created_meeting_user_history_information(
for_user_id=db_instance["user_id"],
)
if "group_ids" in instance:
changed_fields: dict[str, dict[str, list[int]] | bool] = {
structured_information: dict[str, dict[str, list[int]] | bool] = {
"group_ids": {"added": instance["group_ids"]}
}
is_present_in_meeting_ids = self.datastore.get(
Expand All @@ -214,9 +214,9 @@ def add_created_meeting_user_history_information(
lock_result=False,
).get("is_present_in_meeting_ids", [])
if db_instance["meeting_id"] in is_present_in_meeting_ids:
changed_fields["is_present"] = True
structured_information["is_present"] = True
information[fqid_from_collection_and_id("meeting_user", instance["id"])] = {
"changed_fields": changed_fields
"structured_information": structured_information
}

def add_entries_to_history_information(
Expand All @@ -225,7 +225,7 @@ def add_entries_to_history_information(
entries: list[tuple[str, ...]] = [],
for_user_id: int | None = None,
for_meeting_user_id: int | None = None,
changed_fields: dict[Field, Any] | None = None,
structured_information: dict[Field, Any] | None = None,
) -> None:
if not for_user_id:
if not for_meeting_user_id:
Expand All @@ -241,15 +241,15 @@ def add_entries_to_history_information(
if fqid not in information:
if entries:
information[fqid] = {"entries": entries}
if changed_fields:
information[fqid]["changed_fields"] = changed_fields
if structured_information:
information[fqid]["structured_information"] = structured_information
else:
for entry in entries:
if entry not in information[fqid]["entries"]:
information[fqid]["entries"].append(entry)
if changed_fields:
information[fqid].setdefault("changed_fields", dict()).update(
changed_fields
if structured_information:
information[fqid].setdefault("structured_information", dict()).update(
structured_information
)

def compose_history_string(
Expand Down Expand Up @@ -281,7 +281,7 @@ def compose_history_string(
def handle_group_updates(
self,
entries: list[tuple[str, ...]],
meeting_user_changed_fields: dict[str, dict[str, list[int]]],
meeting_user_structured_information: dict[str, dict[str, list[int]]],
instance: dict[str, Any],
db_instance: dict[str, Any],
) -> None:
Expand All @@ -294,11 +294,13 @@ def handle_group_updates(

# Calculate history information for meeting_user
if added:
meeting_user_changed_fields["group_ids"] = {"added": list(added)}
meeting_user_structured_information["group_ids"] = {
"added": list(added)
}
if removed:
meeting_user_changed_fields.setdefault("group_ids", dict()).update(
{"removed": list(removed)}
)
meeting_user_structured_information.setdefault(
"group_ids", dict()
).update({"removed": list(removed)})

# remove default groups
meeting = self.datastore.get(
Expand Down
2 changes: 1 addition & 1 deletion openslides_backend/action/actions/user/set_present.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,6 @@ def get_history_information(self) -> HistoryInformation | None:
information[
fqid_from_collection_and_id("meeting_user", meeting_user["id"])
] = build_history_information_data(
changed_fields={"is_present": present}
structured_information={"is_present": present}
)
return information
2 changes: 1 addition & 1 deletion openslides_backend/models/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ class HistoryEntry(Model):

id = fields.IntegerField(required=True, constant=True)
entries = fields.TextArrayField()
changed_fields = fields.JSONField()
structured_information = fields.JSONField()
original_model_id = fields.CharField(constant=True)
model_id = fields.GenericRelationField(
to={
Expand Down
30 changes: 17 additions & 13 deletions openslides_backend/shared/history_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,45 +13,47 @@

def build_history_information_data(
entries: list[str] | None = None,
changed_fields: dict[str, Any] | None = None,
structured_information: dict[str, Any] | None = None,
) -> HistoryInformationData:
data: HistoryInformationData = {}
if entries is not None:
data["entries"] = entries
if changed_fields is not None:
data["changed_fields"] = changed_fields
if structured_information is not None:
data["structured_information"] = structured_information
return data


def update_history_information(
information: HistoryInformation,
fqid: FullQualifiedId,
entries: list[str] | None = None,
changed_fields: dict[str, Any] | None = None,
structured_information: dict[str, Any] | None = None,
) -> None:
"""Updates history information for fqid"""
if fqid not in information:
information[fqid] = build_history_information_data(entries, changed_fields)
information[fqid] = build_history_information_data(
entries, structured_information
)
else:
if entries:
information[fqid].setdefault("entries", list()).extend(entries)
if changed_fields:
information[fqid].setdefault("changed_fields", dict()).update(
changed_fields
if structured_information:
information[fqid].setdefault("structured_information", dict()).update(
structured_information
)


def update_history_information_multi(
information: HistoryInformation,
fqids: list[FullQualifiedId],
entries: list[str] | None = None,
changed_fields: dict[str, Any] | None = None,
structured_information: dict[str, Any] | None = None,
) -> None:
"""
Adds given HistoryInformation to the given information for every fqid in fqids.
"""
for fqid in fqids:
update_history_information(information, fqid, entries, changed_fields)
update_history_information(information, fqid, entries, structured_information)


def calculate_history_event_payloads(
Expand All @@ -68,7 +70,7 @@ def calculate_history_event_payloads(
model_fqid_to_entry_id[fqid],
fqid,
data.get("entries") or None,
data.get("changed_fields"),
data.get("structured_information"),
)
for fqid, data in information.items()
]
Expand All @@ -78,14 +80,16 @@ def calculate_history_event_payloads(
{
"id": id_,
"entries": entries,
"changed_fields": Jsonb(changed_fields) if changed_fields else None,
"structured_information": (
Jsonb(structured_information) if structured_information else None
),
"position_id": position_id,
"original_model_id": fqid,
"model_id": (fqid if fqid in existing_fqids else None),
"meeting_id": model_fqid_to_meeting_id.get(fqid, None),
},
)
for id_, fqid, entries, changed_fields in transformed_information
for id_, fqid, entries, structured_information in transformed_information
]
create_events.append(
(
Expand Down
2 changes: 1 addition & 1 deletion openslides_backend/shared/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

class HistoryInformationData(TypedDict):
entries: NotRequired[list[str]]
changed_fields: NotRequired[dict[Field, Any]]
structured_information: NotRequired[dict[Field, Any]]


HistoryInformation = dict[FullQualifiedId, HistoryInformationData]
Expand Down
2 changes: 1 addition & 1 deletion tests/database/reader/system/test_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ def test_types_str_list(db_connection: Connection) -> None:
1: {
"id": 1,
"entries": ["User added to meetings"],
"changed_fields": None,
"structured_information": None,
"meeting_id": 1,
"model_id": "user/1",
"model_id_assignment_id": None,
Expand Down
10 changes: 6 additions & 4 deletions tests/system/action/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ def get_last_history_information(
if entry_id:
return self.datastore.get(
fqid_from_collection_and_id("history_entry", entry_id),
["entries", "changed_fields"],
["entries", "structured_information"],
lock_result=False,
)
else:
Expand All @@ -320,13 +320,13 @@ def assert_history_information(
self,
fqid: FullQualifiedId,
entries: list[str] | None = None,
changed_fields: dict[str, Any] | None = None,
structured_information: dict[str, Any] | None = None,
) -> None:
"""
Asserts that the last history information for the given model is the given information.
"""
last_information = self.get_last_history_information(fqid)
if entries is None and changed_fields is None:
if entries is None and structured_information is None:
assert (
not last_information
), f"Expected no history information to be generated for {fqid}. Got:\n{last_information}"
Expand All @@ -335,7 +335,9 @@ def assert_history_information(
last_information
), f"No history information was be generated for {fqid}."
self.assertEqual(last_information.get("entries"), entries)
self.assertEqual(last_information.get("changed_fields"), changed_fields)
self.assertEqual(
last_information.get("structured_information"), structured_information
)

def assert_history_information_contains(
self, fqid: FullQualifiedId, entry: str
Expand Down
2 changes: 1 addition & 1 deletion tests/system/action/user/test_create.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def test_create_some_more_fields(self) -> None:
)
self.assert_history_information(
"meeting_user/1",
changed_fields={"group_ids": {"added": [114]}},
structured_information={"group_ids": {"added": [114]}},
)

def test_create_comment(self) -> None:
Expand Down
16 changes: 8 additions & 8 deletions tests/system/action/user/test_delegation_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,14 @@ def assert_alice_redelegated_to(self, who_id: int, prepend: list[str] = []) -> N
],
)

def assert_meeting_user_changed_fields(self, user_id: int) -> None:
def assert_meeting_user_structured_information(self, user_id: int) -> None:
self.assert_model_exists(
f"meeting_user/{self.next_meeting_user_id}",
{"user_id": user_id, "meeting_id": 1, "group_ids": [3]},
)
self.assert_history_information(
f"meeting_user/{self.next_meeting_user_id}",
changed_fields={"group_ids": {"added": [3]}},
structured_information={"group_ids": {"added": [3]}},
)

def test_update_delegate_vote(self) -> None:
Expand All @@ -128,7 +128,7 @@ def test_create_delegate_vote(self) -> None:
"meeting/1",
],
)
self.assert_meeting_user_changed_fields(self.next_user_id)
self.assert_meeting_user_structured_information(self.next_user_id)

def test_create_receive_delegated_vote(self) -> None:
self.make_request(
Expand All @@ -146,7 +146,7 @@ def test_create_receive_delegated_vote(self) -> None:
"meeting/1",
],
)
self.assert_meeting_user_changed_fields(self.next_user_id)
self.assert_meeting_user_structured_information(self.next_user_id)

def test_update_re_delegate_vote(self) -> None:
self.setup_delegation()
Expand Down Expand Up @@ -176,7 +176,7 @@ def test_create_re_delegate_vote_reverse(self) -> None:
"meeting/1",
],
)
self.assert_meeting_user_changed_fields(self.next_user_id)
self.assert_meeting_user_structured_information(self.next_user_id)

def test_update_re_delegate_received_votes(self) -> None:
self.setup_delegation()
Expand Down Expand Up @@ -387,7 +387,7 @@ def test_create_multiple_from_ids(self) -> None:
"meeting/1",
],
)
self.assert_meeting_user_changed_fields(self.next_user_id + 2)
self.assert_meeting_user_structured_information(self.next_user_id + 2)
for id_ in [self.alice_id, self.bob_id, self.colin_id, eric_id, fredric_id]:
self.assert_history_information(
f"user/{id_}",
Expand Down Expand Up @@ -421,7 +421,7 @@ def test_update_create_meeting_user_receiving_delegation(self) -> None:
"meeting/1",
],
)
self.assert_meeting_user_changed_fields(debra_id)
self.assert_meeting_user_structured_information(debra_id)

def test_update_create_meeting_user_with_delegation(self) -> None:
debra_id = self.create_user("debra")
Expand Down Expand Up @@ -449,4 +449,4 @@ def test_update_create_meeting_user_with_delegation(self) -> None:
"meeting/1",
],
)
self.assert_meeting_user_changed_fields(debra_id)
self.assert_meeting_user_structured_information(debra_id)
Loading
Loading