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)
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
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
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) })
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)
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
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)
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()
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])