Esempio n. 1
0
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)
Esempio n. 2
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
    })
Esempio n. 3
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
    })
Esempio n. 4
0
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)
Esempio n. 5
0
def _get_gene_notes(gene_id, user):
    return get_json_for_gene_notes_by_gene_id([gene_id], user).get(gene_id, [])
Esempio n. 6
0
def _get_gene_notes(gene_id, user):
    return get_json_for_gene_notes_by_gene_id([gene_id], user).get(gene_id, [])