Coverage for apis_core / entities / signals.py: 55%

29 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-05-05 11:37 +0000

1import logging 

2 

3from django.conf import settings 

4from django.contrib.contenttypes.models import ContentType 

5from django.db.models.signals import post_save 

6from django.dispatch import receiver 

7 

8from apis_core.entities.abc import Entity 

9from apis_core.entities.models import EntityID 

10from apis_core.generic.signals import post_merge_with 

11 

12logger = logging.getLogger(__name__) 

13 

14 

15@receiver(post_save) 

16def create_default_entity_id( 

17 sender, instance, created, raw, using, update_fields, **kwargs 

18): 

19 # disable the handler during fixture loading 

20 if raw: 

21 return 

22 

23 if not isinstance(instance, Entity): 

24 return 

25 

26 skip_entity_id_creation = getattr(instance, "skip_entity_id_creation", False) 

27 create_entity_ids = getattr(settings, "CREATE_ENTITY_IDS", True) 

28 if created and create_entity_ids and not skip_entity_id_creation: 

29 e = EntityID(content_object=instance) 

30 e.save() 

31 logger.info( 

32 "Created EntityID %s as a result of saving %s", repr(e), repr(instance) 

33 ) 

34 

35 

36@receiver(post_merge_with) 

37def merge_entity_ids(sender, instance, entities, *args, **kwargs): 

38 for entity in entities: 

39 content_type = ContentType.objects.get_for_model(entity) 

40 for e in EntityID.objects.filter( 

41 content_type=content_type, object_id=entity.id 

42 ): 

43 logger.info( 

44 "Updating EntityID %s to point to %s as a result of merging %s", 

45 repr(e), 

46 repr(instance), 

47 repr(entity), 

48 ) 

49 e.content_object = instance 

50 e.save()