class TicketSerializer(serializers.ModelSerializer): serial_no = serializers.CharField(max_length=32) remark = serializers.CharField(required=False, allow_blank=True, allow_null=True, max_length=1024) author_id = serializers.IntegerField(default=serializers.CreateOnlyDefault(CurrentUserDefault())) author = serializers.StringRelatedField(read_only=True) itinerary = ItinerarySerializer(read_only=True, many=False) itinerary_id = serializers.IntegerField(required=True) # messages = MessageSerializer(read_only=True, many=True) messages = serializers.SerializerMethodField() comments = CommentSerializer(read_only=True, many=True) uploads = UpLoadSerializer(read_only=True, many=True) parent_id = serializers.IntegerField(required=False, allow_null=True) class Meta: model = models.Ticket fields = '__all__' def get_fields(self): fields = super(TicketSerializer, self).get_fields() fields['children'] = TicketSerializer(many=True, read_only=True) return fields def get_messages(self, obj): query = obj.messages.filter(user_id=self.context['request'].user.id) serializer = MessageSerializer(instance=query, many=True) return serializer.data
class FormSerializer(serializers.Serializer): slug = serializers.CharField(max_length=20) name = serializers.CharField(max_length=5000) description = serializers.CharField(max_length=5000) time = serializers.CharField(max_length=5000) question_amount = serializers.IntegerField() answer_amount = serializers.IntegerField() subject = serializers.CharField(max_length=5000) date = serializers.CharField(max_length=50) answers = serializers.CharField(max_length=5000000)
class BookingSerializer(serializers.ModelSerializer): title = serializers.CharField(max_length=64) remark = serializers.CharField(required=False, allow_blank=True, allow_null=True, max_length=1024) author = serializers.StringRelatedField(read_only=True) author_id = serializers.IntegerField(default=serializers.CreateOnlyDefault(CurrentUserDefault())) # messages = MessageSerializer(read_only=True, many=True) messages = serializers.SerializerMethodField() comments = CommentSerializer(read_only=True, many=True) uploads = UpLoadSerializer(read_only=True, many=True) itineraries = serializers.SerializerMethodField() class Meta: model = models.Booking fields = '__all__' def get_itineraries(self, obj): query = None if self.context['request'].user.has_perm('ticket.view_itinerary'): query = obj.itineraries.all() else: query = obj.itineraries.filter(user_id=self.context['request'].user.id) serializer = ItinerarySerializer(instance=query, many=True) return serializer.data def get_messages(self, obj): query = obj.messages.filter(user_id=self.context['request'].user.id) serializer = MessageSerializer(instance=query, many=True) return serializer.data
class UserModel(models.Model): username = serializers.CharField(required=False, allow_blank=True) email = serializers.EmailField(required=False, allow_blank=True) first_name = serializers.CharField(required=True, write_only=True) last_name = serializers.CharField(required=True, write_only=True) phone = serializers.IntegerField() jobIds = serializers.CharField(max_length=10000, allow_blank=True)
class MessageSerializer(serializers.ModelSerializer): content_type = ContentTypeField() user = UserListSerializer(read_only=True, many=False) user_id = serializers.IntegerField(default=serializers.CreateOnlyDefault(CurrentUserDefault())) class Meta: model = models.Message fields = '__all__'
class JSONWebTokenBasicAuthSerializer(BaseJSONWebTokenAuthSerializer): """ Validate a username and password. Returns a JSON web token that can be used to authenticate later calls. """ payload = serializers.JSONField(read_only=True) refresh_expires_in = serializers.IntegerField(read_only=True) @property def username_field(self) -> str: return User.USERNAME_FIELD def __init__(self, *args, **kwargs): """ Dynamically add the username field to self.fields. """ super().__init__(self, *args, **kwargs) self.fields[self.username_field] = serializers.CharField( write_only=True) self.fields["password"] = serializers.CharField( write_only=True, style={"input_type": "password"}) def validate(self, attrs): credentials = { self.username_field: attrs[self.username_field], "password": attrs["password"], } if attrs[self.username_field] and attrs["password"]: user = authenticate(**credentials) if user: if not user.is_active: raise serializers.ValidationError( _("User account is disabled.")) payload = jwt_payload_handler(user) refresh_expires_in = ( payload["origIat"] + jwt_settings.JWT_REFRESH_EXPIRATION_DELTA.total_seconds()) return { "token": jwt_encode_handler(payload), "payload": payload, "refresh_expires_in": refresh_expires_in, } raise serializers.ValidationError( _("Please enter valid credentials")) else: raise serializers.ValidationError( _(f'Must include "{self.username_field}" and "password".'))
class ItinerarySerializer(serializers.ModelSerializer): serial_no = serializers.CharField(max_length=32) remark = serializers.CharField(required=False, allow_blank=True, allow_null=True, max_length=1024) author_id = serializers.IntegerField(default=serializers.CreateOnlyDefault(CurrentUserDefault())) booking_id = serializers.IntegerField(required=True) ticket = serializers.StringRelatedField(read_only=True) author = serializers.StringRelatedField(read_only=True) class Meta: model = models.Itinerary fields = '__all__' def validate(self, validate_data): email = validate_data.get('email', None) if email: try: user = UserModel.objects.get(email=email) validate_data['user_id'] = user.id except UserModel.DoesNotExist: raise serializers.ValidationError({'email': 'No user for such email'}) return validate_data def create(self, validated_data): if not self.context['request'].user.has_perm('ticket.lock_itinerary'): validated_data['is_lock'] = True return super().create(validated_data) def update(self, instance, validated_data): if not self.context['request'].user.has_perm('ticket.lock_itinerary'): validated_data.pop('is_lock', None) return super().update(instance, validated_data)
class CommentSerializer(serializers.ModelSerializer): content_type = ContentTypeField() user = UserListSerializer(read_only=True, many=False) user_id = serializers.IntegerField(default=serializers.CreateOnlyDefault(CurrentUserDefault())) children = serializers.SerializerMethodField() class Meta: model = models.Comment fields = '__all__' def get_children(self, obj): queryset = models.Comment.objects.filter(object_id=obj.id, content_type__model='comment') serializers = CommentSerializer(queryset, many=True, context=self.context) return serializers.data
class UpLoadSerializer(serializers.ModelSerializer): content_type = ContentTypeField() author_id = serializers.IntegerField(default=serializers.CreateOnlyDefault(CurrentUserDefault())) name = serializers.SerializerMethodField() url = serializers.SerializerMethodField() class Meta: model = models.UpLoad fields = '__all__' def get_name(self, obj): if obj.file is not None and obj.file != '': return str(obj.file).split("/")[-1] def get_url(self, obj): if obj.file is not None and obj.file != '': return self.context['request'].build_absolute_uri(obj.file.url)
class RefreshJSONWebTokenSerializer(serializers.Serializer): token = serializers.CharField() payload = serializers.JSONField(read_only=True) refresh_expires_in = serializers.IntegerField(read_only=True) def validate(self, attrs): # Get and check payload try: payload = get_payload(attrs["token"]) except (JSONWebTokenExpired, JSONWebTokenError) as e: raise serializers.ValidationError(str(e)) # Get and check user by payload try: user = get_user_by_payload(payload) except JSONWebTokenError as e: raise serializers.ValidationError(str(e)) # Get and check "origIat" orig_iat = payload.get("origIat") if not orig_iat: raise serializers.ValidationError(_("origIat field is required")) if jwt_refresh_expired_handler(orig_iat): raise serializers.ValidationError(_("Refresh has expired")) new_payload = jwt_payload_handler(user) new_payload["origIat"] = orig_iat refresh_expires_in = ( orig_iat + jwt_settings.JWT_REFRESH_EXPIRATION_DELTA.total_seconds()) token = jwt_encode_handler(new_payload) return { "token": token, "payload": new_payload, "refresh_expires_in": refresh_expires_in, }