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)
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)
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, })
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')
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')
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 }, })
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 _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, }