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(
|
dummy_unique_value_avoid.setdefault(
|
||||||
new_operation.obj.model, {}
|
new_operation.obj.model, {}
|
||||||
)[field_name] = frozenset(
|
)[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())
|
) | unique_values_needed.get(new_operation.obj.model, {}).get(field_name, set())
|
||||||
|
|
||||||
choices = (
|
choices = (
|
||||||
|
@ -492,7 +492,7 @@ class ChangedObjectCollection(BaseSchema):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
new_operation.fields[field_name] = new_val
|
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 = situation.model_copy(deep=True)
|
||||||
new_situation.remaining_operations_with_dependencies.pop(i)
|
new_situation.remaining_operations_with_dependencies.pop(i)
|
||||||
new_situation.operations.append(new_operation)
|
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
|
# we already reached this situation with the same or less amount of operations
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# todo: finish this...
|
|
||||||
|
|
||||||
# todo: don't forget nullable references and unique values
|
# todo: don't forget nullable references and unique values
|
||||||
|
|
||||||
if isinstance(new_operation, CreateObjectOperation):
|
if isinstance(new_operation, CreateObjectOperation):
|
||||||
|
@ -532,11 +530,6 @@ class ChangedObjectCollection(BaseSchema):
|
||||||
}
|
}
|
||||||
if field.is_relation:
|
if field.is_relation:
|
||||||
relations_changed.add(field_name)
|
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:
|
if relations_changed:
|
||||||
# relation field was changed? remove reference entry [might be readded below]
|
# relation field was changed? remove reference entry [might be readded below]
|
||||||
|
@ -563,11 +556,28 @@ class ChangedObjectCollection(BaseSchema):
|
||||||
if ref.obj != new_operation.obj
|
if ref.obj != new_operation.obj
|
||||||
}
|
}
|
||||||
|
|
||||||
# todo: cascading…?
|
# wwe ignore cascading for now
|
||||||
else:
|
else:
|
||||||
pass # todo: add new unique values and references
|
for field_name, value in new_operation.fields.items():
|
||||||
|
field = model_cls._meta.get_field(field_name)
|
||||||
# todo: ...to this
|
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
|
# finally insert new situation
|
||||||
bisect.insort(open_situations, new_situation, key=lambda s: len(s.operations))
|
bisect.insort(open_situations, new_situation, key=lambda s: len(s.operations))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue