Exemplo n.º 1
0
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()]
        }
    })
Exemplo n.º 2
0
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()
Exemplo n.º 3
0
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,
        )
Exemplo n.º 4
0
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()
Exemplo n.º 5
0
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}})
Exemplo n.º 6
0
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()]
    }}})
Exemplo n.º 7
0
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()]
    }})
Exemplo n.º 8
0
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)
    }}})
Exemplo n.º 9
0
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)
        }})
Exemplo n.º 10
0
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
        }})
Exemplo n.º 11
0
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()]
        }
    }})
Exemplo n.º 12
0
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},
    })
Exemplo n.º 13
0
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
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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)
Exemplo n.º 16
0
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}})
Exemplo n.º 17
0
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()
                ]
            }
        }
    })
Exemplo n.º 18
0
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}})