Reputation: 373
Im trying to migrate sales order from excel sheet to odoo using xmlrpc so far i have the products working,client working but when i try to insert the sale order i get this error
Traceback (most recent call last):
File "/home/oasis/PycharmProjects/somig/migrator.py", line 75, in <module>
'validity_date':"2016-01-18",
File "/usr/lib/python2.7/xmlrpclib.py", line 1243, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.7/xmlrpclib.py", line 1602, in __request
verbose=self.__verbose
File "/usr/lib/python2.7/xmlrpclib.py", line 1283, in request
return self.single_request(host, handler, request_body, verbose)
File "/usr/lib/python2.7/xmlrpclib.py", line 1316, in single_request
return self.parse_response(response)
File "/usr/lib/python2.7/xmlrpclib.py", line 1493, in parse_response
return u.close()
File "/usr/lib/python2.7/xmlrpclib.py", line 800, in close
raise Fault(**self._stack[0])
xmlrpclib.Fault: <Fault 1: 'Traceback (most recent call last):\n File "/usr/lib/python2.7/dist-packages/openerp/service/wsgi_server.py", line 56, in xmlrpc_return\n result = openerp.http.dispatch_rpc(service, method, params)\n File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 114, in dispatch_rpc\n result = dispatch(method, params)\n File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 37, in dispatch\n res = fn(db, uid, *params)\n File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 173, in execute_kw\n return execute(db, uid, obj, method, *args, **kw or {})\n File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 118, in wrapper\n return f(dbname, *args, **kwargs)\n File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 181, in execute\n res = execute_cr(cr, uid, obj, method, *args, **kw)\n File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 170, in execute_cr\n return getattr(object, method)(cr, uid, *args, **kw)\n File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 250, in wrapper\n return old_api(self, *args, **kwargs)\n File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 354, in old_api\n result = method(recs, *args, **kwargs)\n File "/usr/lib/python2.7/dist-packages/openerp/addons/sale/sale.py", line 232, in create\n result = super(SaleOrder, self).create(vals)\n File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 248, in wrapper\n return new_api(self, *args, **kwargs)\n File "/usr/lib/python2.7/dist-packages/openerp/addons/mail/models/mail_thread.py", line 233, in create\n thread = super(MailThread, self).create(values)\n File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 248, in wrapper\n return new_api(self, *args, **kwargs)\n File "/usr/lib/python2.7/dist-packages/openerp/models.py", line 4157, in create\n record = self.browse(self._create(old_vals))\n File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 248, in wrapper\n return new_api(self, *args, **kwargs)\n File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 490, in new_api\n result = method(self._model, cr, uid, *args, **old_kwargs)\n File "/usr/lib/python2.7/dist-packages/openerp/models.py", line 4301, in _create\n tuple([u[2] for u in updates if len(u) > 2])\n File "/usr/lib/python2.7/dist-packages/openerp/sql_db.py", line 141, in wrapper\n return f(self, *args, **kwargs)\n File "/usr/lib/python2.7/dist-packages/openerp/sql_db.py", line 220, in execute\n res = self._obj.execute(query, params)\nProgrammingError: column "partner_id" is of type integer but expression is of type integer[]\nLINE 1: ...1, NULL, \'draft\', 6, 1, 1, \'2016-09-03 16:50:24\', ARRAY[6], ...\n ^\nHINT: You will need to rewrite or cast the expression.\n\n'>
Process finished with exit code 1
my code is the following
import psycopg2
import psycopg2.extras
import pyexcel_xls
import pyexcel as pe
from pyexcel_xls import get_data
from datetime import datetime
import xmlrpclib
import json
url = 'http://localhost:8070'
db = 'fresh'
username = 'admin'
password = 'odoo'
#data = get_data("salesorder.xls")
#print(json.dumps(data))
records = pe.get_records(file_name="salesorder.xls")
for record in records:
print record['name']
names = record['name']
print record['location']
print record['zip']
print record['republic']
dates = record['date']
print dates
print datetime.strptime(dates,'%d/%M/%Y')
lastdat=datetime.strptime(dates,'%d/%M/%Y')
print record['product']
productname= record['product']
#Check if the customer is in or else insert him
common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
output = common.version()
models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(url))
partnerids = models.execute_kw(db, uid, password,
'res.partner', 'search', [[['name', '=', record['name']]]])
if partnerids:
print partnerids
else:
newpartn = models.execute_kw(db, uid, password, 'res.partner', 'create', [{
'name': names,
}])
partnerids=newpartn
print partnerids
#Check if a product is in else insert a new product
common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
output = common.version()
models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(url))
productids = models.execute_kw(db, uid, password,
'product.product', 'search', [[['name', '=', record['product']]]])
if productids:
print productids
else:
newproduct = models.execute_kw(db, uid, password, 'product.product', 'create', [{
'name': productname,
'default_code': partnerids
}])
productids=newproduct
print productids
uid = common.authenticate(db, username, password, {})
print output
models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(url))
id = models.execute_kw(db, uid, password, 'sale.order', 'create', [{
'partner_id': partnerids,
# 'name': names,
'validity_date':"2016-01-18",
#'payment_term_id':1,
# 'user_id':"1"
# 'state':"sale"
}])
print id
the 75th line is the one of validity date
Upvotes: 0
Views: 748
Reputation: 26738
The Error message says:
ProgrammingError: column "partner_id" is of type integer but expression is of type integer[].
Just give partnerids
as an integer:
if partnerids:
partnerids = partnerids[0]
print partnerids
Upvotes: 0
Reputation: 3378
I think the issue is that you execute a search for partnerids which will result in an array. However if you do not find any you create a partner which is represented by an integer. You then assign partnerids to the partner_id in your sale.order.
Sometimes you are assigning it an integer and other times an array, depending on if you are using the partnerids from the search or the newly created partner.
If you are sure that your search for partnerids will never result in two partners having the same name then you can use the first record returned in your search which I display below. I reassigned partnerids on a second line simply to illustrate the difference.
If you are not sure if you have duplicates this will be the wrong thing to do and you should refine your search to select the correct partner.
partnerids = models.execute_kw(db, uid, password,
'res.partner', 'search', [[['name', '=', record['name']]]])
partnerids = partnerids[0] if partnerids else False
if partnerids:
print partnerids
else:
newpartn = models.execute_kw(db, uid, password, 'res.partner', 'create', [{
'name': names,
}])
partnerids=newpartn
Upvotes: 1