Openerp Web Client 中文日期时间 unicode strformat 问题解决方法
-
默认情况下,Openerp Web Client 使用中文日期时间会报以下错误:
<br />return format.format_datetime(self.value, kind=self.attrs.get('type', 'datetime'))<br />...<br /><type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\u5e74' in position 2: ordinal not in range(128) <br /> args = ('ascii', u'%Y\u5e74%m\u6708%d\u65e5', 2, 3, 'ordinal not in range(128)') <br /> encoding = 'ascii' <br /> end = 3 <br /> message = '' <br /> object = u'%Y\u5e74%m\u6708%d\u65e5' <br /> reason = 'ordinal not in range(128)' <br /> start = 2<br />
翻了下论坛的帖子,解决方法大多均为在系统管理->翻译->语言->中文,把时间日期格式中的中文去掉。此方法并没有真正解决中文时间日期格式问题,只能算权宜之计吧。
看了报错信息,根据经验大多就是str 和 unicode 的问题。跟踪代码后,问题定位在 openerp-web-6.0.3/openobject/i18n/format.py 上。主要原因是 strftime 和 strptime 函数参数的编码不一致,form 提交上来的 value 是str 类型,而timeformat 是unicode 类型。因此就抛出异常,报错。
解决方法:
1、修改 DT_SERVER_FORMATS 常量 (openerp-web-6.0.3/openobject/i18n/format.py ):<br />DT_SERVER_FORMATS = {<br /> 'datetime' : '%Y-%m-%d %H:%M:%S'.encode('utf-8'), <br /> 'date' : '%Y-%m-%d'.encode('utf-8'), <br /> 'time' : '%H:%M:%S'.encode('utf-8') <br />}<br />
2、修改get_datetime_format 函数 (openerp-web-6.0.3/openobject/i18n/format.py ):<br />def get_datetime_format(kind="datetime"):<br /> """Get local datetime format.<br /><br /> @param kind: type (date, time or datetime)<br /> @return: string<br /><br /> @todo: cache formats to improve performance.<br /> """<br /> if 'lang' in cherrypy.session:<br /> # server-defined formatting<br /> if kind == 'time':<br /> return cherrypy.session['lang']['time_format'].encode('utf-8') <br /> elif kind == 'date':<br /> return cherrypy.session['lang']['date_format'].encode('utf-8') <br /> else:<br /> return ("%(date_format)s %(time_format)s"% cherrypy.session['lang']).encode('utf-8') <br /><br /> # TODO: correctly convert from LDML to POSIX datetime formatting<br /> # current converter is trivial and lame and probably very easy to break<br /> date_format = _to_posix_format(dates.get_date_format(<br /> format='short', locale=get_locale())).format<br /> if kind == 'time':<br /> # Should use dates.get_time_format(locale=get_locale())<br /> return '%H:%M:%S'.encode('utf-8') <br /> elif kind == 'date':<br /> return date_format.encode('utf-8') <br /> else:<br /> # Should use dates.get_datetime_format, but that one returns<br /> # a 2.6-style formats<br /> return ("%s %s" % (date_format, '%H:%M:%S')).encode('utf-8') <br />
修改完成后,重启oe server 和 oe web client ,即可正常使用中文日期时间。如果你懒的修改上面文件,也可以下载附件,覆盖openerp-web-6.0.3/openobject/i18n/format.py 皆可。
以上在 openerp server 6.03 和 openerp web client 6.0.3 , on debian 6.1 测试通过。