Skip to content

Commit 7dbba95

Browse files
authored
Meeting_export with 4.2.29 compatibility (#3388)
1 parent 38b8495 commit 7dbba95

File tree

3 files changed

+103
-4
lines changed

3 files changed

+103
-4
lines changed

openslides_backend/presenter/export_meeting.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"description": "export meeting",
1919
"properties": {
2020
"meeting_id": required_id_schema,
21+
"old_db_compatibility": {"type": "boolean"},
2122
},
2223
}
2324
)
@@ -41,7 +42,10 @@ def get_result(self) -> Any:
4142
msg += f" Missing permission: {OrganizationManagementLevel.SUPERADMIN}"
4243
raise PermissionDenied(msg)
4344
export_data = export_meeting(
44-
self.datastore, self.data["meeting_id"], datetime_decimal_to_string=True
45+
self.datastore,
46+
self.data["meeting_id"],
47+
transform_datetime_decimal=True,
48+
datetime_to_unix=self.data.get("old_db_compatibility"),
4549
)
4650
if id_ := next(
4751
(
@@ -53,6 +57,8 @@ def get_result(self) -> Any:
5357
):
5458
raise PresenterException(f"Cannot export: meeting {id_} is locked.")
5559
self.exclude_organization_tags_and_default_meeting_for_committee(export_data)
60+
if self.data.get("old_db_compatibility"):
61+
self.add_missing_mm_inherited_access_group_ids(export_data)
5662
return export_data
5763

5864
def exclude_organization_tags_and_default_meeting_for_committee(
@@ -63,6 +69,15 @@ def exclude_organization_tags_and_default_meeting_for_committee(
6369
"default_meeting_for_committee_id", None
6470
)
6571

72+
def add_missing_mm_inherited_access_group_ids(
73+
self, export_data: dict[str, Any]
74+
) -> None:
75+
if "meeting_mediafile" not in export_data:
76+
return
77+
for meeting_mediafile_data in export_data["meeting_mediafile"].values():
78+
if "inherited_access_group_ids" not in meeting_mediafile_data:
79+
meeting_mediafile_data["inherited_access_group_ids"] = []
80+
6681
def get_meeting_from_json(self, export_data: Any) -> Any:
6782
key = next(iter(export_data["meeting"]))
6883
return export_data["meeting"][key]

openslides_backend/shared/export_helper.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ def export_meeting(
3636
meeting_id: int,
3737
internal_target: bool = False,
3838
update_mediafiles: bool = False,
39-
datetime_decimal_to_string: bool = False,
39+
transform_datetime_decimal: bool = False,
40+
datetime_to_unix: bool = False,
4041
) -> dict[str, Any]:
4142
export: dict[str, Any] = {}
4243

@@ -215,11 +216,15 @@ def export_meeting(
215216
export[collection] = dict(
216217
sorted(instances.items(), key=lambda item: int(item[0]))
217218
)
218-
if datetime_decimal_to_string and isinstance(instances, dict):
219+
if transform_datetime_decimal and isinstance(instances, dict):
219220
for data in instances.values():
220221
for field, value in data.items():
221222
if isinstance(value, datetime.datetime):
222-
data[field] = value.isoformat()
223+
if datetime_to_unix:
224+
clean_value = value.replace(microsecond=0)
225+
data[field] = clean_value.timestamp()
226+
else:
227+
data[field] = value.isoformat()
223228
if isinstance(value, Decimal):
224229
data[field] = str(value)
225230

tests/system/presenter/test_export_meeting.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,3 +474,82 @@ def test_with_structured_published_orga_files(self) -> None:
474474
assert status_code == 200
475475
# Should not include mediafile ids bc presenter does not include orga mediafiles
476476
assert data["mediafile"] == {}
477+
478+
def base_test_export_with_timestamps_old_db_compatibility(
479+
self, old_db_compatibility: bool
480+
) -> None:
481+
meeting_timestamp_unix = 626637600
482+
meeting_timestamp_string = "1989-11-09T18:00:00+00:00"
483+
motion_timestamp_unix = 1033479479
484+
motion_timestamp_string = "2002-10-01T13:37:59.687459+00:00"
485+
self.set_models(
486+
{
487+
"meeting/1": {
488+
"start_time": datetime.fromtimestamp(
489+
meeting_timestamp_unix, tz=ZoneInfo("Europe/Berlin")
490+
)
491+
}
492+
}
493+
)
494+
self.create_motion(
495+
1,
496+
1,
497+
motion_data={
498+
"created": datetime.fromtimestamp(
499+
1033479479.687459, tz=ZoneInfo("Europe/Berlin")
500+
)
501+
},
502+
)
503+
old_db_compatibility_data = (
504+
{"old_db_compatibility": True} if old_db_compatibility else {}
505+
)
506+
status_code, data = self.request(
507+
"export_meeting",
508+
{"meeting_id": 1, **old_db_compatibility_data},
509+
)
510+
assert status_code == 200
511+
if old_db_compatibility:
512+
assert data["meeting"]["1"]["start_time"] == meeting_timestamp_unix
513+
assert data["motion"]["1"]["created"] == motion_timestamp_unix
514+
else:
515+
assert data["meeting"]["1"]["start_time"] == meeting_timestamp_string
516+
assert data["motion"]["1"]["created"] == motion_timestamp_string
517+
518+
def test_export_with_timestamps_old_db_compatibility_true(self) -> None:
519+
self.base_test_export_with_timestamps_old_db_compatibility(True)
520+
521+
def test_export_with_timestamps_old_db_compatibility_false(self) -> None:
522+
self.base_test_export_with_timestamps_old_db_compatibility(False)
523+
524+
def base_test_export_without_mmiagi_old_db_compatibility(
525+
self, old_db_compatibility: bool
526+
) -> None:
527+
self.create_mediafile(1, 1)
528+
self.set_models(
529+
{
530+
"meeting_mediafile/1": {
531+
"is_public": False,
532+
"meeting_id": 1,
533+
"mediafile_id": 1,
534+
},
535+
}
536+
)
537+
old_db_compatibility_data = (
538+
{"old_db_compatibility": True} if old_db_compatibility else {}
539+
)
540+
status_code, data = self.request(
541+
"export_meeting",
542+
{"meeting_id": 1, **old_db_compatibility_data},
543+
)
544+
assert status_code == 200
545+
if old_db_compatibility:
546+
assert data["meeting_mediafile"]["1"]["inherited_access_group_ids"] == []
547+
else:
548+
assert "inherited_access_group_ids" not in data["meeting_mediafile"]["1"]
549+
assert "access_group_ids" not in data["meeting_mediafile"]["1"]
550+
551+
def test_export_without_mmiagi_old_db_compatibility_true(self) -> None:
552+
self.base_test_export_without_mmiagi_old_db_compatibility(True)
553+
554+
def test_export_without_mmiagi_old_db_compatibility_false(self) -> None:
555+
self.base_test_export_without_mmiagi_old_db_compatibility(False)

0 commit comments

Comments
 (0)