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
class Zscore2PercentView(APIView): renderer_classes = ( JSONRenderer, BrowsableAPIRenderer, ) serializer_class = ZscoreInputSerializer authentication_classes = ( SessionAuthentication, BasicAuthentication, TokenAuthentication, ) permission_classes = (IsAuthenticated, ) throttle_classes = (BurstRateThrottle, SustainedRateThrottle, EndUserIDRateThrottle) if coreapi is not None and coreschema is not None: schema = ManualSchema(fields=[ coreapi.Field( name="sample_name", required=True, location='form', schema=coreschema.Number( title="z-score", description="Standard normal PRS", ), ), ], encoding="application/json", description=""" Returns PRS represented as a percentage of those with a lower PRS. """) def post(self, request): """ Returns PRS represented as a percentage of those with a lower PRS. --- response_serializer: Vcf2PrsOutputSerializer parameters: - name: z-score description: Standard normal PRS type: number required: true responseMessages: - code: 401 message: Not authenticated consumes: - application/json - application/xml produces: ['application/json', 'application/xml'] """ serializer = self.serializer_class(data=request.data) if serializer.is_valid(raise_exception=True): zscore = serializer.validated_data.get("zscore") return Response( ZscoreOutputSerializer({ "percent": Zscore2PercentView.get_percentage(zscore) }).data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @classmethod def get_percentage(cls, load): """ Use error function to compute cumulative standard normal distribution, https://docs.python.org/3/library/math.html#math.erf (alternative to scipy.stats.norm.cdf(load, mu, sigma) * 100.0) to get percentage representation. @param: standard normal PRS which is normally distributed in the general population with mean of 0 and standard deviation of 1 @return: PRS represented as a percentage of those with a lower PRS """ return ((1.0 + erf(load / sqrt(2.0))) / 2.0) * 100.0
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()