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])
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)
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
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
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()