aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2024-05-19 20:56:25 +0100
committerGravatar Joe Banks <[email protected]>2024-05-26 05:00:31 +0100
commita4651df308f463b226f200fae9868f3a3c466ab9 (patch)
treed494d5fe5f8382259bec64bb381f43cd27158735
parentUse select_related to JOIN for UserModSettings (diff)
Add serializer for mod_settings response key on User objects
-rw-r--r--pydis_site/apps/api/serializers.py36
1 files changed, 34 insertions, 2 deletions
diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py
index 2b4bf395..225bf2ce 100644
--- a/pydis_site/apps/api/serializers.py
+++ b/pydis_site/apps/api/serializers.py
@@ -37,7 +37,8 @@ from .models import (
Reminder,
Role,
User,
- UserAltRelationship
+ UserAltRelationship,
+ UserModSettings
)
class FrozenFieldsMixin:
@@ -701,11 +702,24 @@ class UserSerializer(ModelSerializer):
# ID field must be explicitly set as the default id field is read-only.
id = IntegerField(min_value=0)
+ def to_representation(self, instance: User) -> dict:
+ """Serialize the user to a dictionary, serializing the moderator settings."""
+ ret = super().to_representation(instance)
+
+ if hasattr(instance, 'mod_settings') and instance.mod_settings is not None:
+ ret['mod_settings'] = UserModSettingsSerializer(instance.mod_settings).data
+ else:
+ if 'mod_settings' in ret:
+ del ret['mod_settings']
+
+ return ret
+
class Meta:
"""Metadata defined for the Django REST Framework."""
model = User
- fields = ('id', 'name', 'display_name', 'discriminator', 'roles', 'in_guild')
+ fields = ('id', 'name', 'display_name', 'discriminator', 'roles',
+ 'in_guild', 'mod_settings')
depth = 1
list_serializer_class = UserListSerializer
@@ -736,6 +750,24 @@ class UserWithAltsSerializer(FrozenFieldsMixin, UserSerializer):
for alt in user.alts.through.objects.filter(source=user)
]
+class UserModSettingsSerializer(ModelSerializer):
+ """A class to serialize the moderator settings for a user."""
+
+ def validate(self, data: dict) -> dict:
+ """Validate the moderator settings contain the necessary fields."""
+ if data.get("pings_schedule_start") and not data.get("pings_schedule_end"):
+ raise ValidationError("missing pings_schedule_end")
+
+ if data.get("pings_schedule_end") and not data.get("pings_schedule_start"):
+ raise ValidationError("missing pings_schedule_start")
+
+ return data
+
+ class Meta:
+ """Meta settings for the user moderator settings serializer."""
+
+ model = UserModSettings
+ fields = ('moderator', 'pings_disabled_until', 'pings_schedule_start', 'pings_schedule_end')
class NominationEntrySerializer(ModelSerializer):
"""A class providing (de-)serialization of `NominationEntry` instances."""