示例#1
0
    async def create_new_user(
            self,
            super_acc: Optional[SuperAccount] = None
    ) -> Tuple[UserAccount, str]:
        if super_acc is None:
            super_acc = await self.create_new_super_account()

        new_acc = UserAccount()

        password = generate_password()
        salt, hashed = hash_password(password)
        new_acc.salt = salt
        new_acc.pword = hashed
        new_acc.super_id = super_acc.super_id
        new_acc.login = generate_uuid4()

        # handle a minuscule chance that the login already exists in the
        # database
        count_user = ("select count(*) "
                      "from user_account u "
                      "where u.login = :login ")
        while (await self.fetch_one(count_user,
                                    login=new_acc.login))['count'] > 0:
            new_acc.login = generate_uuid4()

        query = ("insert into user_account (login, salt, pword, super_id)"
                 "values (:login, :salt, :pword, :super_id)")

        await self.execute(query,
                           login=new_acc.login,
                           salt=new_acc.salt,
                           pword=new_acc.pword,
                           super_id=new_acc.super_id)
        return new_acc, password