diff --git a/app/apps/rules/forms.py b/app/apps/rules/forms.py index f86134d..25a8c35 100644 --- a/app/apps/rules/forms.py +++ b/app/apps/rules/forms.py @@ -3,6 +3,7 @@ from crispy_forms.bootstrap import FormActions from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Field, Row, Column from django import forms +from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from apps.rules.models import TransactionRule @@ -66,6 +67,8 @@ class TransactionRuleActionForm(forms.ModelForm): widgets = {"field": TomSelect(clear_button=False)} def __init__(self, *args, **kwargs): + self.rule = kwargs.pop("rule", None) + super().__init__(*args, **kwargs) self.helper = FormHelper() @@ -93,3 +96,22 @@ class TransactionRuleActionForm(forms.ModelForm): ), ), ) + + def clean(self): + cleaned_data = super().clean() + field = cleaned_data.get("field") + + if field and self.rule: + if TransactionRuleAction.objects.filter( + rule=self.rule, field=field + ).exists(): + raise ValidationError( + _("A value for this field already exists in the rule.") + ) + + def save(self, commit=True): + instance = super().save(commit=False) + instance.rule = self.rule + if commit: + instance.save() + return instance diff --git a/app/apps/rules/models.py b/app/apps/rules/models.py index 80f2fe0..39596f9 100644 --- a/app/apps/rules/models.py +++ b/app/apps/rules/models.py @@ -42,3 +42,6 @@ class TransactionRuleAction(models.Model): def __str__(self): return f"{self.rule} - {self.field} - {self.value}" + + class Meta: + unique_together = (("rule", "field"),) diff --git a/app/apps/rules/views.py b/app/apps/rules/views.py index 9e1ea9c..87beb6b 100644 --- a/app/apps/rules/views.py +++ b/app/apps/rules/views.py @@ -142,11 +142,9 @@ def transaction_rule_action_add(request, transaction_rule_id): transaction_rule = get_object_or_404(TransactionRule, id=transaction_rule_id) if request.method == "POST": - form = TransactionRuleActionForm(request.POST) + form = TransactionRuleActionForm(request.POST, rule=transaction_rule) if form.is_valid(): - action = form.save(commit=False) - action.rule = transaction_rule - action.save() + form.save() return HttpResponse( status=204, @@ -155,7 +153,7 @@ def transaction_rule_action_add(request, transaction_rule_id): }, ) else: - form = TransactionRuleActionForm() + form = TransactionRuleActionForm(rule=transaction_rule) return render( request,