Esempio n. 1
0
def update_model_from_json(model_obj,
                           json,
                           user=None,
                           verbose=False,
                           allow_unknown_keys=False,
                           immutable_keys=None):
    seqr_update_fields = {}
    internal_fields = model_obj._meta.internal_json_fields if hasattr(
        model_obj._meta, 'internal_json_fields') else []

    for json_key, value in json.items():
        orm_key = _to_snake_case(json_key)
        if orm_key in (immutable_keys or []):
            if allow_unknown_keys:
                continue
            raise ValueError('Cannot edit field {}'.format(orm_key))
        if allow_unknown_keys and not hasattr(model_obj, orm_key):
            continue
        if getattr(model_obj, orm_key) != value:
            if orm_key in internal_fields and not (user and user.is_staff):
                raise ValueError(
                    'User {0} is not authorized to edit the internal field {1}'
                    .format(user, orm_key))
            if verbose:
                model_obj_name = getattr(model_obj, 'guid', model_obj.__name__)
                logger.info("Setting {0}.{1} to {2}".format(
                    model_obj_name, orm_key, value))
            seqr_update_fields[orm_key] = value

    if seqr_update_fields:
        update_seqr_model(model_obj, **seqr_update_fields)
Esempio n. 2
0
def update_model_from_json(model_obj,
                           json,
                           user=None,
                           allow_unknown_keys=False,
                           immutable_keys=None):
    immutable_keys = (immutable_keys or []) + [
        'created_by', 'created_date', 'last_modified_date', 'id'
    ]
    internal_fields = model_obj._meta.internal_json_fields if hasattr(
        model_obj._meta, 'internal_json_fields') else []

    has_updates = False
    for json_key, value in json.items():
        orm_key = _to_snake_case(json_key)
        if orm_key in immutable_keys:
            if allow_unknown_keys:
                continue
            raise ValueError('Cannot edit field {}'.format(orm_key))
        if allow_unknown_keys and not hasattr(model_obj, orm_key):
            continue
        if getattr(model_obj, orm_key) != value:
            if orm_key in internal_fields and not (user and user.is_staff):
                raise PermissionDenied(
                    'User {0} is not authorized to edit the internal field {1}'
                    .format(user, orm_key))
            has_updates = True
            setattr(model_obj, orm_key, value)

    if has_updates:
        model_obj.save()
    return has_updates
Esempio n. 3
0
def _create_xbrowse_model(seqr_model, **kwargs):
    try:
        seqr_model_class = seqr_model.__class__
        seqr_model_class_name = seqr_model_class.__name__
        xbrowse_kwargs = convert_seqr_kwargs_to_xbrowse_kwargs(
            seqr_model, **kwargs)
        xbrowse_model_class = SEQR_TO_XBROWSE_CLASS_MAPPING[
            seqr_model_class_name]
        xbrowse_model_class_name = xbrowse_model_class.__name__
        logging.info("_create_xbrowse_model(%s, %s)" %
                     (xbrowse_model_class_name, xbrowse_kwargs))
        xbrowse_model = xbrowse_model_class.objects.create(**xbrowse_kwargs)

        seqr_model_foreign_key_name = "seqr_" + _to_snake_case(
            seqr_model_class_name)
        if hasattr(xbrowse_model, seqr_model_foreign_key_name):
            setattr(xbrowse_model, seqr_model_foreign_key_name, seqr_model)
            xbrowse_model.save()
        return xbrowse_model

    except Exception as e:
        logging.error("ERROR: error when creating xbrowse model %s: %s" %
                      (seqr_model, e))
        traceback.print_exc()
        return None
Esempio n. 4
0
def update_individual_hpo_terms(request, individual_guid):
    """Updates features fields for the given Individual
    """

    individual = Individual.objects.get(guid=individual_guid)

    project = individual.family.project

    check_project_permissions(project, request.user, can_edit=True)

    request_json = json.loads(request.body)

    for feature_key in [
            'features', 'absentFeatures', 'nonstandardFeatures',
            'absentNonstandardFeatures'
    ]:
        orm_key = _to_snake_case(feature_key)
        value = [get_parsed_feature(feature) for feature in request_json[feature_key]] \
            if request_json.get(feature_key) else None
        setattr(individual, orm_key, value)
    individual.save()

    return create_json_response({
        individual.guid:
        _get_json_for_individual(individual,
                                 request.user,
                                 add_hpo_details=True)
    })
Esempio n. 5
0
def update_model_from_json(model_obj, json, user=None, verbose=False, allow_unknown_keys=False, immutable_keys=None, conditional_edit_keys=None):
    immutable_keys = (immutable_keys or []) + ['created_by', 'created_date', 'last_modified_date', 'id']
    seqr_update_fields = {}
    internal_fields = model_obj._meta.internal_json_fields if hasattr(model_obj._meta, 'internal_json_fields') else []

    for json_key, value in json.items():
        orm_key = _to_snake_case(json_key)
        if orm_key in immutable_keys:
            if allow_unknown_keys:
                continue
            raise ValueError('Cannot edit field {}'.format(orm_key))
        if allow_unknown_keys and not hasattr(model_obj, orm_key):
            continue
        if getattr(model_obj, orm_key) != value:
            if orm_key in internal_fields and not (user and user.is_staff):
                raise ValueError('User {0} is not authorized to edit the internal field {1}'.format(user, orm_key))
            if conditional_edit_keys and orm_key in conditional_edit_keys:
                conditional_edit_keys[orm_key](model_obj)
            if verbose:
                model_obj_name = getattr(model_obj, 'guid', None) or model_obj.__name__
                logger.info("Setting {0}.{1} to {2}".format(model_obj_name, orm_key, value))
            seqr_update_fields[orm_key] = value

    if seqr_update_fields:
        update_seqr_model(model_obj, **seqr_update_fields)
Esempio n. 6
0
def _create_xbrowse_model(seqr_model, **kwargs):
    try:
        seqr_model_class = seqr_model.__class__
        seqr_model_class_name = seqr_model_class.__name__
        xbrowse_kwargs = convert_seqr_kwargs_to_xbrowse_kwargs(seqr_model, **kwargs)
        xbrowse_model_class = SEQR_TO_XBROWSE_CLASS_MAPPING[seqr_model_class_name]
        xbrowse_model_class_name = xbrowse_model_class.__name__
        logging.info("_create_xbrowse_model(%s, %s)" % (xbrowse_model_class_name, xbrowse_kwargs))
        xbrowse_model = xbrowse_model_class.objects.create(**xbrowse_kwargs)

        seqr_model_foreign_key_name = "seqr_"+_to_snake_case(seqr_model_class_name)
        if hasattr(xbrowse_model, seqr_model_foreign_key_name):
            setattr(xbrowse_model, seqr_model_foreign_key_name, seqr_model)
            xbrowse_model.save()
        return xbrowse_model

    except Exception as e:
        logging.error("ERROR: error when creating xbrowse model %s: %s" % (seqr_model, e))
        traceback.print_exc()
        return None
Esempio n. 7
0
def update_model_from_json(model_obj,
                           json,
                           user,
                           allow_unknown_keys=False,
                           immutable_keys=None,
                           updated_fields=None,
                           verbose=True):
    immutable_keys = (immutable_keys or []) + [
        'created_by', 'created_date', 'last_modified_date', 'id'
    ]
    internal_fields = model_obj._meta.internal_json_fields if hasattr(
        model_obj._meta, 'internal_json_fields') else []

    if not updated_fields:
        updated_fields = set()
    for json_key, value in json.items():
        orm_key = _to_snake_case(json_key)
        if orm_key in immutable_keys:
            if allow_unknown_keys:
                continue
            raise ValueError('Cannot edit field {}'.format(orm_key))
        if allow_unknown_keys and not hasattr(model_obj, orm_key):
            continue
        if getattr(model_obj, orm_key) != value:
            if orm_key in internal_fields and not user_is_analyst(user):
                raise PermissionDenied(
                    'User {0} is not authorized to edit the internal field {1}'
                    .format(user, orm_key))
            updated_fields.add(orm_key)
            setattr(model_obj, orm_key, value)

    if updated_fields:
        model_obj.save()
        if verbose:
            log_model_update(logger, model_obj, user, 'update', updated_fields)
    return bool(updated_fields)
Esempio n. 8
0
def update_model_from_json(model_obj,
                           json,
                           user=None,
                           verbose=False,
                           allow_unknown_keys=False,
                           immutable_keys=None,
                           conditional_edit_keys=None):
    immutable_keys = (immutable_keys or []) + [
        'created_by', 'created_date', 'last_modified_date', 'id'
    ]
    internal_fields = model_obj._meta.internal_json_fields if hasattr(
        model_obj._meta, 'internal_json_fields') else []

    for json_key, value in json.items():
        orm_key = _to_snake_case(json_key)
        if orm_key in immutable_keys:
            if allow_unknown_keys:
                continue
            raise ValueError('Cannot edit field {}'.format(orm_key))
        if allow_unknown_keys and not hasattr(model_obj, orm_key):
            continue
        if getattr(model_obj, orm_key) != value:
            if orm_key in internal_fields and not (user and user.is_staff):
                raise ValueError(
                    'User {0} is not authorized to edit the internal field {1}'
                    .format(user, orm_key))
            if conditional_edit_keys and orm_key in conditional_edit_keys:
                conditional_edit_keys[orm_key](model_obj)
            if verbose:
                model_obj_name = getattr(model_obj, 'guid',
                                         None) or model_obj.__name__
                logger.info("Setting {0}.{1} to {2}".format(
                    model_obj_name, orm_key, value))
            setattr(model_obj, orm_key, value)

    model_obj.save()
Esempio n. 9
0
def _update_individual_phenotips_fields(indiv, phenotips_json):
    if phenotips_json.get('date_of_birth'):
        indiv.birth_year = datetime.strptime(phenotips_json['date_of_birth'],
                                             '%Y-%m-%d').year
    if phenotips_json.get('life_status') == 'deceased':
        indiv.death_year = datetime.strptime(phenotips_json['date_of_death'], '%Y-%m-%d').year \
            if phenotips_json.get('date_of_death') else 0

    if phenotips_json.get('global_age_of_onset'):
        onset_label = phenotips_json['global_age_of_onset'][0]['label']
        indiv.onset_age = seqr.models.Individual.ONSET_AGE_REVERSE_LOOKUP[
            onset_label]
    if phenotips_json.get('global_mode_of_inheritance'):
        indiv.expected_inheritance = [
            seqr.models.Individual.INHERITANCE_REVERSE_LOOKUP[i['label']]
            for i in phenotips_json['global_mode_of_inheritance']
        ]

    if phenotips_json['ethnicity']['maternal_ethnicity']:
        indiv.maternal_ethnicity = phenotips_json['ethnicity'][
            'maternal_ethnicity']
    if phenotips_json['ethnicity']['paternal_ethnicity']:
        indiv.paternal_ethnicity = phenotips_json['ethnicity'][
            'paternal_ethnicity']

    family_history = phenotips_json.get('family_history') or {}
    if family_history.get('consanguinity') is not None:
        indiv.consanguinity = family_history['consanguinity']
    if family_history.get('affectedRelatives') is not None:
        indiv.affected_relatives = family_history['affectedRelatives']

    present_features = []
    absent_features = []
    nonstandard_features = []
    absent_nonstandard_features = []
    for feature in phenotips_json.get('features') or []:
        feature_list = present_features if feature[
            'observed'] == 'yes' else absent_features
        feature_list.append(get_parsed_feature(feature))
    for feature in phenotips_json.get('nonstandard_features') or []:
        feature_list = nonstandard_features if feature[
            'observed'] == 'yes' else absent_nonstandard_features
        feature_list.append(
            get_parsed_feature(feature,
                               feature_id=feature['label'],
                               additional_fields=['categories']))
    if present_features:
        indiv.features = present_features
    if absent_features:
        indiv.absent_features = absent_features
    if nonstandard_features:
        indiv.nonstandard_features = nonstandard_features
    if absent_nonstandard_features:
        indiv.absent_nonstandard_features = absent_nonstandard_features

    if phenotips_json.get('disorders'):
        mim_ids = map(lambda d: int(d['id'].lstrip('MIM:')),
                      phenotips_json['disorders'])
        indiv.disorders = mim_ids

    if phenotips_json.get('genes'):
        indiv.candidate_genes = phenotips_json['genes']
    if phenotips_json.get('rejectedGenes'):
        indiv.rejected_genes = phenotips_json['rejectedGenes']

    prenatal = phenotips_json['prenatal_perinatal_history']
    for field in [
            'assistedReproduction_fertilityMeds',
            'assistedReproduction_iui',
            'ivf',
            'icsi',
            'assistedReproduction_surrogacy',
            'assistedReproduction_donoregg',
            'assistedReproduction_donorsperm',
    ]:
        if prenatal.get(field) is not None:
            indiv_field = 'ar_{}'.format(
                _to_snake_case(field.replace('assistedReproduction_', '')))
            setattr(indiv, indiv_field, prenatal[field])