Ejemplo n.º 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)
Ejemplo n.º 2
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()`'

        # 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)))
        ]
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
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)
Ejemplo n.º 5
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
Ejemplo n.º 6
0
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())
Ejemplo n.º 7
0
                        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: