some more partial work on completing PreviousObjects data
This commit is contained in:
parent
f2f0b9fdae
commit
a231b62885
1 changed files with 25 additions and 5 deletions
|
@ -1,18 +1,19 @@
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
|
from typing import Type
|
||||||
|
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
|
from django.db.models import Model, OneToOneField, ForeignKey
|
||||||
|
|
||||||
from c3nav.api.schema import BaseSchema
|
from c3nav.api.schema import BaseSchema
|
||||||
from c3nav.editor.operations import DatabaseOperationCollection, CreateObjectOperation, UpdateObjectOperation, \
|
from c3nav.editor.operations import DatabaseOperationCollection, CreateObjectOperation, UpdateObjectOperation, \
|
||||||
DeleteObjectOperation, ClearManyToManyOperation, FieldValuesDict, ObjectReference, PreviousObjectCollection, \
|
DeleteObjectOperation, ClearManyToManyOperation, FieldValuesDict, ObjectReference, PreviousObjectCollection
|
||||||
DatabaseOperation
|
|
||||||
from c3nav.mapdata.fields import I18nField
|
from c3nav.mapdata.fields import I18nField
|
||||||
|
|
||||||
|
|
||||||
class ChangedManyToMany(BaseSchema):
|
class ChangedManyToMany(BaseSchema):
|
||||||
cleared: bool = False
|
cleared: bool = False
|
||||||
added: list[str] = []
|
added: list[int] = []
|
||||||
removed: list[str] = []
|
removed: list[int] = []
|
||||||
|
|
||||||
|
|
||||||
class ChangedObject(BaseSchema):
|
class ChangedObject(BaseSchema):
|
||||||
|
@ -81,7 +82,26 @@ class ChangedObjectCollection(BaseSchema):
|
||||||
changed_m2m.removed = sorted((set(changed_m2m.removed) - operation.add_values)
|
changed_m2m.removed = sorted((set(changed_m2m.removed) - operation.add_values)
|
||||||
| operation.remove_values)
|
| operation.remove_values)
|
||||||
|
|
||||||
|
def clean_and_complete_prev(self):
|
||||||
|
ids: dict[str, set[int]] = {}
|
||||||
|
for model_name, changed_objects in self.objects.items():
|
||||||
|
ids.setdefault(model_name, set()).update(set(changed_objects.keys()))
|
||||||
|
model = apps.get_model("mapdata", model_name)
|
||||||
|
relations: dict[str, Type[Model]] = {field.name: field.related_model
|
||||||
|
for field in model.get_fields() if field.is_relation}
|
||||||
|
for obj in changed_objects.values():
|
||||||
|
for field_name, value in obj.fields.items():
|
||||||
|
related_model = relations.get(field_name, None)
|
||||||
|
if related_model is None or value is None:
|
||||||
|
continue
|
||||||
|
ids.setdefault(related_model._meta.model_name, set()).add(value)
|
||||||
|
for field_name, field_changes in obj.m2m_changes.items():
|
||||||
|
related_model = relations[field_name]
|
||||||
|
if field_changes.added or field_changes.removed:
|
||||||
|
ids.setdefault(related_model._meta.model_name, set()).update(field_changes.added)
|
||||||
|
ids.setdefault(related_model._meta.model_name, set()).update(field_changes.removed)
|
||||||
|
# todo: move this to some kind of "usage explanation" function, implement rest of this
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def as_operations(self) -> DatabaseOperationCollection:
|
def as_operations(self) -> DatabaseOperationCollection:
|
||||||
|
|
||||||
pass # todo: implement
|
pass # todo: implement
|
Loading…
Add table
Add a link
Reference in a new issue