To control SaaS via external tool built-in XML-RPC can be used.
# Import libs import json import xmlrpclib import requests # Define credentials main_url = 'http://odoo.local' main_db = 'odoo.local' admin_username = 'admin' admin_password = 'admin' # Authenticate common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(main_url)) admin_uid = common.authenticate(main_db, admin_username, admin_password, {}) models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(main_url)) # Signup a user # (would raise error, if user already exists) client_username = 'client-email@example.com' client_name = 'Client Name' client_password = 'Client Password' models.execute_kw(main_db, admin_uid, admin_password, 'res.users', 'signup', [{ 'login': client_username, 'name': client_name, 'password': client_password, }]) # Authenticate the user at Main Database client_uid = common.authenticate(main_db, client_username, client_password, {}) # Get user session at Main Database if needed params = {'db': main_db, 'login': client_username, 'password': client_password} data = json.dumps({'jsonrpc': '2.0', 'method': 'call', 'params': params}) r = requests.post('%s/web/session/authenticate' % main_url, data=data, headers={'Content-Type':'application/json'}) if not r.json()['result']['uid']: raise Exception('Authenticaion failed') client_session_id = r.json()['result']['session_id'] # Create new Client database plan_id = 1 # specify plan you need client_db = 'client.odoo.local' # you can keep client_db empty to generate it automatically # from "DB Names" parameter in Plan's form client_db = False res = models.execute_kw(main_db, admin_uid, admin_password, 'saas_portal.plan', 'create_new_database', [plan_id], {'dbname': client_db, 'user_id':client_uid}) res['url'] # contains url for new database with client's access token. saas_portal_client_id = res['id'] # Configure system data = { # configure addons 'update_addons': [], 'install_addons': ['sale', 'point_of_sale', 'stock', 'access_settings_menu', access_apps'], 'uninstall_addons': [], # grant access to owner 'access_owner_add': ['base.group_sale_manager', 'stock.group_stock_manager', 'access_settings_menu.group_show_settings_menu'], # restrict access for all users 'access_remove': ['access_apps.group_show_modules_menu'], 'params': [ {'key': 'saas_client.max_users', 'value': 10, 'hidden': True} ], } res = models.execute_kw(main_db, admin_uid, admin_password, 'saas.config', 'do_upgrade_database', [data, saas_portal_client_id])
- Be sure, that Portal module is installed at Main Database
- Be sure, that "Allow external users to sign up" option from "Settings/General Settings" is enabled (this option is only available in Debug mode)
- To find new signuped user open "Settings/Users" at Main Database and delete filter "Regular users only"
- don't use trailing slash at main_url
- Access token is expired in one hour
- In case of log out, client has to click "Log in via SaaS Portal". Client will be navigated to Portal database and can use client_username and client_password. After that the client will be returned back to his database. Important thing here, is that the client is not able to use client_password at login page of his database.