def test_json_for_saved_variant(self):
        variant = SavedVariant.objects.first()
        json = get_json_for_saved_variant(variant)

        fields = {'variantGuid', 'variantId', 'familyGuids', 'xpos', 'ref', 'alt'}
        self.assertSetEqual(set(json.keys()), fields)

        fields.update({'tags', 'functionalData', 'notes', 'liftedOverGenomeVersion', 'clinvar', 'originalAltAlleles',
                       'liftedOverPos', 'genomeVersion', 'mainTranscript', 'hgmd', 'liftedOverChrom', 'genotypeFilters',
                       'genotypes', 'transcripts', 'populations', 'predictions', 'chrom', 'pos', 'rsid'})
        json = get_json_for_saved_variant(variant, add_tags=True, add_details=True)
        self.assertSetEqual(set(json.keys()), fields)
Esempio n. 2
0
    def test_json_for_saved_variant(self):
        variant = SavedVariant.objects.first()
        json = get_json_for_saved_variant(variant)

        fields = {'variantGuid', 'variantId', 'familyGuids', 'xpos', 'ref', 'alt'}
        self.assertSetEqual(set(json.keys()), fields)

        fields.update({'tags', 'functionalData', 'notes', 'liftedOverGenomeVersion', 'clinvar', 'originalAltAlleles',
                       'liftedOverPos', 'genomeVersion', 'mainTranscript', 'hgmd', 'liftedOverChrom', 'genotypeFilters',
                       'genotypes', 'transcripts', 'populations', 'predictions', 'chrom', 'pos', 'rsid'})
        json = get_json_for_saved_variant(variant, add_tags=True, add_details=True)
        self.assertSetEqual(set(json.keys()), fields)
Esempio n. 3
0
    def test_json_for_saved_variant(self):
        variant = SavedVariant.objects.first()
        json = get_json_for_saved_variant(variant)

        fields = {
            'variantId', 'familyGuid', 'xpos', 'ref', 'alt', 'chrom', 'pos'
        }
        self.assertSetEqual(set(json.keys()), fields)

        fields.update({'tags', 'functionalData', 'notes'})
        json = get_json_for_saved_variant(variant, add_tags=True)
        self.assertSetEqual(set(json.keys()), fields)
Esempio n. 4
0
def saved_variant_data(request, project_guid, variant_guid=None):
    project = get_project_and_check_permissions(project_guid, request.user)

    variants = {}
    variant_query = SavedVariant.objects.filter(project=project)\
        .select_related('family')\
        .only('xpos_start', 'ref', 'alt', 'saved_variant_json', 'family__guid', 'guid')\
        .prefetch_related('varianttag_set', 'varianttag_set__created_by', 'varianttag_set__variant_tag_type',
                          'variantfunctionaldata_set', 'variantfunctionaldata_set__created_by', 'variantnote_set',
                          'variantnote_set__created_by')
    if request.GET.get('families'):
        variant_query = variant_query.filter(
            family__guid__in=request.GET.get('families').split(','))
    if variant_guid:
        variant_query = variant_query.filter(guid=variant_guid)
        if variant_query.count() < 1:
            return create_json_response(
                {},
                status=404,
                reason='Variant {} not found'.format(variant_guid))
    for saved_variant in variant_query:
        variant = get_json_for_saved_variant(saved_variant, add_tags=True)
        if variant['tags'] or variant['notes']:
            variant_json = json.loads(saved_variant.saved_variant_json or '{}')
            variant.update(variant_details(variant_json, project,
                                           request.user))
            variants[variant['variantId']] = variant

    genes = _saved_variant_genes(variants)
    _add_locus_lists(project, variants, genes)

    return create_json_response({
        'savedVariants': variants,
        'genesById': genes,
    })
Esempio n. 5
0
def create_saved_variant_handler(request):
    variant_json = json.loads(request.body)
    family_guid = variant_json.pop('familyGuid')
    non_variant_json = {
        k: variant_json.pop(k, None) for k in ['searchHash', 'tags', 'functionalData', 'notes', 'note', 'submitToClinvar']
    }

    family = Family.objects.get(guid=family_guid)
    check_permissions(family.project, request.user, CAN_VIEW)

    xpos = variant_json['xpos']
    ref = variant_json['ref']
    alt = variant_json['alt']
    # TODO remove project field from saved variants
    saved_variant = SavedVariant.objects.create(
        xpos=xpos,
        xpos_start=xpos,
        xpos_end=xpos + len(ref) - 1,
        ref=ref,
        alt=alt,
        family=family,
        project=family.project,
        saved_variant_json=json.dumps(variant_json)
    )

    if non_variant_json.get('note'):
        _create_variant_note(saved_variant, non_variant_json, request.user)
    elif non_variant_json.get('tags'):
        _create_new_tags(saved_variant, non_variant_json, request.user)

    variant_json.update(get_json_for_saved_variant(saved_variant, add_tags=True, project_guid=family.project.guid))
    return create_json_response({
        'savedVariantsByGuid': {saved_variant.guid: variant_json},
    })
    def test_json_for_saved_variant(self):
        variant = SavedVariant.objects.get(guid='SV0000001_2103343353_r0390_100')
        json = get_json_for_saved_variant(variant)

        self.assertSetEqual(set(json.keys()), SAVED_VARIANT_FIELDS)
        self.assertListEqual(json['familyGuids'], ["F000001_1"])
        self.assertEqual(json['variantId'], '21-3343353-GAGA-G')

        fields = set()
        fields.update(SAVED_VARIANT_FIELDS)
        fields.update(list(variant.saved_variant_json.keys()))
        json = get_json_for_saved_variant(variant, add_details=True)
        self.assertSetEqual(set(json.keys()), fields)
        self.assertListEqual(json['familyGuids'], ["F000001_1"])
        self.assertEqual(json['variantId'], '21-3343353-GAGA-G')
        self.assertEqual(json['mainTranscriptId'], 'ENST00000258436')
Esempio n. 7
0
    def test_json_for_saved_variant(self):
        variant = SavedVariant.objects.get(
            guid='SV0000001_2103343353_r0390_100')
        json = get_json_for_saved_variant(variant)

        fields = {
            'variantGuid', 'variantId', 'familyGuids', 'xpos', 'ref', 'alt',
            'selectedMainTranscriptId'
        }
        self.assertSetEqual(set(json.keys()), fields)
        self.assertListEqual(json['familyGuids'], ["F000001_1"])
        self.assertEqual(json['variantId'], '21-3343353-GAGA-G')

        fields.update(variant.saved_variant_json.keys())
        fields.update({'tags', 'functionalData', 'notes'})
        json = get_json_for_saved_variant(variant,
                                          add_tags=True,
                                          add_details=True)
        self.assertSetEqual(set(json.keys()), fields)
        self.assertListEqual(json['familyGuids'], ["F000001_1"])
        self.assertEqual(json['variantId'], 'abc123')
Esempio n. 8
0
def create_saved_variant_handler(request):
    variant_json = json.loads(request.body)
    family_guid = variant_json.pop('familyGuid')
    non_variant_json = {
        k: variant_json.pop(k, None)
        for k in [
            'searchHash', 'tags', 'functionalData', 'notes', 'note',
            'submitToClinvar'
        ]
    }

    family = Family.objects.get(guid=family_guid)
    check_permissions(family.project, request.user, CAN_VIEW)

    if 'xpos' not in variant_json:
        variant_json['xpos'] = get_xpos(variant_json['chrom'],
                                        variant_json['pos'])

    xpos = variant_json['xpos']
    ref = variant_json['ref']
    alt = variant_json['alt']
    var_length = variant_json['pos_end'] - variant_json[
        'pos'] if 'pos_end' in variant_json else len(ref) - 1
    saved_variant = SavedVariant.objects.create(
        xpos=xpos,
        xpos_start=xpos,
        xpos_end=xpos + var_length,
        ref=ref,
        alt=alt,
        family=family,
        saved_variant_json=variant_json)

    if non_variant_json.get('note'):
        _create_variant_note(saved_variant, non_variant_json, request.user)
    elif non_variant_json.get('tags'):
        _create_new_tags(saved_variant, non_variant_json, request.user)

    variant_json.update(
        get_json_for_saved_variant(saved_variant, add_tags=True))
    return create_json_response({
        'savedVariantsByGuid': {
            saved_variant.guid: variant_json
        },
    })
Esempio n. 9
0
def create_saved_variant_handler(request):
    variant_json = json.loads(request.body)
    family_guid = variant_json.pop('familyGuid')
    non_variant_json = {
        k: variant_json.pop(k, None)
        for k in [
            'searchHash', 'tags', 'functionalData', 'notes', 'note',
            'submitToClinvar'
        ]
    }

    family = Family.objects.get(guid=family_guid)
    check_permissions(family.project, request.user, CAN_VIEW)

    xpos = variant_json['xpos']
    ref = variant_json['ref']
    alt = variant_json['alt']
    # TODO remove project field from saved variants
    saved_variant = SavedVariant.objects.create(
        xpos=xpos,
        xpos_start=xpos,
        xpos_end=xpos + len(ref) - 1,
        ref=ref,
        alt=alt,
        family=family,
        project=family.project,
        saved_variant_json=json.dumps(variant_json))

    if non_variant_json.get('note'):
        _create_variant_note(saved_variant, non_variant_json, request.user)
    elif non_variant_json.get('tags'):
        _create_new_tags(saved_variant, non_variant_json, request.user)

    variant_json.update(
        get_json_for_saved_variant(saved_variant,
                                   add_tags=True,
                                   project_guid=family.project.guid))
    return create_json_response({
        'savedVariantsByGuid': {
            saved_variant.guid: variant_json
        },
    })
Esempio n. 10
0
def _get_json_for_variant_tag_types(project):
    project_variant_tags = []
    discovery_tags = []
    tag_counts_by_type_and_family = VariantTag.objects.filter(
        saved_variant__project=project).values(
            'saved_variant__family__guid',
            'variant_tag_type__name').annotate(count=Count('*'))
    for variant_tag_type in VariantTagType.objects.filter(
            Q(project=project) | Q(project__isnull=True)):
        current_tag_type_counts = [
            counts for counts in tag_counts_by_type_and_family
            if counts['variant_tag_type__name'] == variant_tag_type.name
        ]
        num_tags = sum(count['count'] for count in current_tag_type_counts)
        if variant_tag_type.category == 'CMG Discovery Tags' and num_tags > 0:
            for tag in VariantTag.objects.filter(
                    saved_variant__project=project,
                    variant_tag_type=variant_tag_type).select_related(
                        'saved_variant'):
                tag_data = get_json_for_saved_variant(tag.saved_variant)
                tag_data.update(
                    json.loads(tag.saved_variant.saved_variant_json or '{}'))
                discovery_tags.append(tag_data)

        project_variant_tags.append({
            'variantTagTypeGuid': variant_tag_type.guid,
            'name': variant_tag_type.name,
            'category': variant_tag_type.category,
            'description': variant_tag_type.description,
            'color': variant_tag_type.color,
            'order': variant_tag_type.order,
            'is_built_in': variant_tag_type.is_built_in,
            'numTags': num_tags,
            'numTagsPerFamily': {
                count['saved_variant__family__guid']: count['count']
                for count in current_tag_type_counts
            },
        })

    project_functional_tags = []
    for category, tags in VariantFunctionalData.FUNCTIONAL_DATA_CHOICES:
        project_functional_tags += [{
            'category':
            category,
            'name':
            name,
            'metadataTitle':
            json.loads(tag_json).get('metadata_title'),
            'color':
            json.loads(tag_json)['color'],
            'description':
            json.loads(tag_json).get('description'),
        } for name, tag_json in tags]

    return {
        'variantTagTypes':
        sorted(project_variant_tags,
               key=lambda variant_tag_type: variant_tag_type['order']),
        'variantFunctionalTagTypes':
        project_functional_tags,
        'discoveryTags':
        discovery_tags,
    }