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