← Back to team overview

openerp-india team mailing list archive

[Bug 899794] Re: [6.1] Setting an image or binary field may sometimes fail with "TypeError: can't escape non-string object"

 

After further investigation the reason why this bug was hard to reproduce consistently is because it depends on how the 'simplejson' Python module was installed, and in particular whether its "speedups" C extension is available (but *not* on the version).
This also means it has nothing to do with the version of Python or psycopg2, even though trying to upgrade those may indirectly solve the issue if you happen to reinstall a different version of simplejson in the process.

The speedup-enabled version of simplejson will deserialize pure ASCII
strings as plain str objects, whereas the pure Python implementation
will always produce unicode objects regardless of the string contents.

The OpenERP framework was not ready to receive unicode strings for
serialized binary/image fields, so it fails on any system where
simplejson does not have the C extension installed.

You can check easily whether it is the case:

>>> # System has the speedup extension!
>>> import simplejson
>>> simplejson.decoder.c_scanstring is None and "Bug will occur" or "Can't reproduce"
"Can't reproduce"
>>> isinstance(simplejson.loads('"foo"'), unicode) and "Bug will occur" or "Can't reproduce"
"Can't reproduce"
>>>

>>> # System does not have speedup extension!
>>> import simplejson
>>> simplejson.decoder.c_scanstring is None and "Bug will occur" or "Can't reproduce"
'Bug will occur'
>>> isinstance(simplejson.loads('"foo"'), unicode) and "Bug will occur" or "Can't reproduce"
'Bug will occur'
>>>

The fix will ensure that OpenERP allows passing binary/image data in
serialized form using unicode objects.

** Summary changed:

- [6.1] Setting an image or binary field may sometimes fail with "TypeError: can't escape non-string object"
+ [6.1] Saving an image fails with "TypeError: can't escape non-string object" when simplejson does not have C speedup extension installed

-- 
You received this bug notification because you are a member of OpenERP
Indian Team, which is subscribed to OpenERP Server.
https://bugs.launchpad.net/bugs/899794

Title:
  [6.1] Saving an image fails with "TypeError: can't escape non-string
  object" when simplejson does not have C speedup extension installed

Status in OpenERP Server:
  Confirmed

Bug description:
  from a virtual ubuntu 10.04 server installing OpenERP from trunk:
  OpenERP-server rev: 3848
  OpenERP-addons rev: 5861
  OpenERP-web rev: 1596
  using pip for installing essentially all software except python-ldap, postgresql. 

  0) Go to http://<virtualserver>:8069
  Create a new database without demo data
  This should automatically log you in as Admin with a screen to install modules

  1) Click "SETTINGS" 
  2) Click "Set Company Header and Footer"
  3) Click folder icon to add new logo
  4) Click "Save"

  Result is:
  OpenERP Server Error

  Client Traceback (most recent call last):
    File "/opt/openerp/openerp-web/addons/web/common/http.py", line 154, in dispatch
      response["result"] = method(controller, self, **self.params)
    File "/opt/openerp/openerp-web/addons/web/controllers/main.py", line 772, in save
      r = m.write([id], data, req.session.eval_context(req.context))
    File "/opt/openerp/openerp-web/addons/web/common/openerplib/main.py", line 429, in proxy
      *args)
    File "/opt/openerp/openerp-web/addons/web/common/openerplib/main.py", line 306, in proxy
      result = self.connector.send(self.service_name, method, *args)
    File "/opt/openerp/openerp-web/addons/web/common/openerplib/main.py", line 276, in send
      raise fault

  
  Server Traceback (most recent call last):
    File "/opt/openerp/openerp-web/addons/web/common/openerplib/main.py", line 257, in send
      result = openerp.netsvc.dispatch_rpc(service_name, method, args)
    File "/opt/openerp/openerp-server/openerp/netsvc.py", line 325, in dispatch_rpc
      result = ExportService.getService(service_name).dispatch(method, params)
    File "/opt/openerp/openerp-server/openerp/service/web_services.py", line 580, in dispatch
      res = fn(db, uid, *params)
    File "/opt/openerp/openerp-server/openerp/osv/osv.py", line 120, in wrapper
      return f(self, dbname, *args, **kwargs)
    File "/opt/openerp/openerp-server/openerp/osv/osv.py", line 172, in execute
      res = self.execute_cr(cr, uid, obj, method, *args, **kw)
    File "/opt/openerp/openerp-server/openerp/osv/osv.py", line 163, in execute_cr
      return getattr(object, method)(cr, uid, *args, **kw)
    File "/opt/openerp/openerp-server/openerp/addons/base/res/res_company.py", line 240, in write
      return super(res_company, self).write(cr, *args, **argv)
    File "/opt/openerp/openerp-server/openerp/osv/orm.py", line 3854, in write
      'where id IN %s', upd1 + [sub_ids])
    File "/opt/openerp/openerp-server/openerp/sql_db.py", line 153, in wrapper
      return f(self, *args, **kwargs)
    File "/opt/openerp/openerp-server/openerp/sql_db.py", line 215, in execute
      res = self._obj.execute(query, params)
  TypeError: can't escape non-string object

To manage notifications about this bug go to:
https://bugs.launchpad.net/openobject-server/+bug/899794/+subscriptions