|
4 | 4 | from datetime import datetime |
5 | 5 | from typing import Any |
6 | 6 |
|
| 7 | +from psycopg.types.json import Jsonb |
| 8 | + |
7 | 9 | from openslides_backend.action.actions.meeting.mixins import MeetingPermissionMixin |
8 | 10 | from openslides_backend.migrations.migration_helper import MigrationHelper |
9 | 11 | from openslides_backend.models.base import model_registry |
|
13 | 15 | BaseRelationField, |
14 | 16 | GenericRelationField, |
15 | 17 | GenericRelationListField, |
| 18 | + JSONField, |
16 | 19 | OnDelete, |
17 | 20 | RelationField, |
18 | 21 | RelationListField, |
| 22 | + TimestampField, |
19 | 23 | ) |
20 | 24 | from openslides_backend.models.models import Meeting |
21 | 25 | from openslides_backend.permissions.management_levels import OrganizationManagementLevel |
@@ -161,9 +165,42 @@ def preprocess_data(self, instance: dict[str, Any]) -> dict[str, Any]: |
161 | 165 | self.remove_not_allowed_fields(instance) |
162 | 166 | self.set_committee_and_orga_relation(instance) |
163 | 167 | self.check_data_migration_index(instance) |
| 168 | + self.transform_timestamps(instance) |
164 | 169 | self.unset_committee_and_orga_relation(instance) |
165 | 170 | return instance |
166 | 171 |
|
| 172 | + def transform_timestamps(self, instance: dict[str, Any]) -> dict[str, Any]: |
| 173 | + for collection, collection_data in instance["meeting"].items(): |
| 174 | + if model := model_registry.get(collection): |
| 175 | + fields = list(model().get_fields()) |
| 176 | + timestamp_field_names = [ |
| 177 | + field.own_field_name |
| 178 | + for field in fields |
| 179 | + if isinstance(field, TimestampField) |
| 180 | + ] |
| 181 | + if timestamp_field_names: |
| 182 | + for mod in collection_data.values(): |
| 183 | + for field in timestamp_field_names: |
| 184 | + if (iso := mod.get(field)) and isinstance(iso, str): |
| 185 | + mod[field] = datetime.fromisoformat(iso) |
| 186 | + return instance |
| 187 | + |
| 188 | + def transform_json_fields(self, instance: dict[str, Any]) -> dict[str, Any]: |
| 189 | + for collection, collection_data in instance["meeting"].items(): |
| 190 | + if model := model_registry.get(collection): |
| 191 | + fields = list(model().get_fields()) |
| 192 | + json_field_names = [ |
| 193 | + field.own_field_name |
| 194 | + for field in fields |
| 195 | + if isinstance(field, JSONField) |
| 196 | + ] |
| 197 | + if json_field_names: |
| 198 | + for mod in collection_data.values(): |
| 199 | + for field in json_field_names: |
| 200 | + if field in mod: |
| 201 | + mod[field] = Jsonb(mod[field]) |
| 202 | + return instance |
| 203 | + |
167 | 204 | def check_one_meeting(self, instance: dict[str, Any]) -> None: |
168 | 205 | if len(instance["meeting"]["meeting"]) != 1: |
169 | 206 | raise ActionException("Need exactly one meeting in meeting collection.") |
@@ -276,6 +313,7 @@ def update_instance(self, instance: dict[str, Any]) -> dict[str, Any]: |
276 | 313 | raise ActionException(str(ce)) |
277 | 314 | self.allowed_collections = checker.allowed_collections |
278 | 315 |
|
| 316 | + self.transform_json_fields(instance) |
279 | 317 | self.check_limit_of_meetings() |
280 | 318 | self.update_meeting_and_users(instance) |
281 | 319 |
|
@@ -752,7 +790,7 @@ def check_data_migration_index(self, instance: dict[str, Any]) -> None: |
752 | 790 | """ |
753 | 791 | Check for valid migration index. |
754 | 792 | """ |
755 | | - start_migration_index = instance["meeting"].pop("_migration_index") |
| 793 | + start_migration_index = instance["meeting"].get("_migration_index") |
756 | 794 | backend_migration_index = MigrationHelper.get_backend_migration_index() |
757 | 795 | if backend_migration_index < start_migration_index: |
758 | 796 | raise ActionException( |
|
0 commit comments