#!/usr/bin/env python3 import xmlrpc.client import argparse, sys, os, ast from urllib.parse import urlparse example_text = """ example: odooctl --model 'res.partner' --domain "('id', '=', 66)" --field 'name' --value Test """ parser = argparse.ArgumentParser( prog='odooctl', description='Update Odoo records using the XML-RPC API.', epilog=example_text, ) # Define arguments parser.add_argument('--model', help='Name of model in format "res.partner"') parser.add_argument('--domain', help='Domain in format [("field", "operator", "value"), ...]') parser.add_argument('--field', help='Field name of model to write or read') parser.add_argument('--method', help='Methods are: create, write, read, search_count, search_one, unlink') parser.add_argument('--value', help='Value to write') # Parse arguments args = parser.parse_args() # Show help if no command is given if not any(vars(args).values()): parser.print_help() sys.exit() # Get environment variables url = os.environ.get('ODOO_URL') or 'http://localhost:8069' db = os.environ.get('ODOO_DATABASE') or 'odoo' username = os.getenv('ODOO_USERNAME') or 'admin' password = os.environ.get('ODOO_PASSWORD') or 'admin' # Connect common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url)) uid = common.authenticate(db, username, password, {}) models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url)) # Check permissions models.execute_kw(db, uid, password, args.model, 'check_access_rights', ['read'], {'raise_exception': False}) # Parse domain and value if args.domain: domain = ast.literal_eval(args.domain) if args.domain else False if args.value: value = ast.literal_eval(args.value) # Execute method if args.method == 'create': models.execute_kw(db, uid, password, args.model, args.method, [value]) if args.method == 'write': ids = models.execute_kw(db, uid, password, args.model, 'search', [domain]) models.execute_kw(db, uid, password, args.model, 'write', [ids, {args.field: value}]) if args.method == 'read': ids = models.execute_kw(db, uid, password, args.model, 'search', [domain], {'limit': 1}) res = models.execute_kw(db, uid, password, args.model, 'read', [ids]) print(res[0][args.field]) if args.method == 'search_count': count = models.execute_kw(db, uid, password, args.model, 'search_count', [domain]) print(count) if args.method == 'search_one': ids = models.execute_kw(db, uid, password, args.model, 'search', [domain]) print(ids[0]) if args.method == 'unlink': ids = models.execute_kw(db, uid, password, args.model, 'search', [domain]) models.execute_kw(db, uid, password, args.model, 'unlink', [ids])