66
77from rest_framework import serializers
88
9- from drf_spectacular .utils import extend_schema_field
10- from drf_spectacular .types import OpenApiTypes
11-
129from drf_extra_fields .geo_fields import PointField
1310
1411from tigaserver_app .models import (
@@ -103,8 +100,7 @@ class DetailNotificationSerializer(serializers.ModelSerializer):
103100 title = serializers .SerializerMethodField (read_only = True )
104101 body = serializers .SerializerMethodField (read_only = True )
105102
106- @extend_schema_field (OpenApiTypes .BOOL )
107- def get_seen (self , obj ):
103+ def get_seen (self , obj ) -> bool :
108104 user = self .context .get ("request" ).user
109105 if not isinstance (user , TigaUser ):
110106 return False
@@ -116,17 +112,15 @@ def get_seen(self, obj):
116112 user = self .context .get ("request" ).user
117113 ).exists () or (obj .user == user and obj .acknowledged )
118114
119- @extend_schema_field (OpenApiTypes .STR )
120- def get_title (self , obj ):
115+ def get_title (self , obj ) -> str :
121116 if obj .notification_content is None :
122117 return ""
123118
124119 return obj .notification_content .get_title (
125120 language_code = self .context .get ("request" ).LANGUAGE_CODE
126121 )
127122
128- @extend_schema_field (OpenApiTypes .STR )
129- def get_body (self , obj ):
123+ def get_body (self , obj ) -> str :
130124 if obj .notification_content is None :
131125 return ""
132126
@@ -173,21 +167,29 @@ class BaseNotificationCreateSerializer(serializers.ModelSerializer):
173167 def RECEIVER_TYPE (self ):
174168 raise NotImplementedError
175169
176- receiver_type = WritableSerializerMethodField (
177- field_class = serializers .ChoiceField ,
178- choices = ["user" , "topic" ],
179- required = True
180- )
181-
182170 title_en = serializers .CharField (write_only = True )
183171 body_en = serializers .CharField (write_only = True )
184172
185173 created_at = serializers .DateTimeField (source = "date_comment" , read_only = True )
186174 expert = serializers .HiddenField (default = serializers .CurrentUserDefault ())
187175
188- @extend_schema_field (OpenApiTypes .STR )
189- def get_receiver_type (self , obj ):
190- return self .RECEIVER_TYPE
176+ def __init__ (self , * args , ** kwargs ):
177+ # Call the parent constructor first
178+ super ().__init__ (* args , ** kwargs )
179+
180+ # Add a dynamic field
181+ self .fields ['receiver_type' ] = serializers .ChoiceField (
182+ choices = [self .RECEIVER_TYPE ,],
183+ write_only = True ,
184+ required = True
185+ )
186+
187+ # Re-order the fields with 'receiver_type' at the start
188+ from collections import OrderedDict
189+ self .fields = OrderedDict (
190+ [('receiver_type' , self .fields ['receiver_type' ])] +
191+ [(key , field ) for key , field in self .fields .items () if key != 'receiver_type' ]
192+ )
191193
192194 @transaction .atomic
193195 def create (self , validated_data ):
@@ -203,7 +205,12 @@ def create(self, validated_data):
203205
204206 class Meta :
205207 model = Notification
206- fields = ("id" , "receiver_type" , "created_at" , "title_en" , "body_en" )
208+ fields = (
209+ "id" ,
210+ "created_at" ,
211+ "title_en" ,
212+ "body_en"
213+ )
207214
208215
209216class UserNotificationCreateSerializer (BaseNotificationCreateSerializer ):
@@ -235,11 +242,10 @@ def validate(self, data):
235242 return data
236243
237244 class Meta (BaseNotificationCreateSerializer .Meta ):
238- fields = (
239- "receiver_type" ,
245+ fields = BaseNotificationCreateSerializer .Meta .fields + (
240246 "report_uuid" ,
241247 "user_uuid" ,
242- ) + BaseNotificationCreateSerializer . Meta . fields
248+ )
243249
244250
245251class TopicNotificationCreateSerializer (BaseNotificationCreateSerializer ):
@@ -268,10 +274,7 @@ def create(self, validated_data):
268274 return instance
269275
270276 class Meta (BaseNotificationCreateSerializer .Meta ):
271- fields = (
272- "receiver_type" ,
273- "topic_code" ,
274- ) + BaseNotificationCreateSerializer .Meta .fields
277+ fields = BaseNotificationCreateSerializer .Meta .fields + ("topic_code" , )
275278
276279#### END NOTIFICATION SERIALIZERS ####
277280
@@ -390,7 +393,6 @@ class Meta:
390393 "short_id" ,
391394 "user_uuid" ,
392395 "user" ,
393- "type" ,
394396 "session_id" ,
395397 "created_at" ,
396398 "sent_at" ,
0 commit comments