def update_variant_tags_handler(request, variant_guids): request_json = json.loads(request.body) family_guid = request_json.pop('familyGuid') family = Family.objects.get(guid=family_guid) check_project_permissions(family.project, request.user) all_variant_guids = set(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) deleted_tag_guids = _delete_removed_tags(saved_variants, all_variant_guids, request_json.get('tags', []), request.user) created_tags = _create_new_tags(saved_variants, request_json, request.user) tag_updates = {tag['tagGuid']: tag for tag in get_json_for_variant_tags(created_tags)} tag_updates.update({guid: None for guid in deleted_tag_guids}) saved_variants_by_guid = {} for saved_variant in saved_variants: tags = saved_variant.varianttag_set.all() saved_variants_by_guid[saved_variant.guid] = {'tagGuids': [t.guid for t in tags]} if not tags: if not saved_variant.variantnote_set.count() > 0: saved_variant.delete_model(request.user, user_can_delete=True) saved_variants_by_guid[saved_variant.guid] = None return create_json_response({ 'savedVariantsByGuid': saved_variants_by_guid, 'variantTagsByGuid': tag_updates, })
def test_json_for_variant_tags(self): tags = VariantTag.objects.all()[:1] json = get_json_for_variant_tags(tags)[0] self.assertSetEqual(set(json.keys()), TAG_FIELDS)
def _get_saved_variants(variants, families, include_discovery_tags=False): if not variants: return {}, {} variants = _flatten_variants(variants) prefetch_related_objects(families, 'project') hg37_family_guids = { family.guid for family in families if family.project.genome_version == GENOME_VERSION_GRCh37 } variant_q = Q() discovery_variant_q = Q() variants_by_id = {} for variant in variants: variants_by_id[_get_variant_key(**variant)] = variant variant_q |= Q(xpos_start=variant['xpos'], ref=variant['ref'], alt=variant['alt'], family__guid__in=variant['familyGuids']) discovery_variant_q |= Q( Q(xpos_start=variant['xpos'], ref=variant['ref'], alt=variant['alt']) & ~Q(family__guid__in=variant['familyGuids'])) if variant[ 'liftedOverGenomeVersion'] == GENOME_VERSION_GRCh37 and hg37_family_guids: variant_hg37_families = [ family_guid for family_guid in variant['familyGuids'] if family_guid in hg37_family_guids ] if variant_hg37_families: lifted_xpos = get_xpos(variant['liftedOverChrom'], variant['liftedOverPos']) variant_q |= Q(xpos_start=lifted_xpos, ref=variant['ref'], alt=variant['alt'], family__guid__in=variant_hg37_families) variants_by_id[_get_variant_key( xpos=lifted_xpos, ref=variant['ref'], alt=variant['alt'], genomeVersion=variant['liftedOverGenomeVersion'] )] = variant saved_variants = SavedVariant.objects.filter(variant_q) json = get_json_for_saved_variants_with_tags(saved_variants, add_details=True) variants_to_saved_variants = {} for saved_variant in json['savedVariantsByGuid'].values(): family_guids = saved_variant['familyGuids'] searched_variant = variants_by_id.get( _get_variant_key(**saved_variant)) if not searched_variant: # This can occur when an hg38 family has a saved variant that did not successfully lift from hg37 continue saved_variant.update(searched_variant) # For saved variants only use family it was saved for, not all families in search saved_variant['familyGuids'] = family_guids json['savedVariantsByGuid'][ saved_variant['variantGuid']] = saved_variant if searched_variant['variantId'] not in variants_to_saved_variants: variants_to_saved_variants[searched_variant['variantId']] = {} for family_guid in family_guids: variants_to_saved_variants[searched_variant['variantId']][ family_guid] = saved_variant['variantGuid'] if include_discovery_tags: discovery_tags = get_json_for_variant_tags( VariantTag.objects.filter( variant_tag_type__category='CMG Discovery Tags', saved_variants__in=SavedVariant.objects.filter( discovery_variant_q)), include_variant_details=True) if discovery_tags: family_guids = set() for tag in discovery_tags: for variant in tag['variants']: family_guids.update(variant['familyGuids']) families_by_guid = { f.guid: f for f in Family.objects.filter( guid__in=family_guids).prefetch_related('project') } for tag in discovery_tags: for variant in tag.pop('variants'): variant_family = families_by_guid[variant['familyGuids'] [0]] searched_variant = variants_by_id.get( _get_variant_key(genomeVersion=variant_family.project. genome_version, **variant)) if searched_variant: if not searched_variant.get('discoveryTags'): searched_variant['discoveryTags'] = [] tag_json = { 'savedVariant': { 'variantGuid': variant['variantGuid'], 'familyGuid': variant_family.guid, 'projectGuid': variant_family.project.guid, } } tag_json.update(tag) searched_variant['discoveryTags'].append(tag_json) json['familiesByGuid'] = { f['familyGuid']: f for f in _get_json_for_families(families_by_guid.values()) } return json, variants_to_saved_variants