예제 #1
0
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,
    })
예제 #2
0
 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)
예제 #3
0
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