def create(request: CreateRequest): user_id = request.id with translate_errors_context("creating user"): if user_id and User.objects(id=user_id).only("id"): raise errors.bad_request.UserIdExists(id=user_id) user = User(**request.to_struct()) user.save(force_insert=True)
def ensure_fixed_user(user: FixedUser, company_id: str, log: Logger): if User.objects(id=user.user_id).first(): return data = attr.asdict(user) data["id"] = user.user_id data["email"] = f"{user.user_id}@example.com" data["role"] = Role.user _ensure_auth_user(user_data=data, company_id=company_id, log=log) return _ensure_backend_user(user.user_id, company_id, user.name)
def set_preferences(call, company_id, req_model): # type: (APICall, str, SetPreferencesRequest) -> Dict assert isinstance(call, APICall) changes = req_model.preferences def invalid_key(_, key, __): if not isinstance(key, str): return True elif key.startswith("$") or "." in key: raise errors.bad_request.FieldsValueError( f"Key {key} is invalid. Keys cannot start with '$' or contain '.'." ) return True remap(changes, visit=invalid_key) base_preferences = get_user_preferences(call) new_preferences = deepcopy(base_preferences) for key, value in changes.items(): try: dpath.new(new_preferences, key, value, separator=".") except Exception: log.exception( 'invalid preferences update for user "{}": key=`%s`, value=`%s`', key, value, ) raise errors.bad_request.InvalidPreferencesUpdate(key=key, value=value) if new_preferences == base_preferences: updated, fields = 0, {} else: with translate_errors_context("updating user preferences"): updated = User.objects(id=call.identity.user, company=company_id).update( upsert=False, preferences=dumps(new_preferences)) return { "updated": updated, "fields": { "preferences": new_preferences } if updated else {}, }
def ensure_fixed_user(user: FixedUser, company_id: str, log: Logger): if User.objects(id=user.user_id).first(): return data = attr.asdict(user) data["id"] = user.user_id data["email"] = f"{user.user_id}@example.com" data["role"] = Role.user _ensure_auth_user(user_data=data, company_id=company_id, log=log) given_name, _, family_name = user.name.partition(" ") User( id=user.user_id, company=company_id, name=user.name, given_name=given_name, family_name=family_name, ).save()
def ensure_fixed_user(user: FixedUser, log: Logger): db_user = User.objects(company=user.company, id=user.user_id).first() if db_user: # noinspection PyBroadException try: log.info(f"Updating user name: {user.name}") given_name, _, family_name = user.name.partition(" ") db_user.update(name=user.name, given_name=given_name, family_name=family_name) except Exception: pass return data = attr.asdict(user) data["id"] = user.user_id data["email"] = f"{user.user_id}@example.com" data["role"] = Role.guest if user.is_guest else Role.user _ensure_auth_user(user_data=data, company_id=user.company, log=log) return _ensure_backend_user(user.user_id, user.company, user.name)
def get_user(call, user_id, only=None): """ Get user object by the user's ID :param call: API call :param user_id: user ID :param only: fields to include in projection, by default all :return: User object """ if call.identity.role in (Role.system, ): # allow system users to get info for all users query = dict(id=user_id) else: query = dict(id=user_id, company=call.identity.company) with translate_errors_context("retrieving user"): user = User.objects(**query) if only: user = user.only(*only) res = user.first() if not res: raise errors.bad_request.InvalidUserId(**query) return res.to_proper_dict()
def delete(user_id: str): with translate_errors_context("deleting user"): res = User.objects(id=user_id).delete() if not res: raise errors.bad_request.InvalidUserId(id=user_id)