final base implementation for as_operations, time to test
This commit is contained in:
parent
8f2997a4df
commit
820ccb134e
1 changed files with 23 additions and 13 deletions
|
@ -446,7 +446,7 @@ class ChangedObjectCollection(BaseSchema):
|
|||
dummy_unique_value_avoid.setdefault(
|
||||
new_operation.obj.model, {}
|
||||
)[field_name] = frozenset(
|
||||
model_cls.objects.values_list(field_name, flat=True)
|
||||
model_cls.objects.values_list(field_name.attname, flat=True)
|
||||
) | unique_values_needed.get(new_operation.obj.model, {}).get(field_name, set())
|
||||
|
||||
choices = (
|
||||
|
@ -492,7 +492,7 @@ class ChangedObjectCollection(BaseSchema):
|
|||
raise NotImplementedError
|
||||
new_operation.fields[field_name] = new_val
|
||||
|
||||
# construct new situation
|
||||
# construct new situation # todo: merge create operations one day
|
||||
new_situation = situation.model_copy(deep=True)
|
||||
new_situation.remaining_operations_with_dependencies.pop(i)
|
||||
new_situation.operations.append(new_operation)
|
||||
|
@ -511,8 +511,6 @@ class ChangedObjectCollection(BaseSchema):
|
|||
# we already reached this situation with the same or less amount of operations
|
||||
continue
|
||||
|
||||
# todo: finish this...
|
||||
|
||||
# todo: don't forget nullable references and unique values
|
||||
|
||||
if isinstance(new_operation, CreateObjectOperation):
|
||||
|
@ -532,11 +530,6 @@ class ChangedObjectCollection(BaseSchema):
|
|||
}
|
||||
if field.is_relation:
|
||||
relations_changed.add(field_name)
|
||||
# unique field was changed? remove unique value entry [might be readded below]
|
||||
occupied_unique_values[field_name] = {
|
||||
val: pk for val, pk in occupied_unique_values[field_name].items()
|
||||
if pk != new_operation.obj.model
|
||||
}
|
||||
|
||||
if relations_changed:
|
||||
# relation field was changed? remove reference entry [might be readded below]
|
||||
|
@ -563,11 +556,28 @@ class ChangedObjectCollection(BaseSchema):
|
|||
if ref.obj != new_operation.obj
|
||||
}
|
||||
|
||||
# todo: cascading…?
|
||||
# wwe ignore cascading for now
|
||||
else:
|
||||
pass # todo: add new unique values and references
|
||||
|
||||
# todo: ...to this
|
||||
for field_name, value in new_operation.fields.items():
|
||||
field = model_cls._meta.get_field(field_name)
|
||||
if value is None:
|
||||
continue
|
||||
if field.unique:
|
||||
# unique field was changed? add unique value entry
|
||||
new_situation.occupied_unique_values.setdefault(
|
||||
new_operation.obj.model, {}
|
||||
).setdefault(field_name, {})[value] = new_operation.obj.id
|
||||
if field.is_relation:
|
||||
# relation field was changed? add foundobjectreference
|
||||
new_situation.obj_references.setdefault(
|
||||
field.related_model._meta.model_name, {}
|
||||
).setdefault(value, set()).add(
|
||||
FoundObjectReference(
|
||||
obj=new_operation.obj,
|
||||
field=field_name,
|
||||
on_delete=field.on_delete.__name__,
|
||||
)
|
||||
)
|
||||
|
||||
# finally insert new situation
|
||||
bisect.insort(open_situations, new_situation, key=lambda s: len(s.operations))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue