示例#1
0
def field_to_schema(field):
    title = force_text(field.label) if field.label else ''
    description = force_text(field.help_text) if field.help_text else ''

    if isinstance(field, serializers.ListSerializer):
        child_schema = field_to_schema(field.child)
        return coreschema.Array(
            items=child_schema,
            title=title,
            description=description
        )
    elif isinstance(field, serializers.Serializer):
        return coreschema.Object(
            properties=OrderedDict([
                (key, field_to_schema(value))
                for key, value
                in field.fields.items()
            ]),
            title=title,
            description=description
        )
    elif isinstance(field, serializers.ManyRelatedField):
        return coreschema.Array(
            items=coreschema.String(),
            title=title,
            description=description
        )
    elif isinstance(field, serializers.RelatedField):
        return coreschema.String(title=title, description=description)
    elif isinstance(field, serializers.MultipleChoiceField):
        return coreschema.Array(
            items=coreschema.Enum(enum=list(field.choices.keys())),
            title=title,
            description=description
        )
    elif isinstance(field, serializers.ChoiceField):
        return coreschema.Enum(
            enum=list(field.choices.keys()),
            title=title,
            description=description
        )
    elif isinstance(field, serializers.BooleanField):
        return coreschema.Boolean(title=title, description=description)
    elif isinstance(field, (serializers.DecimalField, serializers.FloatField)):
        return coreschema.Number(title=title, description=description)
    elif isinstance(field, serializers.IntegerField):
        return coreschema.Integer(title=title, description=description)

    if field.style.get('base_template') == 'textarea.html':
        return coreschema.String(
            title=title,
            description=description,
            format='textarea'
        )
    return coreschema.String(title=title, description=description)
    def test_field_to_schema(self):
        label = 'Test label'
        help_text = 'This is a helpful test text'

        cases = [
            # tuples are ([field], [expected schema])
            # TODO: Add remaining cases
            (
                serializers.BooleanField(label=label, help_text=help_text),
                coreschema.Boolean(title=label, description=help_text)
            ),
            (
                serializers.DecimalField(1000, 1000, label=label, help_text=help_text),
                coreschema.Number(title=label, description=help_text)
            ),
            (
                serializers.FloatField(label=label, help_text=help_text),
                coreschema.Number(title=label, description=help_text)
            ),
            (
                serializers.IntegerField(label=label, help_text=help_text),
                coreschema.Integer(title=label, description=help_text)
            ),
            (
                serializers.DateField(label=label, help_text=help_text),
                coreschema.String(title=label, description=help_text, format='date')
            ),
            (
                serializers.DateTimeField(label=label, help_text=help_text),
                coreschema.String(title=label, description=help_text, format='date-time')
            ),
            (
                serializers.JSONField(label=label, help_text=help_text),
                coreschema.Object(title=label, description=help_text)
            ),
        ]

        for case in cases:
            self.assertEqual(field_to_schema(case[0]), case[1])
示例#3
0
def field_to_schema(field):
    title = force_text(field.label) if field.label else ''
    description = force_text(field.help_text) if field.help_text else ''

    if isinstance(field, (serializers.ListSerializer, serializers.ListField)):
        child_schema = field_to_schema(field.child)
        return coreschema.Array(items=child_schema,
                                title=title,
                                description=description)
    elif isinstance(field, serializers.DictField):
        return coreschema.Object(title=title, description=description)
    elif isinstance(field, serializers.Serializer):
        return coreschema.Object(properties=OrderedDict([
            (key, field_to_schema(value))
            for key, value in field.fields.items()
        ]),
                                 title=title,
                                 description=description)
    elif isinstance(field, serializers.ManyRelatedField):
        return coreschema.Array(items=coreschema.String(),
                                title=title,
                                description=description)
    elif isinstance(field, serializers.PrimaryKeyRelatedField):
        schema_cls = coreschema.String
        model = getattr(field.queryset, 'model', None)
        if model is not None:
            model_field = model._meta.pk
            if isinstance(model_field, models.AutoField):
                schema_cls = coreschema.Integer
        return schema_cls(title=title, description=description)
    elif isinstance(field, serializers.RelatedField):
        return coreschema.String(title=title, description=description)
    elif isinstance(field, serializers.MultipleChoiceField):
        return coreschema.Array(
            items=coreschema.Enum(enum=list(field.choices)),
            title=title,
            description=description)
    elif isinstance(field, serializers.ChoiceField):
        return coreschema.Enum(enum=list(field.choices),
                               title=title,
                               description=description)
    elif isinstance(field, serializers.BooleanField):
        return coreschema.Boolean(title=title, description=description)
    elif isinstance(field, (serializers.DecimalField, serializers.FloatField)):
        return coreschema.Number(title=title, description=description)
    elif isinstance(field, serializers.IntegerField):
        return coreschema.Integer(title=title, description=description)
    elif isinstance(field, serializers.DateField):
        return coreschema.String(title=title,
                                 description=description,
                                 format='date')
    elif isinstance(field, serializers.DateTimeField):
        return coreschema.String(title=title,
                                 description=description,
                                 format='date-time')
    elif isinstance(field, serializers.JSONField):
        return coreschema.Object(title=title, description=description)

    if field.style.get('base_template') == 'textarea.html':
        return coreschema.String(title=title,
                                 description=description,
                                 format='textarea')

    return coreschema.String(title=title, description=description)
示例#4
0
    def get_fields(cls, model):
        ''' Generate schema fields used to generate API docs. '''
        fields = [
            coreapi.Field(
                name="pedigree_data",
                required=True,
                location='form',
                schema=coreschema.String(
                    title="Pedigree",
                    description="CanRisk File Format",
                    format='textarea',
                ),
            ),
            coreapi.Field(
                name="user_id",
                required=True,
                location='form',
                schema=coreschema.String(
                    title="User ID",
                    description="Unique end user ID",
                ),
            ),
            coreapi.Field(
                name="cancer_rates",
                required=True,
                location='form',
                schema=coreschema.Enum(
                    list(settings.BC_MODEL['CANCER_RATES'].keys()),
                    title="Cancer rates",
                    description="Cancer incidence rates",
                    default="UK",
                ),
            ),
            coreapi.Field(
                name="mut_freq",
                required=True,
                location='form',
                schema=coreschema.Enum(
                    list(settings.BC_MODEL['MUTATION_FREQUENCIES'].keys()),
                    title="Mutation frequency",
                    description="Mutation frequency",
                    default="UK",
                ),
            ),
            coreapi.Field(
                name="prs",
                required=False,
                location='form',
                schema=coreschema.Object(
                    title="Polygenic risk score",
                    description='PRS, e.g. {"alpha":0.45,"zscore":2.652}',
                    properties={
                        'alpha': coreschema.Number,
                        'zscore': coreschema.Number
                    },
                ),
            ),
            # coreapi.Field(
            #    name="risk_factor_code",
            #    required=False,
            #    location='form',
            #    schema=coreschema.Integer(
            #        minimum=0,
            #        description="Risk factor code",
            #    ),
            # ),
        ]

        fields += [
            coreapi.Field(
                name=g.lower() + "_mut_frequency",
                required=False,
                location='form',
                schema=coreschema.Number(title=g + " mutation frequency",
                                         description=g + ' mutation frequency',
                                         minimum=settings.MIN_MUTATION_FREQ,
                                         maximum=settings.MAX_MUTATION_FREQ),
            ) for g in model['GENES']
        ]
        fields += [
            coreapi.Field(
                name=g.lower() + "_mut_sensitivity",
                required=False,
                location='form',
                schema=coreschema.Number(
                    title=g + " mutation sensitivity",
                    description=g + ' mutation sensitivity',
                    maximum=1,
                ),
            ) for g in model['GENES']
        ]
        return fields
示例#5
0
 def test_authenticated_request(self):
     client = APIClient()
     client.force_authenticate(MockUser())
     response = client.get('/', HTTP_ACCEPT='application/coreapi+json')
     assert response.status_code == 200
     expected = coreapi.Document(
         url='http://testserver/',
         title='Example API',
         content={
             'example': {
                 'list': coreapi.Link(
                     url='/example/',
                     action='get',
                     fields=[
                         coreapi.Field('page', required=False, location='query', schema=coreschema.Integer(title='Page', description='A page number within the paginated result set.')),
                         coreapi.Field('page_size', required=False, location='query', schema=coreschema.Integer(title='Page size', description='Number of results to return per page.')),
                         coreapi.Field('ordering', required=False, location='query', schema=coreschema.String(title='Ordering', description='Which field to use when ordering the results.'))
                     ]
                 ),
                 'create': coreapi.Link(
                     url='/example/',
                     action='post',
                     encoding='application/json',
                     fields=[
                         coreapi.Field('a', required=True, location='form', schema=coreschema.String(title='A', description='A field description')),
                         coreapi.Field('b', required=False, location='form', schema=coreschema.String(title='B'))
                     ]
                 ),
                 'read': coreapi.Link(
                     url='/example/{id}/',
                     action='get',
                     fields=[
                         coreapi.Field('id', required=True, location='path', schema=coreschema.String()),
                         coreapi.Field('ordering', required=False, location='query', schema=coreschema.String(title='Ordering', description='Which field to use when ordering the results.'))
                     ]
                 ),
                 'custom_action': coreapi.Link(
                     url='/example/{id}/custom_action/',
                     action='post',
                     encoding='application/json',
                     description='A description of custom action.',
                     fields=[
                         coreapi.Field('id', required=True, location='path', schema=coreschema.String()),
                         coreapi.Field('c', required=True, location='form', schema=coreschema.String(title='C')),
                         coreapi.Field('d', required=False, location='form', schema=coreschema.String(title='D')),
                     ]
                 ),
                 'custom_action_with_dict_field': coreapi.Link(
                     url='/example/{id}/custom_action_with_dict_field/',
                     action='post',
                     encoding='application/json',
                     description='A custom action using a dict field in the serializer.',
                     fields=[
                         coreapi.Field('id', required=True, location='path', schema=coreschema.String()),
                         coreapi.Field('a', required=True, location='form', schema=coreschema.Object(title='A')),
                     ]
                 ),
                 'custom_action_with_list_fields': coreapi.Link(
                     url='/example/{id}/custom_action_with_list_fields/',
                     action='post',
                     encoding='application/json',
                     description='A custom action using both list field and list serializer in the serializer.',
                     fields=[
                         coreapi.Field('id', required=True, location='path', schema=coreschema.String()),
                         coreapi.Field('a', required=True, location='form', schema=coreschema.Array(title='A', items=coreschema.Integer())),
                         coreapi.Field('b', required=True, location='form', schema=coreschema.Array(title='B', items=coreschema.String())),
                     ]
                 ),
                 'custom_list_action': coreapi.Link(
                     url='/example/custom_list_action/',
                     action='get'
                 ),
                 'custom_list_action_multiple_methods': {
                     'read': coreapi.Link(
                         url='/example/custom_list_action_multiple_methods/',
                         action='get'
                     ),
                     'create': coreapi.Link(
                         url='/example/custom_list_action_multiple_methods/',
                         action='post'
                     )
                 },
                 'update': coreapi.Link(
                     url='/example/{id}/',
                     action='put',
                     encoding='application/json',
                     fields=[
                         coreapi.Field('id', required=True, location='path', schema=coreschema.String()),
                         coreapi.Field('a', required=True, location='form', schema=coreschema.String(title='A', description=('A field description'))),
                         coreapi.Field('b', required=False, location='form', schema=coreschema.String(title='B')),
                         coreapi.Field('ordering', required=False, location='query', schema=coreschema.String(title='Ordering', description='Which field to use when ordering the results.'))
                     ]
                 ),
                 'partial_update': coreapi.Link(
                     url='/example/{id}/',
                     action='patch',
                     encoding='application/json',
                     fields=[
                         coreapi.Field('id', required=True, location='path', schema=coreschema.String()),
                         coreapi.Field('a', required=False, location='form', schema=coreschema.String(title='A', description='A field description')),
                         coreapi.Field('b', required=False, location='form', schema=coreschema.String(title='B')),
                         coreapi.Field('ordering', required=False, location='query', schema=coreschema.String(title='Ordering', description='Which field to use when ordering the results.'))
                     ]
                 ),
                 'delete': coreapi.Link(
                     url='/example/{id}/',
                     action='delete',
                     fields=[
                         coreapi.Field('id', required=True, location='path', schema=coreschema.String()),
                         coreapi.Field('ordering', required=False, location='query', schema=coreschema.String(title='Ordering', description='Which field to use when ordering the results.'))
                     ]
                 )
             }
         }
     )
     assert response.data == expected
示例#6
0
文件: views.py 项目: StepanTita/goli
class CreateQuizAPIView(generics.CreateAPIView):
    if coreapi_schema.is_enabled():
        schema = ManualSchema(
            fields=[
                coreapi.Field(
                    name="title",
                    required=True,
                    location='form',
                    schema=coreschema.String(
                        title="Title",
                        description="name of a quiz",
                    ),
                ),
                coreapi.Field(
                    name="quiz_type",
                    required=True,
                    location='form',
                    schema=coreschema.String(
                        title="Type of a quiz",
                        description="Type of a quiz",
                    ),
                ),
                coreapi.Field(
                    name="timestamp",
                    required=True,
                    location='form',
                    schema=coreschema.Integer(
                        title="Timestamp",
                        description="timestamp",
                    ),
                ),
                coreapi.Field(
                    name="goal",
                    required=True,
                    location='form',
                    schema=coreschema.Integer(
                        title="Goal",
                        description="goal for the users",
                    ),
                ),
                coreapi.Field(
                    name="indicator_value",
                    required=True,
                    location='form',
                    schema=coreschema.Number(
                        title="Indicator value",
                        description="indicator value",
                    ),
                ),
                coreapi.Field(
                    name="author",
                    required=True,
                    location='form',
                    schema=coreschema.String(
                        title="Author username",
                        description="author username",
                    ),
                ),
                coreapi.Field(
                    name="description",
                    required=True,
                    location='form',
                    schema=coreschema.String(
                        title="question description",
                        description="description",
                    ),
                ),
                coreapi.Field(
                    name="vote_detail",
                    required=True,
                    location='form',
                    schema=coreschema.Object(
                        title="Vote detail",
                        description="vote details in json format",
                    ),
                ),
            ],
            encoding="application/json",
        )
    permission_classes = (permissions.AllowAny, )
    serializer_class = serializers.QuizSerializer
    queryset = models.Vote.objects.all()