mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 01:47:59 +03:00 
			
		
		
		
	* fix OpenAPIRenderer for timedelta * added test for rendering openapi with timedelta * fix OpenAPIRenderer for timedelta * added test for rendering openapi with timedelta * Removed usage of field.choices that triggered full table load (#8950) Removed the `{{ field.choices|yesno:",disabled" }}` block because this triggers the loading of full database table worth of objects just to determine whether the multi-select widget should be set as disabled or not. Since this "disabled" marking feature is not present in the normal select field, then I propose to remove it also from the multi-select. * Added Deprecation Warnings for CoreAPI (#7519) * Added Deprecation Warnings for CoreAPI * Bumped removal to DRF315 * Update rest_framework/__init__.py * Update rest_framework/filters.py * Update rest_framework/filters.py * Update tests/schemas/test_coreapi.py * Update rest_framework/filters.py * Update rest_framework/filters.py * Update tests/schemas/test_coreapi.py * Update tests/schemas/test_coreapi.py * Update setup.cfg * Update rest_framework/pagination.py --------- Co-authored-by: Asif Saif Uddin <auvipy@gmail.com> * Update copy right timeline * Fix NamespaceVersioning ignoring DEFAULT_VERSION on non-None namespaces (#7278) * Fix the case where if the namespace is not None and there's no match, NamespaceVersioning always raises NotFound even if DEFAULT_VERSION is set or None is in ALLOWED_VERSIONS * Add test cases * fix OpenAPIRenderer for timedelta * added test for rendering openapi with timedelta * added testcase for rendering yaml with minvalidator for duration field (timedelta) --------- Co-authored-by: Rizwan Shaikh <rshaikh@ces-ltd.com> Co-authored-by: Lenno Nagel <lenno@namespace.ee> Co-authored-by: David Smith <39445562+smithdc1@users.noreply.github.com> Co-authored-by: Asif Saif Uddin <auvipy@gmail.com> Co-authored-by: Konstantin Kuchkov <konstantin.kuchkov@gmail.com>
		
			
				
	
	
		
			251 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import uuid
 | 
						|
from datetime import timedelta
 | 
						|
 | 
						|
from django.core.validators import (
 | 
						|
    DecimalValidator, MaxLengthValidator, MaxValueValidator,
 | 
						|
    MinLengthValidator, MinValueValidator, RegexValidator
 | 
						|
)
 | 
						|
from django.db import models
 | 
						|
 | 
						|
from rest_framework import generics, permissions, serializers
 | 
						|
from rest_framework.decorators import action
 | 
						|
from rest_framework.response import Response
 | 
						|
from rest_framework.schemas.openapi import AutoSchema
 | 
						|
from rest_framework.views import APIView
 | 
						|
from rest_framework.viewsets import GenericViewSet, ViewSet
 | 
						|
 | 
						|
 | 
						|
class ExampleListView(APIView):
 | 
						|
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
    def post(self, request, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class ExampleDetailView(APIView):
 | 
						|
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class DocStringExampleListView(APIView):
 | 
						|
    """
 | 
						|
    get: A description of my GET operation.
 | 
						|
    post: A description of my POST operation.
 | 
						|
    """
 | 
						|
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
    def post(self, request, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class DocStringExampleDetailView(APIView):
 | 
						|
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        """
 | 
						|
        A description of my GET operation.
 | 
						|
        """
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
# Generics.
 | 
						|
class ExampleSerializer(serializers.Serializer):
 | 
						|
    date = serializers.DateField()
 | 
						|
    datetime = serializers.DateTimeField()
 | 
						|
    duration = serializers.DurationField(default=timedelta())
 | 
						|
    hstore = serializers.HStoreField()
 | 
						|
    uuid_field = serializers.UUIDField(default=uuid.uuid4)
 | 
						|
 | 
						|
 | 
						|
class ExampleGenericAPIView(generics.GenericAPIView):
 | 
						|
    serializer_class = ExampleSerializer
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        from datetime import datetime
 | 
						|
        now = datetime.now()
 | 
						|
 | 
						|
        serializer = self.get_serializer(data=now.date(), datetime=now)
 | 
						|
        return Response(serializer.data)
 | 
						|
 | 
						|
 | 
						|
class ExampleGenericViewSet(GenericViewSet):
 | 
						|
    serializer_class = ExampleSerializer
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        from datetime import datetime
 | 
						|
        now = datetime.now()
 | 
						|
 | 
						|
        serializer = self.get_serializer(data=now.date(), datetime=now)
 | 
						|
        return Response(serializer.data)
 | 
						|
 | 
						|
    @action(detail=False)
 | 
						|
    def new(self, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
    @action(detail=False)
 | 
						|
    def old(self, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
# Validators and/or equivalent Field attributes.
 | 
						|
class ExampleValidatedSerializer(serializers.Serializer):
 | 
						|
    integer = serializers.IntegerField(
 | 
						|
        validators=(
 | 
						|
            MaxValueValidator(limit_value=99),
 | 
						|
            MinValueValidator(limit_value=-11),
 | 
						|
        )
 | 
						|
    )
 | 
						|
    string = serializers.CharField(
 | 
						|
        validators=(
 | 
						|
            MaxLengthValidator(limit_value=10),
 | 
						|
            MinLengthValidator(limit_value=2),
 | 
						|
        )
 | 
						|
    )
 | 
						|
    regex = serializers.CharField(
 | 
						|
        validators=(
 | 
						|
            RegexValidator(regex=r'[ABC]12{3}'),
 | 
						|
        ),
 | 
						|
        help_text='must have an A, B, or C followed by 1222'
 | 
						|
    )
 | 
						|
    lst = serializers.ListField(
 | 
						|
        validators=(
 | 
						|
            MaxLengthValidator(limit_value=10),
 | 
						|
            MinLengthValidator(limit_value=2),
 | 
						|
        )
 | 
						|
    )
 | 
						|
    decimal1 = serializers.DecimalField(max_digits=6, decimal_places=2, coerce_to_string=False)
 | 
						|
    decimal2 = serializers.DecimalField(max_digits=5, decimal_places=0, coerce_to_string=False,
 | 
						|
                                        validators=(DecimalValidator(max_digits=17, decimal_places=4),))
 | 
						|
    decimal3 = serializers.DecimalField(max_digits=8, decimal_places=2, coerce_to_string=True)
 | 
						|
    decimal4 = serializers.DecimalField(max_digits=8, decimal_places=2, coerce_to_string=True,
 | 
						|
                                        validators=(DecimalValidator(max_digits=17, decimal_places=4),))
 | 
						|
    decimal5 = serializers.DecimalField(max_digits=6, decimal_places=2)
 | 
						|
    email = serializers.EmailField(default='foo@bar.com')
 | 
						|
    url = serializers.URLField(default='http://www.example.com', allow_null=True)
 | 
						|
    uuid = serializers.UUIDField()
 | 
						|
    ip4 = serializers.IPAddressField(protocol='ipv4')
 | 
						|
    ip6 = serializers.IPAddressField(protocol='ipv6')
 | 
						|
    ip = serializers.IPAddressField()
 | 
						|
    duration = serializers.DurationField(
 | 
						|
        validators=(
 | 
						|
            MinValueValidator(timedelta(seconds=10)),
 | 
						|
        )
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class ExampleValidatedAPIView(generics.GenericAPIView):
 | 
						|
    serializer_class = ExampleValidatedSerializer
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        serializer = self.get_serializer(integer=33, string='hello', regex='foo', decimal1=3.55,
 | 
						|
                                         decimal2=5.33, email='a@b.co',
 | 
						|
                                         url='http://localhost', uuid=uuid.uuid4(), ip4='127.0.0.1', ip6='::1',
 | 
						|
                                         ip='192.168.1.1')
 | 
						|
        return Response(serializer.data)
 | 
						|
 | 
						|
 | 
						|
# Serializer with model.
 | 
						|
class OpenAPIExample(models.Model):
 | 
						|
    first_name = models.CharField(max_length=30)
 | 
						|
 | 
						|
 | 
						|
class ExampleSerializerModel(serializers.Serializer):
 | 
						|
    date = serializers.DateField()
 | 
						|
    datetime = serializers.DateTimeField()
 | 
						|
    hstore = serializers.HStoreField()
 | 
						|
    uuid_field = serializers.UUIDField(default=uuid.uuid4)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = OpenAPIExample
 | 
						|
 | 
						|
 | 
						|
class ExampleOperationIdDuplicate1(generics.GenericAPIView):
 | 
						|
    serializer_class = ExampleSerializerModel
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class ExampleOperationIdDuplicate2(generics.GenericAPIView):
 | 
						|
    serializer_class = ExampleSerializerModel
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class ExampleGenericAPIViewModel(generics.GenericAPIView):
 | 
						|
    serializer_class = ExampleSerializerModel
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        from datetime import datetime
 | 
						|
        now = datetime.now()
 | 
						|
 | 
						|
        serializer = self.get_serializer(data=now.date(), datetime=now)
 | 
						|
        return Response(serializer.data)
 | 
						|
 | 
						|
 | 
						|
class ExampleAutoSchemaComponentName(generics.GenericAPIView):
 | 
						|
    serializer_class = ExampleSerializerModel
 | 
						|
    schema = AutoSchema(component_name="Ulysses")
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        from datetime import datetime
 | 
						|
        now = datetime.now()
 | 
						|
 | 
						|
        serializer = self.get_serializer(data=now.date(), datetime=now)
 | 
						|
        return Response(serializer.data)
 | 
						|
 | 
						|
 | 
						|
class ExampleAutoSchemaDuplicate1(generics.GenericAPIView):
 | 
						|
    serializer_class = ExampleValidatedSerializer
 | 
						|
    schema = AutoSchema(component_name="Duplicate")
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        from datetime import datetime
 | 
						|
        now = datetime.now()
 | 
						|
 | 
						|
        serializer = self.get_serializer(data=now.date(), datetime=now)
 | 
						|
        return Response(serializer.data)
 | 
						|
 | 
						|
 | 
						|
class ExampleAutoSchemaDuplicate2(generics.GenericAPIView):
 | 
						|
    serializer_class = ExampleSerializerModel
 | 
						|
    schema = AutoSchema(component_name="Duplicate")
 | 
						|
 | 
						|
    def get(self, *args, **kwargs):
 | 
						|
        from datetime import datetime
 | 
						|
        now = datetime.now()
 | 
						|
 | 
						|
        serializer = self.get_serializer(data=now.date(), datetime=now)
 | 
						|
        return Response(serializer.data)
 | 
						|
 | 
						|
 | 
						|
class ExampleViewSet(ViewSet):
 | 
						|
    serializer_class = ExampleSerializerModel
 | 
						|
 | 
						|
    def list(self, request):
 | 
						|
        pass
 | 
						|
 | 
						|
    def create(self, request):
 | 
						|
        pass
 | 
						|
 | 
						|
    def retrieve(self, request, pk=None):
 | 
						|
        pass
 | 
						|
 | 
						|
    def update(self, request, pk=None):
 | 
						|
        pass
 | 
						|
 | 
						|
    def partial_update(self, request, pk=None):
 | 
						|
        pass
 | 
						|
 | 
						|
    def destroy(self, request, pk=None):
 | 
						|
        pass
 |