diff --git a/odoo-rpc.py b/odoo-rpc.py index 6df4675..48ec767 100755 --- a/odoo-rpc.py +++ b/odoo-rpc.py @@ -12,80 +12,31 @@ import odoorpc # pip install odoorpc #from typing import Iterable # > py38 from collections import Iterable # < py38 +from utils import * from renderers import render, tsv -def eprint(*args, **kwargs): - print(*args, file=sys.stderr, **kwargs) - # CONFIG FOLDER = '/home/dig/odoo-export/datas' -# PARAMS = sys.argv[1:] -PARAMS = [] -OPTS = {} -for param in sys.argv[1:]: - # if param[0] == '-': - # kv = param[1:].split( '=' ) - # if len(kv) == 1: - # OPTS[kv[0]] = False - # else: - # OPTS[kv[0]] = kv[1] - # elif - if param[0] == '+': - kv = param[1:].split( '=' ) - if len(kv) == 1: - OPTS[kv[0]] = True - else: - OPTS[kv[0]] = kv[1] - else: - PARAMS.append( param ) - MODEL_IGNORE = [] with open(".modelignore", "r") as file: for line in file: MODEL_IGNORE.append(line.strip()) -eprint( len(sys.argv), 'argument(s):', PARAMS, OPTS ) -eprint( MODEL_IGNORE ) +# ODOO +# Prepare the connection to the server +# odoo = odoorpc.ODOO('localhost', port=8069) -# def flatten(items): -# """Yield items from any nested iterable; see Reference.""" -# for x in items: -# if isinstance(x, Iterable) and not isinstance(x, (str, bytes)): -# for sub_x in flatten(x): -# yield sub_x -# else: -# yield x - - -def jlog( obj ): - print( json.dumps(obj, indent=4) ) #"\t") ) - -def ensure_dir(d): - if not os.path.exists(d): - os.makedirs(d) - -def args2domains( list ): - domains = [] - while len(list) > 0: - str = list[0] - if str == '&' or str == '|' or str == '!': - domains.append( str ) - list = list[1:] - else: - domains.append( (list[0], list[1], list[2]) ) - list = list[3:] - return domains - -# eprint( args2domains(sys.argv[3:]) ) -#quit() +# Check available databases +# eprint( 'Databases: ', odoo.db.list() ) +#jlog( odoo.db.list() ) odoo = None @@ -111,16 +62,6 @@ def autolog(): return odoo -# Prepare the connection to the server -# odoo = odoorpc.ODOO('localhost', port=8069) - -# Check available databases -# eprint( 'Databases: ', odoo.db.list() ) -#jlog( odoo.db.list() ) - - - - # Simple 'raw' query #user_data = odoo.execute('res.users', 'read', [user.id]) @@ -138,15 +79,6 @@ def autolog(): # Update data through a record #user.name = "Brian Jones" -def file_path( muid, format ): - return "%s/%s.%s" % ( FOLDER, muid, format ) - -def json_path( model, id ): - return "%s/%s.json" % ( FOLDER, Muid(model, id) ) - -def Muid( model, id ): - return "%s/%s" % ( model, id ) - def get_schema( name ): eprint( 'get_schema' ) Model = odoo.env['ir.model'] @@ -468,18 +400,6 @@ def export_json( model, domains ): else: print('Already exists %s' % (_filename) ) -def uniq( arr ): - return list(set(arr)) - -def groupby_model( arr ): - res = {} - for muid in arr: - model, id = muid.split('/') - if not model in res: - res[model] = [] - res[model].append( int(id) ) - return res - def save( model, domains ): force = OPTS['force'] if 'force' in OPTS else False models = flatten_stack( lookup( model, domains ) ) @@ -491,76 +411,104 @@ def save( model, domains ): # AUTO EXEC -MODEL = PARAMS[0] -if len(PARAMS) > 1: - METHOD = PARAMS[1] - -if PARAMS[0] == 'login': - login( *PARAMS[1:] ) - quit() -else: - odoo = autolog() - - -if MODEL in odoo.env: - Model = odoo.env[MODEL] - - - if METHOD == 'search': - # render_tsv( odoo.env[MODEL].browse( odoo.env[MODEL].search( args2domains(PARAMS[2:]) ) ) ) - ids = search( MODEL, args2domains(PARAMS[2:]) ) - render( OPTS, MODEL, Model.browse(ids) ) - #ids = Model.search( args2domains(PARAMS[2:]) ) - #print( 'id', 'name', sep='\t' ) - #for inst in Model.browse( ids ): - # render_tsv( MODEL, inst ) - - if METHOD == 'browse': - ids = PARAMS[2:] - ids = [ int(s) for s in ids ] - #print( ids ) - for inst in Model.browse( ids ): - jlog( inst.read()[0] ) - - if METHOD == 'fields_get': - jlog( Model.fields_get() ) - - if METHOD == 'fields': - res = fields( MODEL, args2domains(PARAMS[2:]) ) - render( OPTS, 'ir.model.fields', res ) - # Model = odoo.env['ir.model.fields'] - # ids = Model.search([( 'model_id.model', '=', MODEL )]) - # render( OPTS, 'ir.model.fields', Model.browse(ids) ) - #for inst in Field.browse( ids ): - # render_tsv( 'ir.model.fields', inst ) - - if METHOD == 'lookup': - jlog( lookup( MODEL, args2domains(PARAMS[2:]) ) ) - - if METHOD == 'lookup-model': - jlog( lookup_model( Muid(MODEL,PARAMS[2]) ) ) - - # if METHOD == 'lookup-recs': - # jlog( lookup_recs( MODEL, args2domains(PARAMS[2:]) ) ) - - if METHOD == 'export-json': - export_json( MODEL, args2domains(PARAMS[2:]) ) - - if METHOD == 'save': - jlog( save( MODEL, args2domains(PARAMS[2:]) ) ) - -elif MODEL == 'db': - if METHOD == 'list': - jlog( odoo.db.list() ) +if __name__ == "__main__": + import sys -elif MODEL == 'schema': - get_schema( METHOD ) + # PARAMS = sys.argv[1:] + PARAMS = [] + OPTS = {} + for param in sys.argv[1:]: + # if param[0] == '-': + # kv = param[1:].split( '=' ) + # if len(kv) == 1: + # OPTS[kv[0]] = False + # else: + # OPTS[kv[0]] = kv[1] + # elif + if param[0] == '+': + kv = param[1:].split( '=' ) + if len(kv) == 1: + OPTS[kv[0]] = True + else: + OPTS[kv[0]] = kv[1] + else: + PARAMS.append( param ) + + + eprint( len(sys.argv), 'argument(s):', PARAMS, OPTS ) + eprint( MODEL_IGNORE ) -# if __name__ == "__main__": -# import sys -# fib(int(sys.argv[1])) \ No newline at end of file + MODEL = PARAMS[0] + if len(PARAMS) > 1: + METHOD = PARAMS[1] + + + + if PARAMS[0] == 'login': + login( *PARAMS[1:] ) + quit() + else: + odoo = autolog() + + + if MODEL in odoo.env: + Model = odoo.env[MODEL] + + + if METHOD == 'search': + # render_tsv( odoo.env[MODEL].browse( odoo.env[MODEL].search( args2domains(PARAMS[2:]) ) ) ) + ids = search( MODEL, args2domains(PARAMS[2:]) ) + render( OPTS, MODEL, Model.browse(ids) ) + #ids = Model.search( args2domains(PARAMS[2:]) ) + #print( 'id', 'name', sep='\t' ) + #for inst in Model.browse( ids ): + # render_tsv( MODEL, inst ) + + if METHOD == 'browse': + ids = PARAMS[2:] + ids = [ int(s) for s in ids ] + #print( ids ) + for inst in Model.browse( ids ): + jlog( inst.read()[0] ) + + if METHOD == 'fields_get': + jlog( Model.fields_get() ) + + if METHOD == 'fields': + res = fields( MODEL, args2domains(PARAMS[2:]) ) + render( OPTS, 'ir.model.fields', res ) + # Model = odoo.env['ir.model.fields'] + # ids = Model.search([( 'model_id.model', '=', MODEL )]) + # render( OPTS, 'ir.model.fields', Model.browse(ids) ) + #for inst in Field.browse( ids ): + # render_tsv( 'ir.model.fields', inst ) + + if METHOD == 'lookup': + jlog( lookup( MODEL, args2domains(PARAMS[2:]) ) ) + + if METHOD == 'lookup-model': + jlog( lookup_model( Muid(MODEL,PARAMS[2]) ) ) + + # if METHOD == 'lookup-recs': + # jlog( lookup_recs( MODEL, args2domains(PARAMS[2:]) ) ) + + if METHOD == 'export-json': + export_json( MODEL, args2domains(PARAMS[2:]) ) + + if METHOD == 'save': + jlog( save( MODEL, args2domains(PARAMS[2:]) ) ) + + elif MODEL == 'db': + if METHOD == 'list': + jlog( odoo.db.list() ) + + + elif MODEL == 'schema': + get_schema( METHOD ) + + diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..ca8f7a4 --- /dev/null +++ b/utils.py @@ -0,0 +1,66 @@ +from __future__ import print_function +import os +# import sys +import json +# import odoorpc # pip install odoorpc +# #from typing import Iterable # > py38 +# from collections import Iterable # < py38 + + + +def eprint(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) + + +# def flatten(items): +# """Yield items from any nested iterable; see Reference.""" +# for x in items: +# if isinstance(x, Iterable) and not isinstance(x, (str, bytes)): +# for sub_x in flatten(x): +# yield sub_x +# else: +# yield x + + +def jlog( obj ): + print( json.dumps(obj, indent=4) ) #"\t") ) + +def ensure_dir(d): + if not os.path.exists(d): + os.makedirs(d) + +def args2domains( list ): + domains = [] + while len(list) > 0: + str = list[0] + if str == '&' or str == '|' or str == '!': + domains.append( str ) + list = list[1:] + else: + domains.append( (list[0], list[1], list[2]) ) + list = list[3:] + return domains + +# eprint( args2domains(sys.argv[3:]) ) + + +def file_path( muid, format ): + return "%s/%s.%s" % ( FOLDER, muid, format ) + +def json_path( model, id ): + return "%s/%s.json" % ( FOLDER, Muid(model, id) ) + +def Muid( model, id ): + return "%s/%s" % ( model, id ) + +def uniq( arr ): + return list(set(arr)) + +def groupby_model( arr ): + res = {} + for muid in arr: + model, id = muid.split('/') + if not model in res: + res[model] = [] + res[model].append( int(id) ) + return res