def update_variant_tags_handler(request, variant_guid): saved_variant = SavedVariant.objects.get(guid=variant_guid) check_permissions(saved_variant.project, request.user, CAN_EDIT) request_json = json.loads(request.body) updated_tags = request_json.get('tags', []) updated_functional_data = request_json.get('functionalData', []) # Update tags existing_tag_guids = [tag['tagGuid'] for tag in updated_tags if tag.get('tagGuid')] new_tags = [tag for tag in updated_tags if not tag.get('tagGuid')] for tag in saved_variant.varianttag_set.exclude(guid__in=existing_tag_guids): delete_seqr_model(tag) for tag in new_tags: variant_tag_type = VariantTagType.objects.get( Q(name=tag['name']), Q(project=saved_variant.project) | Q(project__isnull=True) ) create_seqr_model( VariantTag, saved_variant=saved_variant, variant_tag_type=variant_tag_type, search_parameters=request_json.get('searchParameters'), created_by=request.user, ) # Update functional data existing_functional_guids = [tag['tagGuid'] for tag in updated_functional_data if tag.get('tagGuid')] for tag in saved_variant.variantfunctionaldata_set.exclude(guid__in=existing_functional_guids): delete_seqr_model(tag) for tag in updated_functional_data: if tag.get('tagGuid'): tag_model = VariantFunctionalData.objects.get( guid=tag.get('tagGuid'), functional_data_tag=tag.get('name'), saved_variant=saved_variant ) update_model_from_json(tag_model, tag, allow_unknown_keys=True) else: create_seqr_model( VariantFunctionalData, saved_variant=saved_variant, functional_data_tag=tag.get('name'), metadata=tag.get('metadata'), search_parameters=request_json.get('searchParameters'), created_by=request.user, ) return create_json_response({ variant_guid: { 'tags': [get_json_for_variant_tag(tag) for tag in saved_variant.varianttag_set.all()], 'functionalData': [get_json_for_variant_functional_data(tag) for tag in saved_variant.variantfunctionaldata_set.all()] } })
def _update_locus_list_items(locus_list, new_genes, existing_gene_ids, new_intervals, existing_interval_guids, request_json, user): # Update genes for locus_list_gene in locus_list.locuslistgene_set.exclude(gene_id__in=existing_gene_ids): delete_seqr_model(locus_list_gene) for gene_id in new_genes.keys(): create_seqr_model( LocusListGene, locus_list=locus_list, gene_id=gene_id, created_by=user, ) # Update intervals genome_version = request_json.get('intervalGenomeVersion') or GENOME_VERSION_GRCh37 locus_list.locuslistinterval_set.exclude(guid__in=existing_interval_guids).delete() for existing_interval in locus_list.locuslistinterval_set.all(): update_model_from_json(existing_interval, {'genomeVersion': genome_version}) for interval in new_intervals: LocusListInterval.objects.create( locus_list=locus_list, chrom=interval['chrom'].lstrip('chr'), start=interval['start'], end=interval['end'], genome_version=genome_version, )
def _create_variant_note(saved_variant, note_json, user): create_seqr_model( VariantNote, saved_variant=saved_variant, note=note_json.get('note'), submit_to_clinvar=note_json.get('submitToClinvar') or False, search_hash=note_json.get('searchHash'), created_by=user, )
def create_gene_note_handler(request, gene_id): request_json = json.loads(request.body) create_seqr_model( GeneNote, note=request_json.get('note'), gene_id=gene_id, created_by=request.user, ) return create_json_response({'genesById': {gene_id: { 'notes': _get_gene_notes(gene_id, request.user) }}})
def create_gene_note_handler(request, gene_id): request_json = json.loads(request.body) create_seqr_model( GeneNote, note=request_json.get('note'), gene_id=gene_id, created_by=request.user, ) return create_json_response( {gene_id: { 'notes': _get_gene_notes(gene_id, request.user) }})
def _create_new_tags(saved_variant, tags_json, user): tags = tags_json.get('tags', []) new_tags = [tag for tag in tags if not tag.get('tagGuid')] for tag in new_tags: variant_tag_type = VariantTagType.objects.get( Q(name=tag['name']), Q(project=saved_variant.family.project) | Q(project__isnull=True)) create_seqr_model( VariantTag, saved_variant=saved_variant, variant_tag_type=variant_tag_type, search_hash=tags_json.get('searchHash'), created_by=user, )
def handle(self, *args, **options): project_name = options['project'] tag_options = { k: options[k] or '' for k in ['name', 'order', 'category', 'description', 'color'] } project = Project.objects.get( Q(name=project_name) | Q(guid=project_name)) if VariantTagType.objects.filter(name__iexact=options['name']).filter( Q(project=project) | Q(project__isnull=True)): raise CommandError('Tag "{}" already exists for project {}'.format( options['name'], project_name)) create_seqr_model(VariantTagType, project=project, **tag_options)
def update_family_analysed_by(request, family_guid): """Updates the specified field in the Family model. Args: family_guid (string): GUID of the family. field_name (string): Family model field name to update """ family = Family.objects.get(guid=family_guid) check_permissions(family.project, request.user, CAN_EDIT) create_seqr_model(FamilyAnalysedBy, family=family, created_by=request.user) return create_json_response( {family.guid: _get_json_for_family(family, request.user)})
def update_variant_tags_handler(request, variant_guid): saved_variant = SavedVariant.objects.get(guid=variant_guid) check_permissions(saved_variant.project, request.user, CAN_VIEW) request_json = json.loads(request.body) updated_tags = request_json.get('tags', []) updated_functional_data = request_json.get('functionalData', []) # Update tags existing_tag_guids = [tag['tagGuid'] for tag in updated_tags if tag.get('tagGuid')] for tag in saved_variant.varianttag_set.exclude(guid__in=existing_tag_guids): delete_seqr_model(tag) _create_new_tags(saved_variant, request_json, request.user) # Update functional data existing_functional_guids = [tag['tagGuid'] for tag in updated_functional_data if tag.get('tagGuid')] for tag in saved_variant.variantfunctionaldata_set.exclude(guid__in=existing_functional_guids): delete_seqr_model(tag) for tag in updated_functional_data: if tag.get('tagGuid'): tag_model = VariantFunctionalData.objects.get( guid=tag.get('tagGuid'), functional_data_tag=tag.get('name'), saved_variant=saved_variant ) update_model_from_json(tag_model, tag, allow_unknown_keys=True) else: create_seqr_model( VariantFunctionalData, saved_variant=saved_variant, functional_data_tag=tag.get('name'), metadata=tag.get('metadata'), search_hash=request_json.get('searchHash'), created_by=request.user, ) return create_json_response({'savedVariantsByGuid': { variant_guid: { 'tags': [get_json_for_variant_tag(tag) for tag in saved_variant.varianttag_set.all()], 'functionalData': [get_json_for_variant_functional_data(tag) for tag in saved_variant.variantfunctionaldata_set.all()] } }})
def _create_new_tags(saved_variant, tags_json, user): tags = tags_json.get('tags', []) new_tags = [tag for tag in tags if not tag.get('tagGuid')] for tag in new_tags: variant_tag_type = VariantTagType.objects.get( Q(name=tag['name']), Q(project=saved_variant.project) | Q(project__isnull=True) ) create_seqr_model( VariantTag, saved_variant=saved_variant, variant_tag_type=variant_tag_type, search_hash=tags_json.get('searchHash'), created_by=user, )
def update_family_analysed_by(request, family_guid): """Updates the specified field in the Family model. Args: family_guid (string): GUID of the family. field_name (string): Family model field name to update """ family = Family.objects.get(guid=family_guid) check_permissions(family.project, request.user, CAN_EDIT) create_seqr_model(FamilyAnalysedBy, family=family, created_by=request.user) return create_json_response({ family.guid: _get_json_for_family(family, request.user) })
def create_locus_list_handler(request): request_json = json.loads(request.body) if not request_json.get('name'): return create_json_response({}, status=400, reason='"Name" is required') genes_by_id, intervals, invalid_items = parse_locus_list_items( request_json) if invalid_items and not request_json.get('ignoreInvalidItems'): return create_json_response({'invalidLocusListItems': invalid_items}, status=400, reason=INVALID_ITEMS_ERROR) locus_list = create_seqr_model( LocusList, name=request_json['name'], description=request_json.get('description') or '', is_public=request_json.get('isPublic') or False, created_by=request.user, ) _update_locus_list_items(locus_list, genes_by_id, intervals, request_json, request.user) add_locus_list_user_permissions(locus_list) return create_json_response({ 'locusListsByGuid': { locus_list.guid: get_json_for_locus_list(locus_list, request.user) }, 'genesById': genes_by_id, })
def create_variant_note_handler(request, variant_guid): saved_variant = SavedVariant.objects.get(guid=variant_guid) check_permissions(saved_variant.project, request.user, CAN_EDIT) request_json = json.loads(request.body) create_seqr_model( VariantNote, saved_variant=saved_variant, note=request_json.get('note'), submit_to_clinvar=request_json.get('submitToClinvar', False), search_parameters=request_json.get('searchParameters'), created_by=request.user, ) return create_json_response({variant_guid: { 'notes': [get_json_for_variant_note(tag) for tag in saved_variant.variantnote_set.all()] }})
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 update_analysis_group_handler(request, project_guid, analysis_group_guid=None): project = get_project_and_check_permissions(project_guid, request.user, permission_level=CAN_EDIT) request_json = json.loads(request.body) missing_fields = [field for field in REQUIRED_FIELDS.keys() if not request_json.get(field)] if missing_fields: return create_json_response( {}, status=400, reason='Missing required field(s): {missing_field_names}'.format( missing_field_names=', '.join([REQUIRED_FIELDS[field] for field in missing_fields]) )) families = Family.objects.filter(guid__in=request_json['familyGuids']).only('guid') if len(families) != len(request_json['familyGuids']): return create_json_response( {}, status=400, reason='The following families do not exist: {missing_families}'.format( missing_families=', '.join(set(request_json['familyGuids']) - set([family.guid for family in families])) )) if analysis_group_guid: analysis_group = AnalysisGroup.objects.get(guid=analysis_group_guid, project=project) update_model_from_json(analysis_group, request_json, allow_unknown_keys=True) else: try: analysis_group = create_seqr_model( AnalysisGroup, project=project, name=request_json['name'], description=request_json.get('description'), created_by=request.user, ) except IntegrityError: return create_json_response( {}, status=400, reason='An analysis group named "{name}" already exists for project "{project}"'.format( name=request_json['name'], project=project.name )) analysis_group.families.set(families) base_family_group = find_matching_xbrowse_model(analysis_group) if base_family_group: base_family_group.families.set(BaseFamily.objects.filter(seqr_family__in=families)) return create_json_response({ 'analysisGroupsByGuid': { analysis_group.guid: get_json_for_analysis_group(analysis_group, project_guid=project_guid) }, })
def update_analysis_group_handler(request, project_guid, analysis_group_guid=None): project = get_project_and_check_permissions(project_guid, request.user, permission_level=CAN_EDIT) request_json = json.loads(request.body) missing_fields = [field for field in REQUIRED_FIELDS.keys() if not request_json.get(field)] if missing_fields: return create_json_response( {}, status=400, reason='Missing required field(s): {missing_field_names}'.format( missing_field_names=', '.join([REQUIRED_FIELDS[field] for field in missing_fields]) )) families = Family.objects.filter(guid__in=request_json['familyGuids']).only('guid') if len(families) != len(request_json['familyGuids']): return create_json_response( {}, status=400, reason='The following families do not exist: {missing_families}'.format( missing_families=', '.join(set(request_json['familyGuids']) - set([family.guid for family in families])) )) if analysis_group_guid: analysis_group = AnalysisGroup.objects.get(guid=analysis_group_guid, project=project) update_model_from_json(analysis_group, request_json, allow_unknown_keys=True) else: try: analysis_group = create_seqr_model( AnalysisGroup, project=project, name=request_json['name'], description=request_json.get('description'), created_by=request.user, ) except IntegrityError: return create_json_response( {}, status=400, reason='An analysis group named "{name}" already exists for project "{project}"'.format( name=request_json['name'], project=project.name )) analysis_group.families.set(families) update_xbrowse_family_group_families(analysis_group, families) return create_json_response({ 'analysisGroupsByGuid': { analysis_group.guid: get_json_for_analysis_group(analysis_group, project_guid=project_guid) }, })
def create_locus_list_handler(request): request_json = json.loads(request.body) if not request_json.get('name'): return create_json_response({}, status=400, reason='"Name" is required') genes_by_id, intervals, invalid_items = parse_locus_list_items(request_json) if invalid_items and not request_json.get('ignoreInvalidItems'): return create_json_response({'invalidLocusListItems': invalid_items}, status=400, reason=INVALID_ITEMS_ERROR) locus_list = create_seqr_model( LocusList, name=request_json['name'], description=request_json.get('description') or '', is_public=request_json.get('isPublic') or False, created_by=request.user, ) _update_locus_list_items(locus_list, genes_by_id, intervals, request_json, request.user) add_locus_list_user_permissions(locus_list) return create_json_response({ 'locusListsByGuid': {locus_list.guid: get_json_for_locus_list(locus_list, request.user)}, 'genesById': genes_by_id, })
def update_variant_tags_handler(request, variant_guid): saved_variant = SavedVariant.objects.get(guid=variant_guid) check_permissions(saved_variant.family.project, request.user, CAN_VIEW) request_json = json.loads(request.body) updated_tags = request_json.get('tags', []) updated_functional_data = request_json.get('functionalData', []) # Update tags existing_tag_guids = [ tag['tagGuid'] for tag in updated_tags if tag.get('tagGuid') ] for tag in saved_variant.varianttag_set.exclude( guid__in=existing_tag_guids): delete_seqr_model(tag) _create_new_tags(saved_variant, request_json, request.user) # Update functional data existing_functional_guids = [ tag['tagGuid'] for tag in updated_functional_data if tag.get('tagGuid') ] for tag in saved_variant.variantfunctionaldata_set.exclude( guid__in=existing_functional_guids): delete_seqr_model(tag) for tag in updated_functional_data: if tag.get('tagGuid'): tag_model = VariantFunctionalData.objects.get( guid=tag.get('tagGuid'), functional_data_tag=tag.get('name'), saved_variant=saved_variant) update_model_from_json(tag_model, tag, allow_unknown_keys=True) else: create_seqr_model( VariantFunctionalData, saved_variant=saved_variant, functional_data_tag=tag.get('name'), metadata=tag.get('metadata'), search_hash=request_json.get('searchHash'), created_by=request.user, ) return create_json_response({ 'savedVariantsByGuid': { variant_guid: { 'tags': [ get_json_for_variant_tag(tag) for tag in saved_variant.varianttag_set.all() ], 'functionalData': [ get_json_for_variant_functional_data(tag) for tag in saved_variant.variantfunctionaldata_set.all() ] } } })