From 0f51bb11168f6fc7b6e04864dfec41f0aee7836a Mon Sep 17 00:00:00 2001 From: Manvi Date: Fri, 14 Aug 2026 15:14:35 +0530 Subject: [PATCH] Fix:Modeartion issue(added signals to preserve the unmodified data --- dpr/apps.py | 3 ++ dpr/models.py | 12 ++++++++ dpr/signals.py | 64 +++++++++++++++++++++++++++++++++++++++ moderation/utils/utils.py | 3 ++ 4 files changed, 82 insertions(+) create mode 100644 dpr/signals.py diff --git a/dpr/apps.py b/dpr/apps.py index cb23e6d3..fce7a639 100644 --- a/dpr/apps.py +++ b/dpr/apps.py @@ -4,3 +4,6 @@ class DprConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "dpr" + + def ready(self): + import dpr.signals \ No newline at end of file diff --git a/dpr/models.py b/dpr/models.py index 611533bd..17e955ff 100644 --- a/dpr/models.py +++ b/dpr/models.py @@ -54,6 +54,7 @@ class ODK_settlement(models.Model): nrega_issues = models.TextField() nrega_community = models.TextField() data_settlement = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_settlement = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -103,6 +104,7 @@ class ODK_well(models.Model): system = models.JSONField(default=dict) gps_point = models.JSONField(default=dict) data_well = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_well = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -158,6 +160,7 @@ class ODK_waterbody(models.Model): system = models.JSONField(default=dict) gps_point = models.JSONField(default=dict) data_waterbody = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_waterbody = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -204,6 +207,7 @@ class ODK_groundwater(models.Model): gps_point = models.JSONField() work_dimensions = models.JSONField(default=dict) data_groundwater = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_groundwater = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -256,6 +260,7 @@ class ODK_agri(models.Model): gps_point = models.JSONField() work_dimensions = models.JSONField(default=dict) data_agri = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_agri = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -311,6 +316,7 @@ class ODK_crop(models.Model): system = models.JSONField() gps_point = models.JSONField(default=dict, null=True, blank=True) data_crop = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_crop = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -359,6 +365,7 @@ class ODK_livelihood(models.Model): system = models.JSONField() gps_point = models.JSONField() data_livelihood = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_livelihood = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -410,6 +417,7 @@ class GW_maintenance(models.Model): corresponding_work_id = models.CharField(max_length=255) submission_time = models.DateTimeField(null=True, blank=True) data_gw_maintenance = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_gw_maintenance = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -452,6 +460,7 @@ class SWB_RS_maintenance(models.Model): corresponding_work_id = models.CharField(max_length=255) submission_time = models.DateTimeField(null=True, blank=True) data_swb_rs_maintenance = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_swb_rs_maintenance = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -494,6 +503,7 @@ class SWB_maintenance(models.Model): corresponding_work_id = models.CharField(max_length=255) submission_time = models.DateTimeField(null=True, blank=True) data_swb_maintenance = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_swb_maintenance = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -536,6 +546,7 @@ class Agri_maintenance(models.Model): corresponding_work_id = models.CharField(max_length=255) submission_time = models.DateTimeField(null=True, blank=True) data_agri_maintenance = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_agri_maintenance = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( @@ -575,6 +586,7 @@ class ODK_agrohorticulture(models.Model): longitude = models.FloatField() status_re = models.TextField() data_agohorticulture = models.JSONField(default=dict, null=True, blank=True) + unmodified_data_agohorticulture = models.JSONField(default=dict, null=True, blank=True) is_moderated = models.BooleanField(default=False, blank=True, null=True) moderated_at = models.DateTimeField(null=True, blank=True) moderated_by = models.ForeignKey( diff --git a/dpr/signals.py b/dpr/signals.py new file mode 100644 index 00000000..e799037c --- /dev/null +++ b/dpr/signals.py @@ -0,0 +1,64 @@ +from django.db.models.signals import pre_save +from django.dispatch import receiver + +from .models import ( + ODK_waterbody, + ODK_well, +) + + +def preserve_unmodified_demand_type( + instance, + data_field, + unmodified_data_field, + source_field, +): + """ + Preserve only the original value of the field that is modified + by classify_demand_type(). + """ + + data = getattr(instance, data_field, None) or {} + unmodified_data = getattr(instance, unmodified_data_field, None) or {} + + # Original ODK value + original_value = data.get(source_field) + + # Preserve it only once. + # Never overwrite the already preserved original value. + if original_value is not None and "demand_type" not in unmodified_data: + unmodified_data["demand_type"] = original_value + + setattr( + instance, + unmodified_data_field, + unmodified_data, + ) + + +@receiver(pre_save, sender=ODK_waterbody) +def preserve_waterbody_unmodified_demand_type( + sender, + instance, + **kwargs, +): + preserve_unmodified_demand_type( + instance=instance, + data_field="data_waterbody", + unmodified_data_field="unmodified_data_waterbody", + source_field="select_one_owns", + ) + + +@receiver(pre_save, sender=ODK_well) +def preserve_well_unmodified_demand_type( + sender, + instance, + **kwargs, +): + preserve_unmodified_demand_type( + instance=instance, + data_field="data_well", + unmodified_data_field="unmodified_data_well", + source_field="select_one_owns", + ) \ No newline at end of file diff --git a/moderation/utils/utils.py b/moderation/utils/utils.py index bd10ac13..27f83f8a 100644 --- a/moderation/utils/utils.py +++ b/moderation/utils/utils.py @@ -149,6 +149,9 @@ def sync_edited_updated_well(well_submission): "data_well": well_submission, } + print("WELL ID:", well_id) + print("MAPPED:", mapped) + ODK_well.objects.update_or_create(well_id=well_id, defaults=mapped)