Beispiel #1
0
    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)
Beispiel #2
0
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)
Beispiel #3
0
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 {},
    }
Beispiel #4
0
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()
Beispiel #5
0
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)
Beispiel #6
0
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()
Beispiel #7
0
 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)