Skip to content

Commit

Permalink
refactor Vraag validation
Browse files Browse the repository at this point in the history
  • Loading branch information
Floris272 committed Dec 19, 2024
1 parent bb38efa commit 3c186cc
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 36 deletions.
24 changes: 13 additions & 11 deletions src/open_producten/producttypen/models/vraag.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,19 @@ class Meta:
verbose_name_plural = _("Vragen")

def clean(self):
if self.onderwerp and self.product_type:
raise ValidationError(
_(
"Een vraag kan niet gelink zijn aan een onderwerp en een product type."
)
)

if not self.onderwerp and not self.product_type:
raise ValidationError(
_("Een vraag moet gelinkt zijn aan een onderwerp of een product type.")
)
validate_onderwerp_or_product_type(self.onderwerp, self.product_type)

def __str__(self):
return self.vraag


def validate_onderwerp_or_product_type(onderwerp, product_type):
if onderwerp and product_type:
raise ValidationError(
_("Een vraag kan niet gelink zijn aan een onderwerp en een product type.")
)

if not onderwerp and not product_type:
raise ValidationError(
_("Een vraag moet gelinkt zijn aan een onderwerp of een product type.")
)
17 changes: 17 additions & 0 deletions src/open_producten/producttypen/serializers/validators.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,25 @@
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

from rest_framework import serializers

from ...utils.serializers import get_from_serializer_data_or_instance
from ..models import PrijsOptie
from ..models.vraag import validate_onderwerp_or_product_type


class ProductTypeOrOnderwerpValidator:
requires_context = True

def __call__(self, value, serializer):
onderwerp = get_from_serializer_data_or_instance("onderwerp", value, serializer)
product_type = get_from_serializer_data_or_instance(
"product_type", value, serializer
)
try:
validate_onderwerp_or_product_type(onderwerp, product_type)
except ValidationError as e:
raise serializers.ValidationError({"product_type_onderwerp": e.message})


class PrijsOptieValidator:
Expand Down
23 changes: 4 additions & 19 deletions src/open_producten/producttypen/serializers/vraag.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from django.core.exceptions import ValidationError

from rest_framework import serializers

from open_producten.producttypen.models import Onderwerp, ProductType, Vraag
from open_producten.utils.serializers import model_to_dict_with_related_ids
from open_producten.producttypen.serializers.validators import (
ProductTypeOrOnderwerpValidator,
)


class VraagSerializer(serializers.ModelSerializer):
Expand All @@ -17,19 +17,4 @@ class VraagSerializer(serializers.ModelSerializer):
class Meta:
model = Vraag
fields = ("id", "product_type_id", "onderwerp_id", "vraag", "antwoord")

def validate(self, attrs):

if self.partial:
all_attrs = model_to_dict_with_related_ids(self.instance) | attrs
else:
all_attrs = attrs

instance = Vraag(**all_attrs)

try:
instance.clean()
except ValidationError as e:
raise serializers.ValidationError({"product_type_onderwerp": e.message})

return attrs
validators = [ProductTypeOrOnderwerpValidator()]
12 changes: 12 additions & 0 deletions src/open_producten/utils/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,21 @@
from django.forms.models import model_to_dict
from django.utils.translation import gettext_lazy as _

from rest_framework.serializers import Serializer

from .models import BaseModel


def get_from_serializer_data_or_instance(
field: str, data: dict, serializer: Serializer
):
if data.get(field):
return data[field]

if serializer.instance:
return getattr(serializer.instance, field)


def clean_duplicate_ids_in_list(values: list, field: str, errors):
value_set = set()
errors_messages = []
Expand Down
6 changes: 0 additions & 6 deletions src/open_producten/utils/tests/cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,6 @@ def setUp(self):
token = Token.objects.create(user=user)
self.client.credentials(HTTP_AUTHORIZATION="Token " + token.key)

# def reverse(self, name, id=None):
# if id:
# return reverse(name, args=[id])
# else:
# return reverse(name)

def get(self, object_id=""):
end = "/" if object_id else ""
return self.client.get(f"{self.path}{object_id}{end}")
Expand Down

0 comments on commit 3c186cc

Please sign in to comment.