aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/api/serializers.py
diff options
context:
space:
mode:
authorGravatar ks129 <[email protected]>2021-10-29 20:11:27 +0300
committerGravatar D0rs4n <[email protected]>2021-12-18 18:02:12 +0100
commitb49612db59ca075f64a4c7da11e3c9ce7e7b19eb (patch)
treef2e6aacdc47282c421fb0d1c03f8644c83114ad4 /pydis_site/apps/api/serializers.py
parentAdd validation to filters to not allow duplicates + additional_field -> JSON (diff)
Move filters validations to serializers
Diffstat (limited to 'pydis_site/apps/api/serializers.py')
-rw-r--r--pydis_site/apps/api/serializers.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py
index 4e92b3a0..b5f083b0 100644
--- a/pydis_site/apps/api/serializers.py
+++ b/pydis_site/apps/api/serializers.py
@@ -139,6 +139,23 @@ SETTINGS_FIELDS = ALWAYS_OPTIONAL_SETTINGS + REQUIRED_FOR_FILTER_LIST_SETTINGS
class FilterSerializer(ModelSerializer):
"""A class providing (de-)serialization of `Filter` instances."""
+ def validate(self, data):
+ """Perform infraction data + allow and disallowed lists validation."""
+ if (data.get('infraction_reason') or data.get('infraction_duration')) and not data.get('infraction_type'):
+ raise ValidationError("Infraction type is required with infraction duration or reason")
+
+ if data.get('allowed_channels') is not None and data.get('disallowed_channels') is not None:
+ channels_collection = data['allowed_channels'] + data['disallowed_channels']
+ if len(channels_collection) != len(set(channels_collection)):
+ raise ValidationError("Allowed and disallowed channels lists contain duplicates.")
+
+ if data.get('allowed_categories') is not None and data.get('disallowed_categories') is not None:
+ categories_collection = data['allowed_categories'] + data['disallowed_categories']
+ if len(categories_collection) != len(set(categories_collection)):
+ raise ValidationError("Allowed and disallowed categories lists contain duplicates.")
+
+ return data
+
class Meta:
"""Metadata defined for the Django REST Framework."""
@@ -160,6 +177,22 @@ class FilterListSerializer(ModelSerializer):
filters = FilterSerializer(many=True, read_only=True)
+ def validate(self, data):
+ """Perform infraction data + allow and disallowed lists validation."""
+ if (data['infraction_reason'] or data['infraction_duration']) and not data['infraction_type']:
+ raise ValidationError("Infraction type is required with infraction duration or reason")
+
+ channels_collection = data['allowed_channels'] + data['disallowed_channels']
+ categories_collection = data['allowed_categories'] + data['disallowed_categories']
+
+ if len(channels_collection) != len(set(channels_collection)):
+ raise ValidationError("Allowed and disallowed channels lists contain duplicates.")
+
+ if len(categories_collection) != len(set(categories_collection)):
+ raise ValidationError("Allowed and disallowed categories lists contain duplicates.")
+
+ return data
+
class Meta:
"""Metadata defined for the Django REST Framework."""