From 277dbda735d85a22ee28b987385d904116cf314f Mon Sep 17 00:00:00 2001 From: melton-jason Date: Fri, 18 Oct 2024 11:55:00 -0500 Subject: [PATCH] Modify create_uniqueness_rule to skip creating same rule --- specifyweb/businessrules/uniqueness_rules.py | 23 +++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/specifyweb/businessrules/uniqueness_rules.py b/specifyweb/businessrules/uniqueness_rules.py index 4950caf6ad..edae82d318 100644 --- a/specifyweb/businessrules/uniqueness_rules.py +++ b/specifyweb/businessrules/uniqueness_rules.py @@ -182,14 +182,25 @@ def create_uniqueness_rule(model_name, discipline, is_database_constraint, field UniquenessRuleField = registry.get_model( 'businessrules', 'UniquenessRuleField') if registry else models.UniquenessRuleField - created_rule = UniquenessRule.objects.create(discipline=discipline, - modelName=model_name, isDatabaseConstraint=is_database_constraint) + matching_fields = UniquenessRuleField.objects.filter( + fieldPath__in=fields, uniquenessrule__modelName=model_name, uniquenessrule__isDatabaseConstraint=is_database_constraint, uniquenessrule__discipline=discipline, isScope=False) + + matching_scopes = UniquenessRuleField.objects.filter( + fieldPath__in=scopes, uniquenessrule__modelName=model_name, uniquenessrule__isDatabaseConstraint=is_database_constraint, uniquenessrule__discipline=discipline, isScope=True) + + # If the rule already exists, skip creating the rule + if len(matching_fields) == len(fields) and len(matching_scopes) == len(scopes): + return + + rule = UniquenessRule.objects.create( + discipline=discipline, modelName=model_name, isDatabaseConstraint=is_database_constraint) + for field in fields: - UniquenessRuleField.objects.get_or_create( - uniquenessrule=created_rule, fieldPath=field, isScope=False) + UniquenessRuleField.objects.create( + uniquenessrule=rule, fieldPath=field, isScope=False) for scope in scopes: - UniquenessRuleField.objects.get_or_create( - uniquenessrule=created_rule, fieldPath=scope, isScope=True) + UniquenessRuleField.objects.create( + uniquenessrule=rule, fieldPath=scope, isScope=True) """If a uniqueness rule has a scope which traverses through a hiearchy