Source code for apis_core.relations.signals

import logging

from django.contrib.contenttypes.models import ContentType
from django.dispatch import receiver

from apis_core.generic.signals import post_duplicate, post_merge_with
from apis_core.relations.models import Relation

logger = logging.getLogger(__name__)


[docs] @receiver(post_duplicate) def copy_relations(sender, instance, duplicate, **kwargs): logger.info(f"Copying relations from {instance!r} to {duplicate!r}") content_type = ContentType.objects.get_for_model(instance) subj_rels = Relation.objects.filter( subj_content_type=content_type, subj_object_id=instance.id ).select_subclasses() obj_rels = Relation.objects.filter( obj_content_type=content_type, obj_object_id=instance.id ).select_subclasses() for rel in subj_rels: rel.pk = None rel.id = None rel.subj_object_id = duplicate.id rel.save() for rel in obj_rels: rel.pk = None rel.id = None rel.obj_object_id = duplicate.id rel.save()
[docs] @receiver(post_merge_with) def merge_relations(sender, instance, entities, **kwargs): for ent in entities: logger.info(f"Merging relations from {ent!r} into {instance!r}") content_type = ContentType.objects.get_for_model(ent) Relation.objects.filter( subj_content_type=content_type, subj_object_id=ent.id ).update(subj_object_id=instance.id) Relation.objects.filter( obj_content_type=content_type, obj_object_id=ent.id ).update(obj_object_id=instance.id)