def delete(
self,
model: type[SyncableMixin],
deletes: dict[str, int],
origin_node: str,
) -> None:
if not deletes:
return
from django_spire.contrib.sync.django.sequence import ( # noqa: PLC0415
SyncSequenceAllocator,
)
identity_lookup = {f'{self._identity_field}__in': list(deletes.keys())}
instances = list(model.objects.filter(**identity_lookup))
pending = self._collect_pending(instances, deletes)
if not pending:
return
sequence_first = SyncSequenceAllocator().allocate(len(pending)).value_first
model_label = model._meta.label
with sync_bypass():
for index, instance in enumerate(pending):
key = str(getattr(instance, self._identity_field))
tombstone_timestamp = deletes[key]
local_sequence = sequence_first + index
staleness_filter = {
self._identity_field: key,
'sync_field_last_modified__lte': tombstone_timestamp,
}
model.objects.filter(**staleness_filter).update(
is_deleted=True,
sync_field_last_modified=instance.sync_field_last_modified,
sync_field_origin_node=origin_node,
sync_field_sequence=local_sequence,
sync_field_timestamps=instance.sync_field_timestamps,
)
_record_tombstone(
model_label,
key,
tombstone_timestamp,
local_sequence,
origin_node,
)