예제 #1
0
    def insert(self):
        g2 = self._session.query(Group).filter(
            Group.group_name == "trusted-users").one()

        lawrence = User()
        lawrence.display_name = "Lawrence L."
        lawrence.email = "*****@*****.**"
        lawrence.password = "******"
        self._session.add(lawrence)
        g2.users.append(lawrence)

        bob = User()
        bob.display_name = "Bob i."
        bob.email = "*****@*****.**"
        bob.password = "******"
        self._session.add(bob)
        g2.users.append(bob)

        g1 = self._session.query(Group).filter(
            Group.group_name == "users").one()
        reader = User()
        reader.display_name = "John Reader"
        reader.email = "*****@*****.**"
        reader.password = "******"
        self._session.add(reader)
        g1.users.append(reader)
예제 #2
0
    def insert(self):
        g2 = self._session.query(Group).\
            filter(Group.group_name == 'trusted-users').one()

        lawrence = User()
        lawrence.display_name = 'Lawrence L.'
        lawrence.email = '*****@*****.**'
        lawrence.password = '******'
        self._session.add(lawrence)
        g2.users.append(lawrence)

        bob = User()
        bob.display_name = 'Bob i.'
        bob.email = '*****@*****.**'
        bob.password = '******'
        self._session.add(bob)
        g2.users.append(bob)

        g1 = self._session.query(Group).\
            filter(Group.group_name == 'users').one()
        reader = User()
        reader.display_name = 'John Reader'
        reader.email = '*****@*****.**'
        reader.password = '******'
        self._session.add(reader)
        g1.users.append(reader)
예제 #3
0
    def insert(self):
        g2 = self._session.query(Group).\
            filter(Group.group_name == 'trusted-users').one()

        lawrence = User()
        lawrence.display_name = 'Lawrence L.'
        lawrence.email = '*****@*****.**'
        lawrence.password = '******'
        self._session.add(lawrence)
        g2.users.append(lawrence)

        bob = User()
        bob.display_name = 'Bob i.'
        bob.email = '*****@*****.**'
        bob.password = '******'
        self._session.add(bob)
        g2.users.append(bob)

        g1 = self._session.query(Group).\
            filter(Group.group_name == 'users').one()
        reader = User()
        reader.display_name = 'John Reader'
        reader.email = '*****@*****.**'
        reader.password = '******'
        self._session.add(reader)
        g1.users.append(reader)
예제 #4
0
    def insert(self):

        lawrence = User()
        lawrence.display_name = "Lawrence L."
        lawrence.email = "*****@*****.**"
        lawrence.password = "******"
        lawrence.profile = Profile.TRUSTED_USER
        lawrence.config = UserConfig()
        self._session.add(lawrence)

        bob = User()
        bob.display_name = "Bob i."
        bob.username = "******"
        bob.email = "*****@*****.**"
        bob.password = "******"
        bob.profile = Profile.TRUSTED_USER
        bob.config = UserConfig()
        self._session.add(bob)

        reader = User()
        reader.display_name = "John Reader"
        reader.email = "*****@*****.**"
        reader.password = "******"
        reader.profile = Profile.USER
        reader.config = UserConfig()
        self._session.add(reader)
예제 #5
0
    def insert(self):
        u = User()
        u.display_name = "Global manager"
        u.email = "*****@*****.**"
        u.password = "******"
        self._session.add(u)

        g1 = Group()
        g1.group_id = 1
        g1.group_name = "users"
        g1.display_name = "Users"
        g1.users.append(u)
        self._session.add(g1)

        g2 = Group()
        g2.group_id = 2
        g2.group_name = "trusted-users"
        g2.display_name = "Trusted Users"
        g2.users.append(u)
        self._session.add(g2)

        g3 = Group()
        g3.group_id = 3
        g3.group_name = "administrators"
        g3.display_name = "Administrators"
        g3.users.append(u)
        self._session.add(g3)
예제 #6
0
    def create_minimal_user(self, email, groups=[], save_now=False) -> User:
        """Previous create_user method"""
        validator = TracimValidator()
        validator.add_validator('email', email, user_email_validator)
        validator.validate_all()
        self._check_email(email)
        user = User()
        user.email = email
        # TODO - G.M - 2018-11-29 - Check if this default_value can be
        # incorrect according to user_public_name_validator
        user.display_name = email.split('@')[0]
        user.created = datetime.datetime.utcnow()
        if not groups:
            gapi = GroupApi(
                current_user=self._user,  # User
                session=self._session,
                config=self._config,
            )
            groups = [gapi.get_one(Group.TIM_USER)]
        for group in groups:
            user.groups.append(group)

        self._session.add(user)

        if save_now:
            self._session.flush()

        return user
예제 #7
0
    def insert(self):
        u = User()
        u.display_name = 'Global manager'
        u.email = '*****@*****.**'
        u.password = '******'
        self._session.add(u)
        uapi = UserApi(session=self._session,
                       config=self._config,
                       current_user=u)
        uapi.execute_created_user_actions(u)

        g1 = Group()
        g1.group_id = 1
        g1.group_name = 'users'
        g1.display_name = 'Users'
        g1.users.append(u)
        self._session.add(g1)

        g2 = Group()
        g2.group_id = 2
        g2.group_name = 'trusted-users'
        g2.display_name = 'Trusted Users'
        g2.users.append(u)
        self._session.add(g2)

        g3 = Group()
        g3.group_id = 3
        g3.group_name = 'administrators'
        g3.display_name = 'Administrators'
        g3.users.append(u)
        self._session.add(g3)
예제 #8
0
파일: user.py 프로젝트: tracim/tracim
    def create_minimal_user(
            self,
            email,
            groups=[],
            save_now=False
    ) -> User:
        """Previous create_user method"""
        validator = TracimValidator()
        validator.add_validator('email', email, user_email_validator)
        validator.validate_all()
        self._check_email(email)
        user = User()
        user.email = email
        # TODO - G.M - 2018-11-29 - Check if this default_value can be
        # incorrect according to user_public_name_validator
        user.display_name = email.split('@')[0]
        user.created = datetime.datetime.utcnow()
        if not groups:
            gapi = GroupApi(
                current_user=self._user,  # User
                session=self._session,
                config=self._config,
            )
            groups = [gapi.get_one(Group.TIM_USER)]
        for group in groups:
            user.groups.append(group)

        self._session.add(user)

        if save_now:
            self._session.flush()

        return user
예제 #9
0
    def create_minimal_user(self,
                            email,
                            profile: typing.Optional[Profile] = None,
                            save_now=False) -> User:
        """Previous create_user method"""
        lowercase_email = email.lower() if email is not None else None
        validator = TracimValidator()
        validator.add_validator("email", lowercase_email, user_email_validator)
        validator.validate_all()
        self._check_email(lowercase_email)
        user = User()
        user.email = lowercase_email
        # TODO - G.M - 2018-11-29 - Check if this default_value can be
        # incorrect according to user_public_name_validator
        user.display_name = email.split("@")[0]
        user.created = datetime.datetime.utcnow()
        if not profile:
            profile = Profile.get_profile_from_slug(
                self._config.USER__DEFAULT_PROFILE)
        user.profile = profile

        self._session.add(user)

        if save_now:
            self._session.flush()

        return user
예제 #10
0
 def insert(self):
     u = User()
     u.display_name = "Global manager"
     u.email = "*****@*****.**"
     u.password = "******"
     u.profile = Profile.ADMIN
     self._session.add(u)
예제 #11
0
    def insert(self):
        u = User()
        u.display_name = 'Global manager'
        u.email = '*****@*****.**'
        u.password = '******'
        self._session.add(u)
        uapi = UserApi(
            session=self._session,
            config=self._config,
            current_user=u)
        uapi.execute_created_user_actions(u)

        g1 = Group()
        g1.group_id = 1
        g1.group_name = 'users'
        g1.display_name = 'Users'
        g1.users.append(u)
        self._session.add(g1)

        g2 = Group()
        g2.group_id = 2
        g2.group_name = 'trusted-users'
        g2.display_name = 'Trusted Users'
        g2.users.append(u)
        self._session.add(g2)

        g3 = Group()
        g3.group_id = 3
        g3.group_name = 'administrators'
        g3.display_name = 'Administrators'
        g3.users.append(u)
        self._session.add(g3)
예제 #12
0
    def test_unit__repr__ok__with_username(self):
        user = User()
        user.display_name = "Damien"
        user.email = "*****@*****.**"
        user.username = "******"

        assert user.__repr__(
        ) == "<User: email='*****@*****.**', username='******' display='Damien'>"
예제 #13
0
    def test_unit__unicode__ok__nominal_case(self):
        name = "Damien"
        email = "*****@*****.**"

        user = User()
        user.display_name = name
        user.email = email

        assert user.__unicode__() == name
예제 #14
0
파일: test_user.py 프로젝트: tracim/tracim
    def test_unit__unicode__ok__nominal_case(self):
        name = 'Damien'
        email = '*****@*****.**'

        user = User()
        user.display_name = name
        user.email = email

        assert user.__unicode__() == name
예제 #15
0
파일: test_user.py 프로젝트: uggla/tracim
    def test_unit__repr__ok__nominal_case(self):
        name = 'Damien'
        email = '*****@*****.**'

        user = User()
        user.display_name = name
        user.email = email

        assert user.__repr__() == "<User: email='*****@*****.**', display='Damien'>"  # nopep8
예제 #16
0
 def insert(self):
     u = User()
     u.display_name = "Global manager"
     u.username = "******"
     u.email = "*****@*****.**"
     u.password = "******"
     u.profile = Profile.ADMIN
     u.config = UserConfig()
     self._session.add(u)
예제 #17
0
    def test_unit__repr__ok__nominal_case(self):
        name = "Damien"
        email = "*****@*****.**"

        user = User()
        user.display_name = name
        user.email = email

        assert user.__repr__(
        ) == "<User: email='*****@*****.**', username=None display='Damien'>"
예제 #18
0
 def test_unit__create_minimal_user_and_set_email__ok__nominal_case(self):
     u = User()
     u.email = "bob@bob"
     u.password = "******"
     u.auth_type = AuthType.INTERNAL
     u.display_name = "bob"
     api = UserApi(current_user=u, session=self.session, config=self.app_config)
     assert u.email == "bob@bob"
     api.set_email(u, "pass", "newbobemail@bob")
     assert u is not None
     assert u.email == "newbobemail@bob"
예제 #19
0
파일: test_user.py 프로젝트: tracim/tracim
    def test_unit__validate_password__false__null_password(self):
        # Check bug #70 fixed
        # http://tracim.org/workspaces/4/folders/5/threads/70

        name = 'Damien'
        email = '*****@*****.**'

        user = User()
        user.display_name = name
        user.email = email

        assert user.validate_password('') is False
예제 #20
0
    def test_unit__validate_password__false__null_password(self):
        # Check bug #70 fixed
        # http://tracim.org/workspaces/4/folders/5/threads/70

        name = "Damien"
        email = "*****@*****.**"

        user = User()
        user.display_name = name
        user.email = email

        assert user.validate_password("") is False
예제 #21
0
    def test_unit__validate_password__false__bad_password(self):
        """
        Check if validate_password can correctly check if password is
        an uncorrect correct one
        """
        name = 'Damien'
        email = '*****@*****.**'
        password = '******'

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password('uncorrect_password') is False
예제 #22
0
    def test_unit__validate_password__false__bad_password(self):
        """
        Check if validate_password can correctly check if password is
        an uncorrect correct one
        """
        name = "Damien"
        email = "*****@*****.**"
        password = "******"

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password("uncorrect_password") is False
예제 #23
0
파일: test_user.py 프로젝트: tracim/tracim
    def test_unit__validate_password__false__empty_password(self):
        """
        Check if validate_password failed if not password
        """
        name = 'Damien'
        email = '*****@*****.**'
        password = None

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password(password) is False
        assert user.validate_password('') is False
예제 #24
0
 def test_unit__create_minimal_user_and_set_password__ok__nominal_case(self):
     u = User()
     u.email = 'bob@bob'
     u.password = '******'
     u.auth_type = AuthType.INTERNAL
     u.display_name = 'bob'
     api = UserApi(
         current_user=u,
         session=self.session,
         config=self.app_config,
     )
     assert u.email == 'bob@bob'
     api.set_email(u,'pass','newbobemail@bob')
     assert u is not None
     assert u.email == 'newbobemail@bob'
예제 #25
0
    def test_unit__validate_password__false__empty_password(self):
        """
        Check if validate_password failed if not password
        """
        name = "Damien"
        email = "*****@*****.**"
        password = None

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password(password) is False
        assert user.validate_password("") is False
예제 #26
0
파일: test_user.py 프로젝트: tracim/tracim
    def test_unit__validate_password__false__bad_password(self):
        """
        Check if validate_password can correctly check if password is
        an uncorrect correct one
        """
        name = 'Damien'
        email = '*****@*****.**'
        password = '******'

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password('uncorrect_password') is False
예제 #27
0
 def test_unit__create_minimal_user_and_set_password__ok__nominal_case(
         self):
     u = User()
     u.email = 'bob@bob'
     u.password = '******'
     u.auth_type = AuthType.INTERNAL
     u.display_name = 'bob'
     api = UserApi(
         current_user=u,
         session=self.session,
         config=self.app_config,
     )
     assert u.email == 'bob@bob'
     api.set_email(u, 'pass', 'newbobemail@bob')
     assert u is not None
     assert u.email == 'newbobemail@bob'
예제 #28
0
    def test__unit__validate_password__ok__nominal_case(self):
        """
        Check if validate_password can correctly check if password i the correct
        one
        """

        name = "Damien"
        email = "*****@*****.**"
        password = "******"

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password(password) is True
예제 #29
0
 def test_unit__create_minimal_user_and_set_password__ok__nominal_case(
     self, session, app_config
 ):
     u = User()
     u.email = "bob@bob"
     u.password = "******"
     u.auth_type = AuthType.INTERNAL
     u.display_name = "bob"
     api = UserApi(current_user=u, session=session, config=app_config)
     assert u.validate_password("pass")
     api.set_password(u, "pass", "newpass", "newpass")
     assert u is not None
     assert u.email == "bob@bob"
     assert u.display_name == "bob"
     assert u.validate_password("newpass")
     assert not u.validate_password("pass")
예제 #30
0
파일: test_user.py 프로젝트: tracim/tracim
    def test__unit__validate_password__ok__nominal_case(self):
        """
        Check if validate_password can correctly check if password i the correct
        one
        """

        name = 'Damien'
        email = '*****@*****.**'
        password = '******'

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password(password) is True
예제 #31
0
 def anonymize_user(
         self,
         user: User,
         anonymized_user_display_name: typing.Optional[str] = None) -> User:
     """
     :param user: user to anonymize_if_required
     :return: user_id
     """
     hash = str(uuid.uuid4().hex)
     user.display_name = (
         anonymized_user_display_name
         or self.app_config.DEFAULT_ANONYMIZED_USER_DISPLAY_NAME)
     user.email = ANONYMIZED_USER_EMAIL_PATTERN.format(hash=hash)
     user.is_active = False
     user.is_deleted = True
     self.safe_update(user)
     return user
예제 #32
0
파일: test_user.py 프로젝트: tracim/tracim
    def test_unit__password__ok__nominal_case(self):
        """
        Check if password can be set and hashed password
        can be retrieve. Verify if hashed password is not
        same as password.
        """
        name = 'Damien'
        email = '*****@*****.**'
        password = '******'

        user = User()
        user.display_name = name
        user.email = email
        assert user._password is None
        user.password = password
        assert user._password is not None
        assert user._password != password
        assert user.password == user._password
예제 #33
0
    def test_unit__password__ok__nominal_case(self, session):
        """
        Check if password can be set and hashed password
        can be retrieve. Verify if hashed password is not
        same as password.
        """
        name = "Damien"
        email = "*****@*****.**"
        password = "******"

        user = User()
        user.display_name = name
        user.email = email
        assert user._password is None
        user.password = password
        assert user._password is not None
        assert user._password != password
        assert user.password == user._password
예제 #34
0
파일: user.py 프로젝트: tracim/tracim_v2
    def update(
        self,
        user: User,
        name: str = None,
        email: str = None,
        password: str = None,
        timezone: str = None,
        lang: str = None,
        groups: typing.Optional[typing.List[Group]] = None,
        do_save=True,
    ) -> User:
        if name is not None:
            user.display_name = name

        if email is not None and email != user.email:
            self._check_email(email)
            user.email = email

        if password is not None:
            user.password = password

        if timezone is not None:
            user.timezone = timezone

        if lang is not None:
            user.lang = lang

        if groups is not None:
            if self._user and self._user == user:
                raise UserCantChangeIsOwnProfile(
                    "User {} can't change is own profile".format(user.user_id))
            # INFO - G.M - 2018-07-18 - Delete old groups
            for group in user.groups:
                if group not in groups:
                    user.groups.remove(group)
            # INFO - G.M - 2018-07-18 - add new groups
            for group in groups:
                if group not in user.groups:
                    user.groups.append(group)

        if do_save:
            self.save(user)

        return user
예제 #35
0
파일: test_user.py 프로젝트: tracim/tracim
    def test_unit__create__ok__nominal_case(self):
        self.session.flush()
        transaction.commit()
        name = 'Damien'
        email = '*****@*****.**'

        user = User()
        user.display_name = name
        user.email = email

        self.session.add(user)
        self.session.flush()
        transaction.commit()

        new_user = self.session.query(User).filter(User.display_name == name).one()  # nopep8

        assert new_user.display_name == name
        assert new_user.email == email
        assert new_user.email_address == email
예제 #36
0
    def test_unit__create__ok__nominal_case(self, session):
        session.flush()
        transaction.commit()
        name = "Damien"
        email = "*****@*****.**"

        user = User()
        user.display_name = name
        user.email = email

        session.add(user)
        session.flush()
        transaction.commit()

        new_user = session.query(User).filter(User.display_name == name).one()

        assert new_user.display_name == name
        assert new_user.email == email
        assert new_user.email_address == email
예제 #37
0
    def test_unit__crud_caller__ok__user(self, session):
        hook = UserHookImpl()
        session.context.plugin_manager.register(hook)
        user = User(email="foo@bar")
        session.add(user)
        session.flush()
        hook.mock_hooks.assert_called_with("created",
                                           user=user,
                                           context=session.context)

        user.display_name = "John doe"
        session.flush()
        hook.mock_hooks.assert_called_with("modified",
                                           user=user,
                                           context=session.context)

        session.delete(user)
        session.flush()
        hook.mock_hooks.assert_called_with("deleted",
                                           user=user,
                                           context=session.context)
예제 #38
0
파일: user.py 프로젝트: inkhey/tracim
    def create_minimal_user(
        self,
        email: typing.Optional[str] = None,
        username: typing.Optional[str] = None,
        profile: typing.Optional[Profile] = None,
        save_now=False,
    ) -> User:
        """Previous create_user method"""
        if not email:
            if self._config.EMAIL__REQUIRED:
                raise EmailRequired("Email is required to create an user")
            if not username:
                raise EmailOrUsernameRequired(
                    "Email or username is required to create an user")
        lowercase_email = email.lower() if email is not None else None
        validator = TracimValidator()
        validator.add_validator("email", lowercase_email, user_email_validator)
        validator.validate_all()
        if lowercase_email is not None:
            self._check_email(lowercase_email)
        if username is not None:
            self.check_username(username)
        user = User()
        user.email = lowercase_email
        user.username = username
        # TODO - G.M - 2018-11-29 - Check if this default_value can be
        # incorrect according to user_public_name_validator
        user.display_name = email.split("@")[0] if email else username
        user.created = datetime.datetime.utcnow()
        if not profile:
            profile = Profile.get_profile_from_slug(
                self._config.USER__DEFAULT_PROFILE)
        user.profile = profile

        if save_now:
            self.save(user)

        return user
예제 #39
0
파일: user.py 프로젝트: tracim/tracim_v2
    def create_minimal_user(self, email, groups=[], save_now=False) -> User:
        """Previous create_user method"""
        self._check_email(email)
        user = User()
        user.email = email
        user.display_name = email.split('@')[0]

        if not groups:
            gapi = GroupApi(
                current_user=self._user,  # User
                session=self._session,
                config=self._config,
            )
            groups = [gapi.get_one(Group.TIM_USER)]
        for group in groups:
            user.groups.append(group)

        self._session.add(user)

        if save_now:
            self._session.flush()

        return user
예제 #40
0
    def update(
        self,
        user: User,
        name: str = None,
        email: str = None,
        password: str = None,
        timezone: str = None,
        lang: str = None,
        auth_type: AuthType = None,
        groups: typing.Optional[typing.List[Group]] = None,
        do_save=True,
    ) -> User:
        validator = TracimValidator()
        validator.add_validator('name', name, user_public_name_validator)
        validator.add_validator('password', password, user_password_validator)
        validator.add_validator('email', email, user_email_validator)
        validator.add_validator('timezone', timezone, user_timezone_validator)
        validator.add_validator('lang', lang, user_lang_validator)
        validator.validate_all()

        if name is not None:
            user.display_name = name

        if auth_type is not None:
            if auth_type not in [
                    AuthType.UNKNOWN, AuthType.REMOTE
            ] and not auth_type in self._config.AUTH_TYPES:
                raise UserAuthTypeDisabled(
                    'Can\'t update user "{}" auth_type with unavailable value "{}".'
                    .format(user.email, auth_type))
            user.auth_type = auth_type

        if email is not None and email != user.email:
            self._check_email_modification_allowed(user)
            self._check_email(email)
            user.email = email

        if password is not None:
            self._check_password_modification_allowed(user)
            user.password = password

        if timezone is not None:
            user.timezone = timezone

        if lang is not None:
            user.lang = lang

        if groups is not None:
            if self._user and self._user == user:
                raise UserCantChangeIsOwnProfile(
                    "User {} can't change is own profile".format(user.user_id))
            # INFO - G.M - 2018-07-18 - Delete old groups
            for group in user.groups:
                if group not in groups:
                    user.groups.remove(group)
            # INFO - G.M - 2018-07-18 - add new groups
            for group in groups:
                if group not in user.groups:
                    user.groups.append(group)

        if do_save:
            self.save(user)

        return user
예제 #41
0
파일: user.py 프로젝트: inkhey/tracim
    def update(
        self,
        user: User,
        name: str = None,
        email: str = None,
        password: str = None,
        timezone: str = None,
        lang: str = None,
        auth_type: AuthType = None,
        profile: typing.Optional[Profile] = None,
        allowed_space: typing.Optional[int] = None,
        username: str = None,
        do_save=True,
    ) -> User:
        """Update given user instance with given parameters"""
        validator = TracimValidator()
        validator.add_validator("name", name, user_public_name_validator)
        validator.add_validator("password", password, user_password_validator)
        validator.add_validator("email", email, user_email_validator)
        validator.add_validator("username", name, user_username_validator)
        validator.add_validator("timezone", timezone, user_timezone_validator)
        validator.add_validator("lang", lang, user_lang_validator)
        validator.validate_all()

        if name is not None:
            user.display_name = name

        if auth_type is not None:
            if (auth_type not in [AuthType.UNKNOWN, AuthType.REMOTE]
                    and auth_type not in self._config.AUTH_TYPES):
                raise UserAuthTypeDisabled(
                    'Can\'t update user "{}" auth_type with unavailable value "{}".'
                    .format(user.login, auth_type))
            user.auth_type = auth_type

        if email is not None:
            lowercase_email = email.lower()
            if lowercase_email != user.email:
                self._check_email_modification_allowed(user)
                self._check_email(lowercase_email)
                user.email = lowercase_email

        if username is not None:
            if username != user.username:
                self.check_username(username)
                user.username = username

        if password is not None:
            self._check_password_modification_allowed(user)
            user.password = password

        if timezone is not None:
            user.timezone = timezone

        if lang is not None:
            user.lang = lang

        if profile is not None:
            if self._user and self._user == user:
                raise UserCantChangeIsOwnProfile(
                    "User {} can't change is own profile".format(user.user_id))
            user.profile = profile

        if allowed_space is not None:
            user.allowed_space = allowed_space

        if do_save:
            self.save(user)

        return user
예제 #42
0
파일: user.py 프로젝트: tracim/tracim
    def update(
            self,
            user: User,
            name: str=None,
            email: str=None,
            password: str=None,
            timezone: str=None,
            lang: str=None,
            auth_type: AuthType = None,
            groups: typing.Optional[typing.List[Group]]=None,
            do_save=True,
    ) -> User:
        validator = TracimValidator()
        validator.add_validator('name', name, user_public_name_validator)
        validator.add_validator('password', password, user_password_validator)
        validator.add_validator('email', email, user_email_validator)
        validator.add_validator('timezone', timezone, user_timezone_validator)
        validator.add_validator('lang', lang, user_lang_validator)
        validator.validate_all()

        if name is not None:
            user.display_name = name

        if auth_type is not None:
            if auth_type not in [AuthType.UNKNOWN, AuthType.REMOTE] and not auth_type in self._config.AUTH_TYPES:
                raise UserAuthTypeDisabled(
                    'Can\'t update user "{}" auth_type with unavailable value "{}".'.format(
                        user.email,
                        auth_type
                    )
                )
            user.auth_type = auth_type

        if email is not None and email != user.email:
            self._check_email_modification_allowed(user)
            self._check_email(email)
            user.email = email

        if password is not None:
            self._check_password_modification_allowed(user)
            user.password = password

        if timezone is not None:
            user.timezone = timezone

        if lang is not None:
            user.lang = lang

        if groups is not None:
            if self._user and self._user == user:
                raise UserCantChangeIsOwnProfile(
                    "User {} can't change is own profile".format(user.user_id)
                )
            # INFO - G.M - 2018-07-18 - Delete old groups
            for group in user.groups:
                if group not in groups:
                    user.groups.remove(group)
            # INFO - G.M - 2018-07-18 - add new groups
            for group in groups:
                if group not in user.groups:
                    user.groups.append(group)

        if do_save:
            self.save(user)

        return user