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