def _get_calnet_users(app, id_type, ids): cached_users = fetch_bulk( [f'calnet_user_for_{id_type}_{_id}' for _id in ids]) users_by_id = { k.replace(f'calnet_user_for_{id_type}_', ''): v for k, v in cached_users.items() } uncached_ids = [c for c in ids if c not in users_by_id] calnet_client = calnet.client(app) if id_type == 'uid': calnet_results = calnet_client.search_uids(uncached_ids) elif id_type == 'csid': calnet_results = calnet_client.search_csids(uncached_ids) else: raise InternalServerError( f'get_calnet_users: {id_type} is an invalid id type') # Cache rows individually so that an isolated conflict doesn't sink the rest of the update. for _id in uncached_ids: calnet_result = next((r for r in calnet_results if r[id_type] == _id), None) feed = { **_calnet_user_api_feed(calnet_result), **{ id_type: _id }, } insert_row(f'calnet_user_for_{id_type}_{_id}', feed) users_by_id[_id] = feed return users_by_id
def create(cls, uid, name, filter_criteria, **kwargs): if all(not isinstance(value, bool) and not value for value in filter_criteria.values()): raise InternalServerError( 'Cohort creation requires at least one filter specification.') cohort = cls(name=name, filter_criteria=filter_criteria) user = AuthorizedUser.find_by_uid(uid) user.cohort_filters.append(cohort) db.session.flush() std_commit() return cohort.to_api_json(**kwargs)
def create(cls, uid, label, **kwargs): at_least_one_is_defined = False filter_criteria = {} for k, v in kwargs.items(): at_least_one_is_defined = at_least_one_is_defined or ( len(v) if isinstance(v, list) else v is not None) filter_criteria[util.camelize(k)] = v if not at_least_one_is_defined: raise InternalServerError( 'Cohort creation requires at least one filter specification.') cohort = CohortFilter(label=label, filter_criteria=filter_criteria) user = AuthorizedUser.find_by_uid(uid) user.cohort_filters.append(cohort) db.session.flush() std_commit() return cohort