diff --git a/examples/basic.py b/examples/basic.py index b0c16b2..d74c61f 100644 --- a/examples/basic.py +++ b/examples/basic.py @@ -1,6 +1,7 @@ +from __future__ import print_function from ooop import OOOP o = OOOP(dbname="testv6") partners = o.ResPartner.all() for partner in partners: - print "id: %d, name: %s" % ( partner._ref, partner.name ) \ No newline at end of file + print("id: %d, name: %s" % ( partner._ref, partner.name )) \ No newline at end of file diff --git a/ooop.py b/ooop.py index 0133555..28ea5aa 100644 --- a/ooop.py +++ b/ooop.py @@ -20,7 +20,13 @@ # ######################################################################## -import xmlrpclib +from __future__ import print_function +from builtins import range +from builtins import object +try: + import xmlrpclib +except ImportError: + from xmlrpc import client as xmlrpclib import time import base64 import types @@ -33,7 +39,7 @@ __author__ = "Pedro Gracia " __license__ = "GPLv3+" -__version__ = "0.3.0" +__version__ = "0.3.1" OOOPMODELS = 'ir.model' @@ -55,7 +61,7 @@ 'child_of': 'child of', } -class objectsock_mock(): +class objectsock_mock(object): """mock for objectsock to be able to use the OOOP as a module inside of openerp""" def __init__(self, pool, cr): self.pool = pool @@ -69,7 +75,7 @@ def execute(self, uid, pwd, model, action, *args): return res -class OOOP: +class OOOP(object): """ Main class to manage xml-rpc comunitacion with openerp-server """ def __init__(self, user='admin', pwd='admin', dbname='openerp', uri='http://localhost', port=8069, debug=False, **kwargs): @@ -181,7 +187,7 @@ def insert_items(self, model, data): if not self.search(model, query): # check if it's already present self.create(model, d) else: - print 'Warning: %s already in %s model: %s' % (item, model) + print('Warning: %s already in %s model: %s' % (item, model)) def load_models(self): models = self.read_all(OOOPMODELS) @@ -191,7 +197,7 @@ def load_models(self): def set_model(self, model, r={}, deep=None): """docstring for set_model""" - if not model in r.keys(): + if model not in r: r[model] = { 'name': self.normalize_model_name(model), 'links': {}, @@ -201,7 +207,7 @@ def set_model(self, model, r={}, deep=None): for fld in flds: r[model]['fields'].append((fld["name"], fld["ttype"])) if fld["ttype"] in ('one2many', 'many2one', 'many2many'): - if deep > 0 and not fld['relation'] in r[model]['links'].keys(): + if deep > 0 and not fld['relation'] in r[model]['links']: r[model]['links'][fld['relation']] = fld['ttype'] r = self.set_model(fld["relation"], r, deep-1) @@ -265,7 +271,7 @@ def export(self, filename, filetype, showfields=True, model=None, deep=-1): node = pydot.Node(value['name'], label=label) node.set_shape('none') graph.add_node(node) - for i in value['links'].keys(): + for i in value['links']: edge = pydot.Edge(value['name'], r[i]['name']) if value['links'][i] == 'one2many': edge.set_headlabel('0..*') @@ -309,7 +315,7 @@ def report(self, model, ref, report_type='pdf'): time.sleep(1) attempt += 1 if attempt > 200: - print 'Printing aborted, too long delay!' + print('Printing aborted, too long delay!') break if report_type == 'pdf': @@ -319,7 +325,7 @@ def report(self, model, ref, report_type='pdf'): return report['result'] # reference: http://www.java2s.com/Code/Python/Class/MyListinitaddmulgetitemlengetslice.htm -class List: +class List(object): """ An 'intelligent' list """ #FIXME: reorder args def __init__(self, manager, objects=None, parent=None, @@ -342,7 +348,7 @@ def __init__(self, manager, objects=None, parent=None, def __iter__(self): return self - def next(self): + def __next__(self): self.index += 1 if self.index == len(self.objects): self.index = -1 @@ -350,11 +356,11 @@ def next(self): return self.__getitem__(self.index) def delete(self): - print self.parent + print(self.parent) if self.parent: objects = self.parent.objects self.parent.objects = objects[:self.low] + objects[self.high:] - print self.objects + print(self.objects) # print "hi" # return True return self.manager._ooop.unlink(self.model, self.objects) @@ -368,7 +374,7 @@ def __getslice__(self, low, high): return List(self.manager, self.objects[low:high], self, low, high, data=self.data, model=self.model) def __getitem__(self, offset): - if type(self.objects[offset]) != types.IntType: + if type(self.objects[offset]) != int: return self.objects[offset] else: #if type(data) != Types.StringType: # data != model @@ -383,7 +389,7 @@ def __repr__(self): return ' %i elements' % (self.model, len(self.objects)) -class Manager: +class Manager(object): def __init__(self, model, ooop): self._model = model self._ooop = ooop @@ -449,7 +455,7 @@ def __init__(self, manager, ref=None, model=None, copy=False, *args, **kargs): self.INSTANCES['%s:%s' % (self._model, self._ref)] = self - if self._model in self._ooop.fields.keys(): + if self._model in self._ooop.fields: self.fields = self._ooop.fields[self._model] else: fields = self._manager.fields_get() @@ -468,22 +474,21 @@ def __init__(self, manager, ref=None, model=None, copy=False, *args, **kargs): else: # get default values default_values = {} - field_names = self.fields.keys() + field_names = list(self.fields.keys()) default_values = self._manager.default_get(field_names) self.init_values(**default_values) def init_values(self, *args, **kargs): """ initial values for object """ - keys = kargs.keys() for i in self.fields.values(): name,ttype,relation = i['name'],i['ttype'],i['relation'] if ttype in ('one2many', 'many2many'): # these types use a list of objects - if name in keys: + if name in kargs: self.__dict__[name] = List(Manager(relation, self._ooop), kargs[name], data=self, model=relation) else: self.__dict__[name] = List(Manager(relation, self._ooop), data=self, model=relation) elif ttype == 'many2one': - if name in keys: + if name in kargs: # manager, ref=None, model=None, copy=False instance = Data(Manager(relation, self._ooop), kargs[name], relation) self.INSTANCES['%s:%s' % (relation, kargs[name])] = instance @@ -491,7 +496,7 @@ def init_values(self, *args, **kargs): else: self.__dict__[name] = False else: - if name in keys: + if name in kargs: self.__dict__[name] = kargs[name] else: self.__dict__[name] = False # TODO: I prefer None here... @@ -511,7 +516,7 @@ def get_values(self): def __setattr__(self, field, value): if 'fields' in self.__dict__: - if field in self.fields.keys(): + if field in self.fields: ttype = self.fields[field]['ttype'] if ttype =='many2one' and value: self.INSTANCES['%s:%s' % (self._model, value._ref)] = value @@ -522,14 +527,14 @@ def __getattr__(self, field): #if self.fields[self._model].has_key(field): # ttype = self.fields[self._model][field]['ttype'] # if ttype in ('many2one', 'many2many'): - # print "FIELD MANY2..." - if field in self.__dict__.keys(): + # print("FIELD MANY2...") + if field in self.__dict__: return self.__dict__[field] try: data = {field: self.__data[field]} except: - if field in self.fields.keys(): + if field in self.fields: data = self._ooop.read(self._model, self._ref, [field]) else: # Try a custom function @@ -543,7 +548,7 @@ def __getattr__(self, field): if data[name]: # TODO: review this self.__dict__['__%s' % name] = data[name] key = '%s:%i' % (relation, data[name][0]) - if key in self.INSTANCES.keys(): + if key in self.INSTANCES: self.__dict__[name] = self.INSTANCES[key] else: # TODO: use a Manager instance, not Data @@ -558,23 +563,23 @@ def __getattr__(self, field): self.__dict__['__%s' % name] = data[name] self.__dict__[name] = List(Manager(relation, self._ooop), data=self, model=relation) - for i in xrange(len(data[name])): - key = '%s:%i' % (relation, data[name][i]) - if key in self.INSTANCES.keys(): - self.__dict__[name].append(self.INSTANCES['%s:%s' % (relation, data[name][i])]) + for id in data[name]: + key = '%s:%i' % (relation, id) + if key in self.INSTANCES: + self.__dict__[name].append(self.INSTANCES['%s:%s' % (relation, id)]) else: # TODO: use a Manager instance, not Data instance = Data(Manager(relation, self._ooop), - data[name][i], data=self, + id, data=self, model=relation) self.__dict__[name].append(instance) - #self.INSTANCES['%s:%s' % (relation, data[name][i])] = instance + #self.INSTANCES['%s:%s' % (relation, id)] = instance else: self.__dict__[name] = List(Manager(relation, self._ooop), data=self, model=relation) else: # axelor conector workaround - if type(data) == types.ListType: + if type(data) == list: data = data[0] self.__dict__[name] = data[name] @@ -588,7 +593,7 @@ def save(self): data = {} for i in self.fields.values(): name,ttype,relation = i['name'],i['ttype'],i['relation'] - if name in self.__dict__.keys(): # else keep values in original object + if name in self.__dict__: # else keep values in original object if not '2' in ttype: data[name] = self.__dict__[name] elif ttype in ('one2many', 'many2many'): @@ -608,7 +613,7 @@ def save(self): data[name] = self.__dict__[name] if self._ooop.debug: - print ">>> data: ", data + print(">>> data: {}".format(data)) # create or write the object if self._ref > 0 and not self._copy: # same object diff --git a/setup.py b/setup.py index ca8465c..0c6705c 100755 --- a/setup.py +++ b/setup.py @@ -26,6 +26,9 @@ py_modules = ['ooop'], #package_dir = {'ooop': 'src/'}, #packages = ['ooop'], + install_requires = [ + 'future', + ], classifiers = [ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', diff --git a/test.py b/test.py index fe3ea54..544b3ab 100644 --- a/test.py +++ b/test.py @@ -1,6 +1,9 @@ import unittest import fudge -import xmlrpclib +try: + import xmlrpclib +except ImportError: + from xmlrpc import client as xmlrpclib from ooop import OOOP RESPONSE_IRMODEL = [ @@ -51,8 +54,8 @@ def tearDown(self): @fudge.with_fakes def test_ooop_instance(self): n = OOOP(dbname='test') - self.assertEquals(n.__dict__.has_key('ResPartner'), True) - self.assertEquals(n.__dict__.has_key('ResPartnerAddress'), True) + self.assertEquals('ResPartner' in n.__dict__, True) + self.assertEquals('ResPartnerAddress' in n.__dict__, True) class TestManager(unittest.TestCase): diff --git a/test_improve.py b/test_improve.py index 29ef0c4..628dac7 100644 --- a/test_improve.py +++ b/test_improve.py @@ -1,3 +1,5 @@ +from __future__ import print_function +from builtins import range from ooop import OOOP from datetime import datetime, timedelta @@ -16,7 +18,7 @@ x = o.OptimaReturnsQrenta.all() for i in range(100): data = x[i] - print data.account.customers[0].customer_id.agent.name + print(data.account.customers[0].customer_id.agent.name) stop_a = datetime.now() -start_a # start_b = datetime.now() @@ -24,7 +26,7 @@ # print x # stop_b = datetime.now() -start_b # -print "a:", stop_a +print("a:", stop_a) # print "b:", stop_b diff --git a/test_inherits.py b/test_inherits.py index 823c96a..6f6f927 100644 --- a/test_inherits.py +++ b/test_inherits.py @@ -1,8 +1,9 @@ +from __future__ import print_function from ooop import OOOP -print "###################### START ###########################################" +print("###################### START ###########################################") O = OOOP(dbname="test", port=8050) -print O.ProductProduct.fields_get() +print(O.ProductProduct.fields_get()) product = O.ProductProduct.get(1) -print product.name -print product.categ_id.name -print "###################### END #############################################" +print(product.name) +print(product.categ_id.name) +print("###################### END #############################################")