Example #1
0
 def get_schema_fields(self, view):
     assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
     assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
     fields = [
         coreapi.Field(
             name=self.cursor_query_param,
             required=False,
             location='query',
             schema=coreschema.String(
                 title='Cursor',
                 description=force_text(self.cursor_query_description)
             )
         )
     ]
     if self.page_size_query_param is not None:
         fields.append(
             coreapi.Field(
                 name=self.page_size_query_param,
                 required=False,
                 location='query',
                 schema=coreschema.Integer(
                     title='Page size',
                     description=force_text(self.page_size_query_description)
                 )
             )
         )
     return fields
Example #2
0
    def get_serializer_fields(self, path, method):
        """
        Return a list of `coreapi.Field` instances corresponding to any
        request body input, as determined by the serializer class.
        """
        view = self.view

        if method not in ('PUT', 'PATCH', 'POST'):
            return []

        if not hasattr(view, 'get_serializer'):
            return []

        try:
            serializer = view.get_serializer()
        except exceptions.APIException:
            serializer = None
            warnings.warn('{}.get_serializer() raised an exception during '
                          'schema generation. Serializer fields will not be '
                          'generated for {} {}.'.format(
                              view.__class__.__name__, method, path))

        if isinstance(serializer, serializers.ListSerializer):
            return [
                coreapi.Field(name='data',
                              location='body',
                              required=True,
                              schema=coreschema.Array())
            ]

        if not isinstance(serializer, serializers.Serializer):
            return []

        fields = []
        for field in serializer.fields.values():
            if field.read_only or isinstance(field, serializers.HiddenField):
                continue

            required = field.required and method != 'PATCH'
            field = coreapi.Field(name=field.field_name,
                                  location='form',
                                  required=required,
                                  schema=field_to_schema(field))
            fields.append(field)

        return fields
Example #3
0
class ObtainAuthToken(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (
        parsers.FormParser,
        parsers.MultiPartParser,
        parsers.JSONParser,
    )
    renderer_classes = (renderers.JSONRenderer, )
    serializer_class = AuthTokenSerializer
    if coreapi is not None and coreschema is not None:
        schema = ManualSchema(
            fields=[
                coreapi.Field(
                    name="username",
                    required=True,
                    location='form',
                    schema=coreschema.String(
                        title="Username",
                        description="Valid username for authentication",
                    ),
                ),
                coreapi.Field(
                    name="password",
                    required=True,
                    location='form',
                    schema=coreschema.String(
                        title="Password",
                        description="Valid password for authentication",
                    ),
                ),
            ],
            encoding="application/json",
        )

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data,
                                           context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key})
Example #4
0
 def get_schema_fields(self, view):
     assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
     assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
     return [
         coreapi.Field(name=self.search_param,
                       required=False,
                       location='query',
                       schema=coreschema.String(
                           title=force_text(self.search_title),
                           description=force_text(self.search_description)))
     ]
Example #5
0
 def get_schema_fields(self, view):
     assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
     assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
     return [
         coreapi.Field(
             name=self.limit_query_param,
             required=False,
             location='query',
             schema=coreschema.Integer(
                 title='Limit',
                 description=force_text(self.limit_query_description)
             )
         ),
         coreapi.Field(
             name=self.offset_query_param,
             required=False,
             location='query',
             schema=coreschema.Integer(
                 title='Offset',
                 description=force_text(self.offset_query_description)
             )
         )
     ]
Example #6
0
    def get_path_fields(self, path, method):
        """
        Return a list of `coreapi.Field` instances corresponding to any
        templated path variables.
        """
        view = self.view
        model = getattr(getattr(view, 'queryset', None), 'model', None)
        fields = []

        for variable in uritemplate.variables(path):
            title = ''
            description = ''
            schema_cls = coreschema.String
            kwargs = {}
            if model is not None:
                # Attempt to infer a field description if possible.
                try:
                    model_field = model._meta.get_field(variable)
                except Exception:
                    model_field = None

                if model_field is not None and model_field.verbose_name:
                    title = force_text(model_field.verbose_name)

                if model_field is not None and model_field.help_text:
                    description = force_text(model_field.help_text)
                elif model_field is not None and model_field.primary_key:
                    description = get_pk_description(model, model_field)

                if hasattr(view, 'lookup_value_regex'
                           ) and view.lookup_field == variable:
                    kwargs['pattern'] = view.lookup_value_regex
                elif isinstance(model_field, models.AutoField):
                    schema_cls = coreschema.Integer

            field = coreapi.Field(name=variable,
                                  location='path',
                                  required=True,
                                  schema=schema_cls(title=title,
                                                    description=description,
                                                    **kwargs))
            fields.append(field)

        return fields