Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion examples/basic.py
Original file line number Diff line number Diff line change
@@ -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 )
print("id: %d, name: %s" % ( partner._ref, partner.name ))
75 changes: 40 additions & 35 deletions ooop.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -33,7 +39,7 @@

__author__ = "Pedro Gracia <lasarux@neuroomante.com>"
__license__ = "GPLv3+"
__version__ = "0.3.0"
__version__ = "0.3.1"


OOOPMODELS = 'ir.model'
Expand All @@ -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
Expand All @@ -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):
Expand Down Expand Up @@ -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)
Expand All @@ -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': {},
Expand All @@ -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)

Expand Down Expand Up @@ -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..*')
Expand Down Expand Up @@ -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':
Expand All @@ -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,
Expand All @@ -342,19 +348,19 @@ 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
raise StopIteration
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)
Expand All @@ -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
Expand All @@ -383,7 +389,7 @@ def __repr__(self):
return '<Objects from %s> %i elements' % (self.model, len(self.objects))


class Manager:
class Manager(object):
def __init__(self, model, ooop):
self._model = model
self._ooop = ooop
Expand Down Expand Up @@ -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()
Expand All @@ -468,30 +474,29 @@ 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
self.__dict__[name] = instance
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...
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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]
Expand All @@ -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'):
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
py_modules = ['ooop'],
#package_dir = {'ooop': 'src/'},
#packages = ['ooop'],
install_requires = [
'future',
],
classifiers = [
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
Expand Down
9 changes: 6 additions & 3 deletions test.py
Original file line number Diff line number Diff line change
@@ -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 = [
Expand Down Expand Up @@ -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):
Expand Down
6 changes: 4 additions & 2 deletions test_improve.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import print_function
from builtins import range
from ooop import OOOP
from datetime import datetime, timedelta

Expand All @@ -16,15 +18,15 @@
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()
# x = o.read_all('optima.returns.qrenta', [])
# print x
# stop_b = datetime.now() -start_b
#
print "a:", stop_a
print("a:", stop_a)
# print "b:", stop_b


11 changes: 6 additions & 5 deletions test_inherits.py
Original file line number Diff line number Diff line change
@@ -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 #############################################")