def create_variant_note_handler(request, variant_guids): request_json = json.loads(request.body) save_as_gene_note = request_json.get('saveAsGeneNote') family_guid = request_json.pop('familyGuid') family = Family.objects.get(guid=family_guid) check_project_permissions(family.project, request.user) all_variant_guids = variant_guids.split(',') saved_variants = SavedVariant.objects.filter(guid__in=all_variant_guids) if len(saved_variants) != len(all_variant_guids): error = 'Unable to find the following variant(s): {}'.format(', '.join( [ guid for guid in all_variant_guids if guid not in {sv.guid for sv in saved_variants} ])) return create_json_response({'error': error}, status=400, reason=error) # update saved_variants note = _create_variant_note(saved_variants, request_json, request.user) note_json = get_json_for_variant_note(note, add_variant_guids=False) note_json['variantGuids'] = all_variant_guids response = { 'savedVariantsByGuid': { saved_variant.guid: { 'noteGuids': [n.guid for n in saved_variant.variantnote_set.all()] } for saved_variant in saved_variants }, 'variantNotesByGuid': { note.guid: note_json }, } if save_as_gene_note: main_transcript_id = saved_variants[ 0].selected_main_transcript_id or saved_variants[ 0].saved_variant_json['mainTranscriptId'] gene_id = next( (gene_id for gene_id, transcripts in saved_variants[0]. saved_variant_json['transcripts'].items() if any( t['transcriptId'] == main_transcript_id for t in transcripts)), None) if main_transcript_id else None GeneNote.objects.create( note=request_json.get('note'), gene_id=gene_id, created_by=request.user, ) response['genesById'] = { gene_id: { 'notes': get_json_for_gene_notes_by_gene_id([gene_id], request.user)[gene_id], } } return create_json_response(response)
def create_variant_note_handler(request, variant_guid): request_json = json.loads(request.body) save_as_gene_note = request_json.get('saveAsGeneNote') saved_variant = SavedVariant.objects.get(guid=variant_guid) check_permissions(saved_variant.family.project, request.user, CAN_VIEW) if save_as_gene_note: main_transcript_id = saved_variant.selected_main_transcript_id or saved_variant.saved_variant_json[ 'mainTranscriptId'] gene_id = next( (gene_id for gene_id, transcripts in saved_variant.saved_variant_json['transcripts'].items() if any( t['transcriptId'] == main_transcript_id for t in transcripts)), None) if main_transcript_id else None create_seqr_model( GeneNote, note=request_json.get('note'), gene_id=gene_id, created_by=request.user, ) gene_note = { gene_id: { 'notes': get_json_for_gene_notes_by_gene_id([gene_id], request.user).get( gene_id, []) } } if save_as_gene_note else {} _create_variant_note(saved_variant, request_json, request.user) variant_note = { variant_guid: { 'notes': [ get_json_for_variant_note(tag) for tag in saved_variant.variantnote_set.all() ] }, } return create_json_response({ 'savedVariantsByGuid': variant_note, 'genesById': gene_note })
def create_variant_note_handler(request, variant_guid): request_json = json.loads(request.body) save_as_gene_note = request_json.get('saveAsGeneNote') saved_variant = SavedVariant.objects.get(guid=variant_guid) check_permissions(saved_variant.project, request.user, CAN_VIEW) if save_as_gene_note: gene_id = json.loads( saved_variant.saved_variant_json)['mainTranscript']['geneId'] create_seqr_model( GeneNote, note=request_json.get('note'), gene_id=gene_id, created_by=request.user, ) gene_note = { gene_id: { 'notes': get_json_for_gene_notes_by_gene_id([gene_id], request.user).get( gene_id, []) } } if save_as_gene_note else {} _create_variant_note(saved_variant, request_json, request.user) variant_note = { variant_guid: { 'notes': [ get_json_for_variant_note(tag) for tag in saved_variant.variantnote_set.all() ] }, } return create_json_response({ 'savedVariantsByGuid': variant_note, 'genesById': gene_note })
def _get_json_for_genes(genes, user=None, gene_fields=None): if not gene_fields: gene_fields = {} total_gene_constraints = None if CONSTRAINT in gene_fields: total_gene_constraints = GeneConstraint.objects.count() if NOTES in gene_fields: gene_notes_json = get_json_for_gene_notes_by_gene_id( [gene.gene_id for gene in genes], user) def _add_total_constraint_count(result, *args): result['totalGenes'] = total_gene_constraints def _process_result(result, gene): for field, (_, result_func) in gene_fields.items(): if field == NOTES: updates = {'notes': gene_notes_json.get(result['geneId'], [])} elif field == CONSTRAINT: constraint = _get_gene_model(gene, 'geneconstraint') updates = { 'constraints': _get_json_for_model( constraint, process_result=_add_total_constraint_count) if constraint else {} } else: updates = result_func(gene) result.update(updates) for model, _ in gene_fields.values(): if model: prefetch_related_objects( genes, Prefetch('{}_set'.format(model.__name__.lower()), queryset=model.objects.only( 'gene__gene_id', *model._meta.json_fields))) return _get_json_for_models(genes, process_result=_process_result)
def _get_gene_notes(gene_id, user): return get_json_for_gene_notes_by_gene_id([gene_id], user).get(gene_id, [])