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} })
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 } } })
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)
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)
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)}}, })
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) } }, })