Skip to content

Commit ff6d6cb

Browse files
Merge branch 'staging-t1/4.3.1' into dep/update-meta-staging-t1/4.3.1
2 parents b0640c9 + e474690 commit ff6d6cb

31 files changed

+1054
-600
lines changed

cli/generate_models.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ class Attribute(Node):
183183
constant: bool = False
184184
default: Any = None
185185
on_delete: OnDelete | None = None
186-
equal_fields: str | list[str] | None = None
187186
constraints: dict[str, Any]
188187
is_view_field: bool = False
189188
is_primary: bool = False
@@ -224,7 +223,6 @@ def __init__(
224223
self.read_only = value.pop("read_only", False)
225224
self.constant = value.pop("constant", False)
226225
self.default = value.pop("default", None)
227-
self.equal_fields = value.pop("equal_fields", None)
228226
for k, v in value.items():
229227
if k not in (
230228
"items",
@@ -234,6 +232,7 @@ def __init__(
234232
"sql",
235233
"deferred",
236234
"unique",
235+
"equal_fields",
237236
):
238237
if k == "enum" and isinstance(v, str):
239238
enum_name = HelperGetNames.get_enum_name(v)
@@ -278,8 +277,6 @@ def get_code(self, field_name: str) -> str:
278277
properties += "constant=True, "
279278
if self.default is not None:
280279
properties += f"default={repr(self.default)}, "
281-
if self.equal_fields is not None:
282-
properties += f"equal_fields={repr(self.equal_fields)}, "
283280
if self.constraints:
284281
properties += f"constraints={repr(self.constraints)}, "
285282
if self.write_fields is not None:

openslides_backend/action/action.py

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
from .relations.relation_manager import RelationManager, RelationUpdates
4949
from .relations.typing import FieldUpdateElement, ListUpdateElement
5050
from .util.action_type import ActionType
51-
from .util.assert_belongs_to_meeting import assert_belongs_to_meeting
5251
from .util.typing import ActionData, ActionResultElement, ActionResults
5352

5453
HISTORY_MODELS = list(
@@ -697,54 +696,6 @@ def validate_fields(self, instance: dict[str, Any]) -> dict[str, Any]:
697696
raise ActionException(str(e))
698697
return instance
699698

700-
def validate_relation_fields(self, instance: dict[str, Any]) -> None:
701-
"""
702-
Validates all relation fields according to the model definition.
703-
"""
704-
for field in self.model.get_relation_fields():
705-
if not field.equal_fields or field.own_field_name not in instance:
706-
continue
707-
708-
fields = [field.own_field_name]
709-
for equal_field in field.equal_fields:
710-
if not (own_equal_field_value := instance.get(equal_field)):
711-
fqid = fqid_from_collection_and_id(
712-
self.model.collection, instance["id"]
713-
)
714-
db_instance = self.datastore.get(
715-
fqid,
716-
[equal_field],
717-
)
718-
if not (own_equal_field_value := db_instance.get(equal_field)):
719-
raise ActionException(
720-
f"{fqid} has no value for the field {equal_field}"
721-
)
722-
for instance_field in fields:
723-
fqids = transform_to_fqids(
724-
instance[instance_field], field.get_target_collection()
725-
)
726-
if equal_field == "meeting_id":
727-
assert_belongs_to_meeting(
728-
self.datastore, fqids, own_equal_field_value
729-
)
730-
else:
731-
for fqid in fqids:
732-
related_instance = self.datastore.get(
733-
fqid,
734-
[equal_field],
735-
)
736-
if str(related_instance.get(equal_field)) != str(
737-
own_equal_field_value
738-
):
739-
raise ActionException(
740-
f"The relation {field.own_field_name} requires the following "
741-
f"fields to be equal:\n"
742-
f"{field.own_collection}/{instance['id']}/{equal_field}: "
743-
f"{own_equal_field_value}\n"
744-
f"{fqid}/{equal_field}: "
745-
f"{related_instance.get(equal_field)}"
746-
)
747-
748699
def apply_instance(
749700
self, instance: dict[str, Any], fqid: FullQualifiedId | None = None
750701
) -> None:

openslides_backend/action/action_handler.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,15 @@ def transform_to_list(
178178
)
179179
except RaiseException as e:
180180
# This is raised at the end of transaction as the constraint trigger has to be initially deferred.
181-
raise RelationException(
182-
f"Relation violates required constraint: {e}"
183-
)
181+
if len(msg_lis := str(e).split(": ")) > 1 and msg_lis[1].startswith(
182+
"NOT NULL CONSTRAINT VIOLATED"
183+
):
184+
raise RelationException(
185+
f"Relation violates required constraint: {e}"
186+
)
187+
else:
188+
# Assume equal_fields error
189+
raise RelationException(str(e).split("\nCONTEXT:")[0])
184190
except ForeignKeyViolation as e:
185191
# This is raised at the end of transaction as the constraint trigger has to be initially deferred.
186192
pattern = r'Key\s*\(\w+_id\)=\((\d+)\).*?"(\w+)_t"'

openslides_backend/action/actions/projector/project.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
)
1212
from ...mixins.singular_action_mixin import SingularActionMixin
1313
from ...mixins.weight_mixin import WeightMixin
14-
from ...util.assert_belongs_to_meeting import assert_belongs_to_meeting
1514
from ...util.default_schema import DefaultSchema
1615
from ...util.register import register_action
1716
from ...util.typing import ActionData
@@ -51,8 +50,7 @@ def get_updated_instances(self, action_data: ActionData) -> ActionData:
5150
content_object_collection, content_object_id = collection_and_id_from_fqid(
5251
fqid_content_object
5352
)
54-
meeting_member_check_necessary = True
55-
if content_object_collection == "mediafile":
53+
if content_object_collection == "mediafile": # TODO: Not possible I think
5654
meeting_mediafile = get_meeting_mediafile_id_or_create_payload(
5755
self.datastore, meeting_id, content_object_id, lock_result=False
5856
)
@@ -63,24 +61,13 @@ def get_updated_instances(self, action_data: ActionData) -> ActionData:
6361
meeting_mediafile_id: int = cast(
6462
list[dict[str, Any]], create_result
6563
)[0]["id"]
66-
meeting_member_check_necessary = False
6764
else:
6865
meeting_mediafile_id = meeting_mediafile
6966
fqid_content_object = instance["content_object_id"] = (
7067
fqid_from_collection_and_id(
7168
"meeting_mediafile", meeting_mediafile_id
7269
)
7370
)
74-
if meeting_member_check_necessary:
75-
assert_belongs_to_meeting(
76-
self.datastore,
77-
[fqid_content_object]
78-
+ [
79-
fqid_from_collection_and_id("projector", id)
80-
for id in instance["ids"]
81-
],
82-
meeting_id,
83-
)
8471

8572
self.move_equal_projections_to_history_or_unset(instance, meeting_id)
8673
if not instance.get("stable"):

openslides_backend/action/generics/create.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ def base_update_instance(self, instance: dict[str, Any]) -> dict[str, Any]:
2929
instance["meta_new"] = True # mark as a new model
3030
instance = self.update_instance(instance)
3131
self.apply_instance(instance)
32-
self.validate_relation_fields(instance)
3332

3433
return instance
3534

openslides_backend/action/generics/update.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ def base_update_instance(self, instance: dict[str, Any]) -> dict[str, Any]:
1616
instance = self.update_instance(instance)
1717
self.apply_instance(instance)
1818

19-
self.validate_relation_fields(instance)
20-
2119
return instance
2220

2321
def create_events(self, instance: dict[str, Any]) -> Iterable[Event]:

openslides_backend/migrations/migration_handler.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ def replace_suffix(m: re.Match) -> str:
199199
create_trigger_1_n_relation_not_null_code,
200200
create_trigger_n_m_relation_not_null_code,
201201
create_trigger_unique_ids_pair_code,
202+
create_trigger_equal_fields_code,
202203
create_trigger_notify_code,
203204
errors,
204205
) = GenerateCodeBlocks.generate_the_code()
@@ -207,6 +208,7 @@ def replace_suffix(m: re.Match) -> str:
207208
+ create_trigger_1_n_relation_not_null_code
208209
+ create_trigger_n_m_relation_not_null_code
209210
+ create_trigger_unique_ids_pair_code
211+
+ create_trigger_equal_fields_code
210212
)
211213
# replace with the migration names before execute
212214
replaced_blocks = []
@@ -497,6 +499,7 @@ def finalize(self) -> None:
497499
create_trigger_1_n_relation_not_null_code,
498500
create_trigger_n_m_relation_not_null_code,
499501
create_trigger_unique_ids_pair_code,
502+
create_trigger_equal_fields_code,
500503
create_trigger_notify_code,
501504
errors,
502505
) = GenerateCodeBlocks.generate_the_code()
@@ -509,6 +512,7 @@ def finalize(self) -> None:
509512
+ create_trigger_n_m_relation_not_null_code
510513
+ create_trigger_unique_ids_pair_code
511514
+ create_trigger_notify_code
515+
+ create_trigger_equal_fields_code
512516
)
513517
for collection_or_imt in im_tables | set(unified_replace_tables):
514518
to_drop_triggers = self.cursor.execute(

openslides_backend/models/fields.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -370,16 +370,11 @@ def __init__(
370370
self,
371371
to: dict[Collection, str],
372372
on_delete: OnDelete = OnDelete.SET_NULL,
373-
equal_fields: str | list[str] = [],
374373
**kwargs: Any,
375374
) -> None:
376375
super().__init__(**kwargs)
377376
self.to = to
378377
self.on_delete = on_delete
379-
if isinstance(equal_fields, list):
380-
self.equal_fields = equal_fields
381-
else:
382-
self.equal_fields = [equal_fields]
383378

384379
def get_target_collection(self) -> Collection:
385380
"""
@@ -392,7 +387,7 @@ def __str__(self) -> str:
392387
return (
393388
f"{self.__class__.__name__}(to={self.to}, is_list_field={self.is_list_field}, "
394389
f"on_delete={self.on_delete}, required={self.required}, "
395-
f"constraints={self.constraints}, equal_fields={self.equal_fields})"
390+
f"constraints={self.constraints})"
396391
)
397392

398393

0 commit comments

Comments
 (0)