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 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()`' # display aliases ordering_choices = [ fields[0] for fields in super().get_valid_fields(None, view) ] return [ coreapi.Field(name=self.ordering_param, required=False, location='query', schema=coreschema.Enum( title=force_str(self.ordering_title), enum=ordering_choices, description=force_str( self.ordering_description))) ]
def format_field(self, value): dic = {"type": ""} error_messages = value.error_messages description = "" if isinstance(value, CharField): max_length = value.max_length min_length = value.min_length if max_length: description += "max_length is %d " % max_length if min_length: description += "min_length is %d " % min_length dic["type"] = "string" dic["schema"] = coreschema.String(title='', description=description, min_length=min_length, max_length=max_length) elif isinstance(value, IntegerField): min_value = value.min_value max_value = value.max_value if max_value: description += "max_value is %d " % max_value if min_value: description += "min_value is %d " % min_value dic["schema"] = coreschema.Integer(title='', description=description, minimum=min_value, maximum=max_value) dic["type"] = "integer" elif isinstance(value, ChoiceField): choices = value._choices description += str(choices).strip('[]') choice_list = set([k[0] for k in choices]) dic["type"] = "enum" dic["schema"] = coreschema.Enum(title='', description=description, enum=choice_list) else: dic["type"] = "string" dic["schema"] = coreschema.String(title='', description=description) dic["description"] = description + value.help_text return dic
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 Vcf2PrsView(APIView): renderer_classes = ( JSONRenderer, BrowsableAPIRenderer, ) serializer_class = Vcf2PrsInputSerializer 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="vcf_file", required=True, location='form', schema=coreschema.String( title="VCF", description="VCF File Format", format='textarea', ), ), coreapi.Field( name="sample_name", required=True, location='form', schema=coreschema.String( title="Sample Name", description="Sample Name", ), ), coreapi.Field( name="bc_prs_reference_file", location='form', schema=coreschema.Enum( list(settings.BC_MODEL['PRS_REFERENCE_FILES'].values()), title="Breast cancer PRS reference file", description="Breast cancer PRS reference file", default=None, ), ), coreapi.Field( name="oc_prs_reference_file", location='form', schema=coreschema.Enum( list(settings.OC_MODEL['PRS_REFERENCE_FILES'].values()), title="Ovarian cancer PRS reference file", description="Ovarian cancer PRS reference file", default=None, ), ), ], encoding="application/json", description=""" Variant Call Format (VCF) file to Polygenic Risk Score (PRS) web-service. """) def post(self, request): """ Calculate PRS from a vcf file. --- response_serializer: Vcf2PrsOutputSerializer parameters: - name: sample_name description: name of the sample in the genotype file to be used to calculate the PRS type: string required: true - name: vcf_file description: VCF genotype file type: file required: true responseMessages: - code: 401 message: Not authenticated consumes: - application/json - application/xml produces: ['application/json', 'application/xml'] """ start = time.time() serializer = self.serializer_class(data=request.data) if serializer.is_valid(raise_exception=True): validated_data = serializer.validated_data vcf_file = validated_data.get("vcf_file") vcf_stream = io.StringIO(vcf_file) moduledir = Path(vcf2prs.__file__).parent.parent bc_prs_ref_file = validated_data.get("bc_prs_reference_file", None) oc_prs_ref_file = validated_data.get("oc_prs_reference_file", None) if bc_prs_ref_file is None and oc_prs_ref_file is None: raise ValidationError( 'No breast or ovarian cancer PRS reference file provided') else: if bc_prs_ref_file is not None: bc_prs_ref_file = os.path.join(moduledir, "PRS_files", bc_prs_ref_file) if oc_prs_ref_file is not None: oc_prs_ref_file = os.path.join(moduledir, "PRS_files", oc_prs_ref_file) sample_name = validated_data.get("sample_name", None) try: if bc_prs_ref_file is not None: breast_prs = Prs(prs_file=bc_prs_ref_file, geno_file=vcf_stream, sample=sample_name) bc_alpha = breast_prs.alpha bc_zscore = breast_prs.z_Score else: bc_alpha = 0 bc_zscore = 0 if oc_prs_ref_file is not None: ovarian_prs = Prs(prs_file=oc_prs_ref_file, geno_content=vcf_stream, sample=sample_name) oc_alpha = ovarian_prs.alpha oc_zscore = ovarian_prs.z_Score else: oc_alpha = 0 oc_zscore = 0 data = { 'breast_cancer_prs': { 'alpha': bc_alpha, 'zscore': bc_zscore, 'percent': Zscore2PercentView.get_percentage(bc_zscore) }, 'ovarian_cancer_prs': { 'alpha': oc_alpha, 'zscore': oc_zscore, 'percent': Zscore2PercentView.get_percentage(oc_zscore) } } prs_serializer = Vcf2PrsOutputSerializer(data) logger.info("PRS elapsed time=" + str(time.time() - start)) return Response(prs_serializer.data) except Vcf2PrsError as ex: logger.debug(ex) data = { 'error': str(ex), 'samples': self.get_samples(vcf_file) } raise NotAcceptable(data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def get_samples(self, vcf_file): """ Get the samples in the VCF file. """ try: fsock = io.StringIO(vcf_file) vcf_content = vcf.Reader(fsock) samples = vcf_content.samples fsock.close() return samples except Exception: logging.warn(traceback.format_exc())
status=status.HTTP_404_NOT_FOUND) return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) @api_view(['PATCH']) @authentication_classes((OAuth2Authentication, BasicAuthentication)) @permission_classes((IsAuthenticated, HasApiPermission)) @schema( MethodSchema( manual_fields={ 'PATCH': [ coreapi.Field( name='op', location='form', required=True, schema=coreschema.Enum( enum=['start', 'reboot', 'shutdown', 'poweroff'])), ], })) def vm_operations(request, vm_id, format=None): if request.method == 'PATCH': args = { 'req_user': request.user, 'uuid': vm_id, 'op': request.data.get('op'), } print(args) dic = api_vm_op(args) if dic['res']: return Response(status=status.HTTP_201_CREATED) if dic['err'] == ERR_AUTH_PERM: