diff --git a/odoo-rpc.py b/odoo-rpc.py index c036754..9a8e898 100644 --- a/odoo-rpc.py +++ b/odoo-rpc.py @@ -200,20 +200,74 @@ def login( server = None, port = None, db = None, user = None, passwd = None ): def search( model, domains ): Model = odoo.env[model] ids = Model.search( domains ) - render_tsv( model, Model.browse(ids) ) + # render_tsv( model, Model.browse(ids) ) # print( 'id', 'name', sep='\t' ) # for inst in Model.browse( ids ): # render_tsv( model, inst ) def fields( model, domains ): Model = odoo.env['ir.model.fields'] - ids = Model.search([( 'model_id.model', '=', MODEL )]) - render_tsv( MODEL, Model.browse(ids) ) + ids = Model.search([( 'model_id.model', '=', model )]) + render_tsv( model, Model.browse(ids) ) +stack = [] current_exports = [] +def json_path( model, id ): + return "%s/%s/%s.json" % ( FOLDER, model, id ) + +def lookup( model, domains ): + print( "> Lookup: %s %s" % (model,domains) ) + if model in MODEL_IGNORE: + print( 'IGNORED' ) + return + Model = odoo.env[model] + ids = Model.search( domains ) + rfields = rel_fields( model ) + eprint( rfields ) + + for inst in Model.browse( ids ): + data = inst.read()[0] + size = len( json.dumps(data, indent=4) ) + filename = json_path( model, inst.id ) + if filename in stack: + continue + + # print( 'Preparing data for %s' % (filename) ) + stack.append({ 'model': model, 'id': inst.id, 'file': filename, 'data': size }) + + for field in rfields: + #data[field.name] = inst[field.name].read()[0] + #eprint( data[field.name] ) + if field.relation in MODEL_IGNORE: + continue + + if data[field.name]: + tsv( 'Field: ', field.ttype, field.name, field.relation, data[field.name] ) + + if field.ttype == 'many2one': + id = data[field.name][0] + _filename = json_path( field.relation, id ) + print( field.ttype, field.relation, id, _filename ) + if not os.path.exists( _filename ): + lookup( field.relation, [('id','=',id)] ) + else: + print('Already exists %s' % (_filename) ) + + if field.ttype == 'one2many': + for id in data[field.name]: + _filename = json_path( field.relation, id ) + print( field.ttype, field.relation, id, _filename ) + if not os.path.exists( _filename ): + lookup( field.relation, [('id','=',id)] ) + else: + print('Already exists %s' % (_filename) ) + + print( stack ) + + def export_json( model, domains ): - print( "Export to json: %s %s" % (model,domains) ) + print( "> Export to json: %s %s" % (model,domains) ) if model in MODEL_IGNORE: print( 'IGNORED' ) return @@ -286,21 +340,26 @@ if MODEL in odoo.env: if METHOD == 'search': - search( MODEL, args2domains(sys.argv[3:]) ) - #ids = Model.search( args2domains(sys.argv[3:]) ) + # render_tsv( odoo.env[MODEL].browse( odoo.env[MODEL].search( args2domains(PARAMS[2:]) ) ) ) + search( MODEL, args2domains(PARAMS[2:]) ) + render_tsv( 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 = sys.argv[3:] + ids = PARAMS[2:] ids = [ int(s) for s in ids ] #print( ids ) for inst in Model.browse( ids ): jlog( inst.read()[0] ) + if METHOD == 'lookup': + lookup( MODEL, args2domains(PARAMS[2:]) ) + if METHOD == 'export-json': - export_json( MODEL, args2domains(sys.argv[3:]) ) + export_json( MODEL, args2domains(PARAMS[2:]) ) if METHOD == 'fields_get': jlog( Model.fields_get() )