Esempio n. 1
0
def update_variant_functional_data_handler(request, variant_guids):
    request_json = json.loads(request.body)

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

    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)

    updated_functional_data = request_json.get('functionalData', [])
    deleted_functional_guids = _delete_removed_tags(
        saved_variants, all_variant_guids, updated_functional_data, tag_type='functionaldata')

    updated_functional_models = []
    for tag in updated_functional_data:
        if tag.get('tagGuid'):
            functional_data = VariantFunctionalData.objects.get(guid=tag.get('tagGuid'))
            update_model_from_json(functional_data, tag, allow_unknown_keys=True)
        else:
            functional_data = VariantFunctionalData.objects.create(
                functional_data_tag=tag.get('name'),
                metadata=tag.get('metadata'),
                search_hash=request_json.get('searchHash'),
                created_by=request.user,
            )
            functional_data.saved_variants.set(saved_variants)
        updated_functional_models.append(functional_data)

    functional_updates = {tag['tagGuid']: tag for tag in get_json_for_variant_functional_data_tags(updated_functional_models)}
    functional_updates.update({guid: None for guid in deleted_functional_guids})

    return create_json_response({
        'savedVariantsByGuid': {saved_variant.guid: {
            'functionalDataGuids': [t.guid for t in saved_variant.variantfunctionaldata_set.all()],
        } for saved_variant in saved_variants},
        'variantFunctionalDataByGuid': functional_updates,
    })
Esempio n. 2
0
 def test_json_for_variant_functional_data(self):
     tags = VariantFunctionalData.objects.all()[:1]
     json = get_json_for_variant_functional_data_tags(tags)[0]
     self.assertSetEqual(set(json.keys()), FUNCTIONAL_FIELDS)