示例#1
0
def get_individual_mme_matches(request, submission_guid):
    """
    Looks for matches for the given submission. Expects a single patient (MME spec) in the POST
    data field under key "patient_data"
    Args:
        project_id,indiv_id and POST all data in POST under key "patient_data"
    Returns:
        Status code and results
    """
    submission = MatchmakerSubmission.objects.get(guid=submission_guid)
    check_mme_permissions(submission, request.user)

    results = MatchmakerResult.objects.filter(submission=submission)

    saved_variants = get_json_for_saved_variants(
        SavedVariant.objects.filter(family=submission.individual.family),
        add_tags=True,
        add_details=True)

    gene_ids = set()
    for variant in saved_variants:
        gene_ids.update(variant['transcripts'].keys())

    return _parse_mme_results(
        submission,
        results,
        request.user,
        additional_genes=gene_ids,
        response_json={
            'savedVariantsByGuid':
            {variant['variantGuid']: variant
             for variant in saved_variants}
        })
示例#2
0
def delete_mme_submission(request, submission_guid):
    """
    Create or update the submission for the given individual.
    """
    submission = MatchmakerSubmission.objects.get(guid=submission_guid)
    check_mme_permissions(submission, request.user)

    if submission.deleted_date:
        return create_json_response(
            {},
            status=402,
            reason='Matchmaker submission has already been deleted for {}'.
            format(submission.individual.individual_id),
        )

    deleted_date = datetime.now()
    submission.deleted_date = deleted_date
    submission.deleted_by = request.user
    submission.save()

    for saved_result in MatchmakerResult.objects.filter(submission=submission):
        if not (saved_result.we_contacted or saved_result.host_contacted
                or saved_result.comments):
            saved_result.delete()

    return create_json_response({
        'mmeSubmissionsByGuid': {
            submission.guid: {
                'mmeDeletedDate': deleted_date
            }
        }
    })
示例#3
0
def update_mme_submission(request, submission_guid=None):
    """
    Create or update the submission for the given individual.
    """
    submission_json = json.loads(request.body)
    phenotypes = submission_json.pop('phenotypes', [])
    gene_variants = submission_json.pop('geneVariants', [])
    if not phenotypes and not gene_variants:
        return create_json_response({}, status=400, reason='Genotypes or phentoypes are required')

    genomic_features = []
    for gene_variant in gene_variants:
        if not gene_variant.get('geneId'):
            return create_json_response({}, status=400, reason='Gene id is required for genomic features')
        feature = {'gene': {'id': gene_variant['geneId']}}
        if 'numAlt' in gene_variant and gene_variant['numAlt'] > 0:
            feature['zygosity'] = gene_variant['numAlt']
        if gene_variant.get('pos'):
            genome_version = gene_variant['genomeVersion']
            feature['variant'] = {
                'referenceName': gene_variant['chrom'],
                'start': gene_variant['pos'],
                'assembly': GENOME_VERSION_LOOKUP.get(genome_version, genome_version),
            }
            if gene_variant.get('alt'):
                feature['variant'].update({
                    'alternateBases': gene_variant['alt'],
                    'referenceBases': gene_variant['ref'],
                })
            elif gene_variant.get('end'):
                feature['variant']['end'] = gene_variant['end']
        genomic_features.append(feature)

    submission_json.update({
        'features': phenotypes,
        'genomicFeatures': genomic_features,
        'deletedDate': None,
        'deletedBy': None,
    })

    if submission_guid:
        submission = MatchmakerSubmission.objects.get(guid=submission_guid)
        check_mme_permissions(submission, request.user)
    else:
        individual_guid = submission_json.get('individualGuid')
        if not individual_guid:
            return create_json_response({}, status=400, reason='Individual is required for a new submission')
        individual = Individual.objects.get(guid=individual_guid)
        check_project_permissions(individual.family.project, request.user)
        submission = MatchmakerSubmission.objects.create(
            individual=individual,
            submission_id=individual.guid,
            label=individual.individual_id,
        )

    update_model_from_json(submission, submission_json, allow_unknown_keys=True)

    # search for new matches
    return _search_matches(submission, request.user)
示例#4
0
def search_individual_mme_matches(request, submission_guid):
    """
    Looks for matches for the given submission.
    Returns:
        Status code and results
    """

    submission = MatchmakerSubmission.objects.get(guid=submission_guid)
    check_mme_permissions(submission, request.user)
    return _search_matches(submission, request.user)
示例#5
0
def update_mme_result_status(request, matchmaker_result_guid):
    """
    Looks for matches for the given individual. Expects a single patient (MME spec) in the POST
    data field under key "patient_data"
    Args:
        project_id,indiv_id and POST all data in POST under key "patient_data"
    Returns:
        Status code and results
    """
    result = MatchmakerResult.objects.get(guid=matchmaker_result_guid)
    check_mme_permissions(result.submission, request.user)

    request_json = json.loads(request.body)
    update_model_from_json(result, request_json, allow_unknown_keys=True)

    return create_json_response({
        'mmeResultsByGuid': {matchmaker_result_guid: {'matchStatus': _get_json_for_model(result)}},
    })
示例#6
0
def send_mme_contact_email(request, matchmaker_result_guid):
    """
    Sends the given email and updates the contacted status for the match
    Args:
        matchmaker_result_guid
    Returns:
        Status code and results
    """
    result = MatchmakerResult.objects.get(guid=matchmaker_result_guid)
    check_mme_permissions(result.submission, request.user)

    request_json = json.loads(request.body)
    email_message = EmailMessage(
        subject=request_json['subject'],
        body=request_json['body'],
        to=map(lambda s: s.strip(), request_json['to'].split(',')),
        from_email=MME_DEFAULT_CONTACT_EMAIL,
    )
    try:
        email_message.send()
    except Exception as e:
        message = e.message
        json_body = {}
        if hasattr(e, 'response'):
            message = e.response.content
            try:
                json_body = e.response.json()
            except Exception:
                json_body = {'message': message}
        return create_json_response(json_body,
                                    status=getattr(e, 'status_code', 400),
                                    reason=message)

    update_model_from_json(result, {'weContacted': True})

    return create_json_response({
        'mmeResultsByGuid': {
            matchmaker_result_guid: {
                'matchStatus': _get_json_for_model(result)
            }
        },
    })