|
4 | 4 | """
|
5 | 5 | from django.db import transaction
|
6 | 6 | from django.db.models import F
|
7 |
| -from django.db.models.signals import post_save |
| 7 | +from django.db.models.signals import post_save, post_delete |
8 | 8 | from django.dispatch import receiver
|
| 9 | +from django.utils import timezone |
9 | 10 |
|
10 | 11 | from onadata.apps.logger.models import Entity, EntityList, Instance, RegistrationForm
|
| 12 | +from onadata.apps.logger.models.xform import clear_project_cache |
11 | 13 | from onadata.apps.logger.xform_instance_parser import get_meta_from_xml
|
12 | 14 | from onadata.apps.logger.tasks import set_entity_list_perms_async
|
| 15 | +from onadata.apps.main.models.meta_data import MetaData |
13 | 16 | from onadata.libs.utils.logger_tools import (
|
14 | 17 | create_entity_from_instance,
|
15 | 18 | update_entity_from_instance,
|
@@ -47,23 +50,67 @@ def create_or_update_entity(sender, instance, created=False, **kwargs):
|
47 | 50 | create_entity_from_instance(instance, registration_form)
|
48 | 51 |
|
49 | 52 |
|
50 |
| -@receiver(post_save, sender=Entity, dispatch_uid="update_entity_dataset") |
51 |
| -def update_entity_dataset(sender, instance, created=False, **kwargs): |
52 |
| - """Update EntityList when Entity is created or updated""" |
53 |
| - if not instance: |
54 |
| - return |
55 |
| - |
| 53 | +@receiver(post_save, sender=Entity, dispatch_uid="update_enti_el_inc_num_entities") |
| 54 | +def increment_entity_list_num_entities(sender, instance, created=False, **kwargs): |
| 55 | + """Increment EntityList `num_entities`""" |
56 | 56 | entity_list = instance.entity_list
|
57 | 57 |
|
58 | 58 | if created:
|
59 |
| - entity_list.num_entities = F("num_entities") + 1 |
| 59 | + # Using Queryset.update ensures we do not call the model's save method and |
| 60 | + # signals |
| 61 | + EntityList.objects.filter(pk=entity_list.pk).update( |
| 62 | + num_entities=F("num_entities") + 1 |
| 63 | + ) |
| 64 | + |
| 65 | + |
| 66 | +@receiver(post_delete, sender=Entity, dispatch_uid="update_enti_el_dec_num_entities") |
| 67 | +def decrement_entity_list_num_entities(sender, instance, **kwargs): |
| 68 | + """Decrement EntityList `num_entities`""" |
| 69 | + entity_list = instance.entity_list |
| 70 | + # Using Queryset.update ensures we do not call the model's save method and |
| 71 | + # signals |
| 72 | + EntityList.objects.filter(pk=entity_list.pk).update( |
| 73 | + num_entities=F("num_entities") - 1 |
| 74 | + ) |
| 75 | + |
60 | 76 |
|
61 |
| - entity_list.last_entity_update_time = instance.date_modified |
62 |
| - entity_list.save() |
| 77 | +@receiver(post_delete, sender=Entity, dispatch_uid="delete_enti_el_last_update_time") |
| 78 | +def update_last_entity_update_time_now(sender, instance, **kwargs): |
| 79 | + """Update EntityList `last_entity_update_time`""" |
| 80 | + entity_list = instance.entity_list |
| 81 | + # Using Queryset.update ensures we do not call the model's save method and |
| 82 | + # signals |
| 83 | + EntityList.objects.filter(pk=entity_list.pk).update( |
| 84 | + last_entity_update_time=timezone.now() |
| 85 | + ) |
| 86 | + |
| 87 | + |
| 88 | +@receiver(post_save, sender=Entity, dispatch_uid="update_enti_el_last_update_time") |
| 89 | +def update_last_entity_update_time(sender, instance, **kwargs): |
| 90 | + """Update EntityList `last_entity_update_time`""" |
| 91 | + entity_list = instance.entity_list |
| 92 | + # Using Queryset.update ensures we do not call the model's save method and |
| 93 | + # signals |
| 94 | + EntityList.objects.filter(pk=entity_list.pk).update( |
| 95 | + last_entity_update_time=instance.date_modified |
| 96 | + ) |
63 | 97 |
|
64 | 98 |
|
65 | 99 | @receiver(post_save, sender=EntityList, dispatch_uid="set_entity_list_perms")
|
66 | 100 | def set_entity_list_perms(sender, instance, created=False, **kwargs):
|
67 | 101 | """Set project permissions to EntityList"""
|
68 | 102 | if created:
|
69 | 103 | transaction.on_commit(lambda: set_entity_list_perms_async.delay(instance.pk))
|
| 104 | + |
| 105 | + |
| 106 | +@receiver(post_delete, sender=EntityList, dispatch_uid="delete_entity_list_metadata") |
| 107 | +def delete_entity_list_metadata(sender, instance, **kwargs): |
| 108 | + """Delete EntityList related data on delete""" |
| 109 | + clear_project_cache(instance.project.pk) |
| 110 | + # We get original name incase name has been modified in the case where |
| 111 | + # EntityList was first soft deleted |
| 112 | + entity_list_name = instance.name.split("-")[0] |
| 113 | + MetaData.objects.filter( |
| 114 | + data_type="media", |
| 115 | + data_value=f"entity_list {instance.pk} {entity_list_name}", |
| 116 | + ).delete() |
0 commit comments