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, genes_by_id, intervals, request_json, user): # Update genes for locus_list_gene in locus_list.locuslistgene_set.exclude(gene_id__in=genes_by_id.keys()): delete_seqr_model(locus_list_gene) for gene_id in genes_by_id.keys(): get_or_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 interval_guids = set() for interval in intervals: interval_model, _ = LocusListInterval.objects.get_or_create( locus_list=locus_list, chrom=interval['chrom'], start=interval['start'], end=interval['end'], genome_version=genome_version, ) interval_guids.add(interval_model.guid) locus_list.locuslistinterval_set.exclude(guid__in=interval_guids).delete()
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 _update_locus_list_items(locus_list, genes_by_id, intervals, request_json, user): # Update genes for locus_list_gene in locus_list.locuslistgene_set.exclude( gene_id__in=genes_by_id.keys()): delete_seqr_model(locus_list_gene) for gene_id in genes_by_id.keys(): get_or_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 interval_guids = set() for interval in intervals: interval_model, _ = LocusListInterval.objects.get_or_create( locus_list=locus_list, chrom=interval['chrom'], start=interval['start'], end=interval['end'], genome_version=genome_version, ) interval_guids.add(interval_model.guid) locus_list.locuslistinterval_set.exclude(guid__in=interval_guids).delete()
def delete_locus_list_handler(request, locus_list_guid): locus_list = LocusList.objects.get(guid=locus_list_guid) check_object_permissions(locus_list, request.user, permission_level=CAN_EDIT) delete_seqr_model(locus_list) return create_json_response({'locusListsByGuid': {locus_list_guid: None}})
def delete_variant_note_handler(request, variant_guid, note_guid): saved_variant = SavedVariant.objects.get(guid=variant_guid) check_permissions(saved_variant.project, request.user, CAN_VIEW) note = VariantNote.objects.get(guid=note_guid, saved_variant=saved_variant) delete_seqr_model(note) return create_json_response({'savedVariantsByGuid': {variant_guid: { 'notes': [get_json_for_variant_note(tag) for tag in saved_variant.variantnote_set.all()] }}})
def delete_variant_note_handler(request, variant_guid, note_guid): saved_variant = SavedVariant.objects.get(guid=variant_guid) check_permissions(saved_variant.project, request.user, CAN_EDIT) note = VariantNote.objects.get(guid=note_guid, saved_variant=saved_variant) delete_seqr_model(note) return create_json_response({variant_guid: { 'notes': [get_json_for_variant_note(tag) for tag in saved_variant.variantnote_set.all()] }})
def delete_gene_note_handler(request, gene_id, note_guid): note = GeneNote.objects.get(guid=note_guid) if not _can_edit_note(note, request.user): raise PermissionDenied("User does not have permission to delete this note") delete_seqr_model(note) return create_json_response({'genesById': {gene_id: { 'notes': _get_gene_notes(gene_id, request.user) }}})
def delete_gene_note_handler(request, gene_id, note_guid): note = GeneNote.objects.get(guid=note_guid) if not _can_edit_note(note, request.user): raise PermissionDenied( "User does not have permission to delete this note") delete_seqr_model(note) return create_json_response( {gene_id: { 'notes': _get_gene_notes(gene_id, request.user) }})
def delete_analysis_group_handler(request, project_guid, analysis_group_guid): project = get_project_and_check_permissions(project_guid, request.user, permission_level=CAN_EDIT) analysis_group = AnalysisGroup.objects.get(guid=analysis_group_guid, project=project) delete_seqr_model(analysis_group) return create_json_response( {'analysisGroupsByGuid': { analysis_group_guid: None }})
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 delete_families_handler(request, project_guid): """Edit or delete one or more Individual records. Args: project_guid (string): GUID of project that contains these individuals. """ project = get_project_and_check_permissions(project_guid, request.user, CAN_EDIT) request_json = json.loads(request.body) logger.info("delete_families_handler %s", request_json) families_to_delete = request_json.get('families') if families_to_delete is None: return create_json_response({}, status=400, reason="'recordIdsToDelete' not specified") family_guids_to_delete = [f['familyGuid'] for f in families_to_delete] # delete individuals 1st individual_guids_to_delete = [ i.guid for i in Individual.objects.filter( family__project=project, family__guid__in=family_guids_to_delete) ] delete_individuals(project, individual_guids_to_delete) # delete families for family in Family.objects.filter(project=project, guid__in=family_guids_to_delete): delete_seqr_model(family) # send response return create_json_response({ 'individualsByGuid': { individual_guid: None for individual_guid in individual_guids_to_delete }, 'familiesByGuid': {family_guid: None for family_guid in family_guids_to_delete}, })
def delete_individuals(project, individual_guids): """Delete one or more individuals Args: project (object): Django ORM model for project individual_guids (list): GUIDs of individuals to delete Returns: list: Family objects for families with deleted individuals """ individuals_to_delete = Individual.objects.filter( family__project=project, guid__in=individual_guids) samples_to_delete = Sample.objects.filter( individual__family__project=project, individual__guid__in=individual_guids) for sample in samples_to_delete: logger.info("Deleting sample: %s" % sample) sample.delete() families = {} for individual in individuals_to_delete: families[individual.family.family_id] = individual.family # delete phenotips records try: delete_patient(project, individual) except (PhenotipsException, ValueError) as e: logger.error("Error: couldn't delete patient from phenotips: %s %s", individual.phenotips_eid, individual) # delete Individual delete_seqr_model(individual) update_pedigree_images(families.values()) families_with_deleted_individuals = list(families.values()) return families_with_deleted_individuals
def delete_project(project): """Delete project. Args: project (object): Django ORM model for the project to delete """ Sample.objects.filter(individual__family__project=project).delete() for individual in Individual.objects.filter(family__project=project): delete_seqr_model(individual) for family in Family.objects.filter(project=project): delete_seqr_model(family) delete_seqr_model(project)
def _delete_project(project): """Delete project. Args: project (object): Django ORM model for the project to delete """ Sample.objects.filter(individual__family__project=project).delete() for individual in Individual.objects.filter(family__project=project): delete_seqr_model(individual) for family in Family.objects.filter(project=project): delete_seqr_model(family) delete_seqr_model(project)
def delete_analysis_group_handler(request, project_guid, analysis_group_guid): project = get_project_and_check_permissions(project_guid, request.user, permission_level=CAN_EDIT) analysis_group = AnalysisGroup.objects.get(guid=analysis_group_guid, project=project) delete_seqr_model(analysis_group) return create_json_response({'analysisGroupsByGuid': {analysis_group_guid: None}})
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() ] } } })
def delete_locus_list_handler(request, locus_list_guid): locus_list = LocusList.objects.get(guid=locus_list_guid) check_object_permissions(locus_list, request.user, permission_level=CAN_EDIT) delete_seqr_model(locus_list) return create_json_response({'locusListsByGuid': {locus_list_guid: None}})