Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

远程访问Openerp 对象,oersted的应用实例介绍


  • 管理员

    我们知道我们可以通过xml-rpc或net-rpc来远程访问openerp服务器中的对象并对其做相应的操作,但是在实际应用中并不是非常方便,于是诞生了各种各样的封装程序以简化操作。比如:用ruby开发的[url=https://github.com/rvalyi/ooor]OOOR[/url],python开发的 [url=https://github.com/lasarux/ooop]ooop[/url], [url=http://pypi.python.org/pypi/oersted/1.0]oersted[/url]等等, 最近甚至还有人通过ooop作为与openerp通讯的桥梁开发了一个叫[url=https://launchpad.net/zoook]Zook[/url]的网店系统。本文介绍的是对oersted的应用。<br /> <br /> [b]应用介绍[/b]:<br /> <br /> [b]product.product 和 product.template:[/b]<br /> <br /> OpenERP中默认内置了product.product 和 product.template对象,product.product通过 “实例继承”([b]_inherits[/b]) 内嵌了product.template对象。在默认的情况下,系统的各个视图并不区分这两个不同的对象。当我们创建一个Product时,系统实际同时 创建了一个product.product对象和一个对应的product.template对象,在这里product.product 和 product.template的关系是一对一的。<br /> 但是,在很多情况下我们希望product.template和product.product是一对多的关系,也就是说,比如我可以用 product.template定义某个款式的服装,然后在product.product中定义多个不同颜色,尺寸的对应的服装产品。这时候,你就要 去“激活“product模块中已经定义好的一些视图(view), 或者自己来开发一些相应的视图,或更简单点使用现成的模块:product_variant_multi<br /> <br /> 但是对已经使用了默认方法(product.template和product.product之间是一对一的关系)创建的这些product数据该如何处理呢?<br /> <br /> [b]实际情况:[/b]<br /> <br /> 客户并没有认识到openerp可以为产品配置product template, 所以在生成产品主数据的时候使用了默认的方法,这样在现有的系统里有大量类似这样的产品名称:<br /> 产品型号XXXXX - 红色, 产品型号XXXX - 黑色 ...., 事实上对客户的需求了解后,知道他们很多时候需要针对某个产品型号的汇总统计,而不论其颜色或其他属性的差别。所以我们有必要对现有的产品主数据改变。变 为,product.template的name字段为 ‘产品型号XXXX'而product.product的variants字段的值为:类似'红色‘, '黑色‘等。但是客户有几千个产品,手动修改是不现实的,我们创建了一个简单的脚本来实现了这个产品的转换,其中使用到了oersted库<br /> [b] 代码:<br />[/b][code]<br /> import re<br /> from oersted import OEClient<br /><br /> oeclient = OEClient('localhost')                                                  #创建远程客户端对象<br /> oeclient.login('dbname', 'admin', 'admin')                                    #登录<br /> Product = oeclient.create_browse('dbname', 'product.product') #获取product对象<br /> Product_Tmpl = oeclient.create_browse('dbname', 'product.template') #获取product_template对象<br /> prod_objs = Product.search()                                                                  #获取所有product对象实例<br /> pattern = re.compile(r'([^-]+?)\s*-\s*([^-]+)$')      #考虑到客户在定义产品名称时‘-’周围空格的不规范使用<br /> tmpl_prod = {}<br /> unmatched = []<br /> for prod in prod_objs:<br />    if not prod.variants:                                                                    #防止多次运行该程序对已转换对象的修改<br />        matches = pattern.match(prod.name)<br />        if matches and matches.group(1):<br />            tmpl_prod.setdefault(matches.group(1), []).append(prod) #获得例如: {'产品型号XXX‘: [红色产品对象, 黑色产品对象, 白色产品对象}的字典<br />        else:<br />            unmatched.append(prod.name)                  #记录未匹配的产品名称到umatched列表中,并在后面输出,以方便手工处理<br /> for tmpl in tmpl_prod:<br />    if len(tmpl_prod[tmpl]) > 1:                                  #如果tmpl_prod字典的值,就是那个列表[红色产品对象, 黑色产品对象]有大于1项,表示该记录需要处理<br />        old_tmpl = tmpl_prod[tmpl][0].product_tmpl_id #记录列表中第一个产品所对应的产品模板<br />        new_tmpl_id = old_tmpl.copy(old_tmpl.id)          #拷贝获得新的模板对象,这里获得该新建模板的ID<br />        new_tmpl = Product_Tmpl(new_tmpl_id)            #获得新建模板对象<br />        new_tmpl.name = tmpl                                      #改变新建模板的名称为tmpl_prod字典的key值<br />        new_tmpl.active = True                                      #默认的product.template对象并没有active字段,我们做了继承修改,<br />                                                                                    #目的是安全考虑保留原template, <br />        new_tmpl.save()                                                #保存修改后的template<br />        for prod in tmpl_prod[tmpl]:<br />            prod.product_tmpl_id.active = False              #可以直接删除原template,这里处于安全考虑,将其设置为:inactive<br />            prod.product_tmpl_id.save()<br />            m = pattern.match(prod.name)<br />            prod.product_tmpl_id = new_tmpl                  #给product赋予新的template<br />            prod.variants = m.group(2)                            #给product的variants字段赋值,如:红色,黑色<br />            prod.save()<br /> print unmatched                                                        #输出未匹配产品名以方便后续处理<br /> [/code]


  • 管理员

    我们知道我们可以通过xml-rpc或net-rpc来远程访问openerp服务器中的对象并对其做相应的操作,但是在实际应用中并不是非常方便,于是诞生了各种各样的封装程序以简化操作。比如:用ruby开发的[url=https://github.com/rvalyi/ooor]OOOR[/url],python开发的 [url=https://github.com/lasarux/ooop]ooop[/url], [url=http://pypi.python.org/pypi/oersted/1.0]oersted[/url]等等, 最近甚至还有人通过ooop作为与openerp通讯的桥梁开发了一个叫[url=https://launchpad.net/zoook]Zook[/url]的网店系统。本文介绍的是对oersted的应用。<br /> <br /> [b]应用介绍[/b]:<br /> <br /> [b]product.product 和 product.template:[/b]<br /> <br /> OpenERP中默认内置了product.product 和 product.template对象,product.product通过 “实例继承”([b]_inherits[/b]) 内嵌了product.template对象。在默认的情况下,系统的各个视图并不区分这两个不同的对象。当我们创建一个Product时,系统实际同时 创建了一个product.product对象和一个对应的product.template对象,在这里product.product 和 product.template的关系是一对一的。<br /> 但是,在很多情况下我们希望product.template和product.product是一对多的关系,也就是说,比如我可以用 product.template定义某个款式的服装,然后在product.product中定义多个不同颜色,尺寸的对应的服装产品。这时候,你就要 去“激活“product模块中已经定义好的一些视图(view), 或者自己来开发一些相应的视图,或更简单点使用现成的模块:product_variant_multi<br /> <br /> 但是对已经使用了默认方法(product.template和product.product之间是一对一的关系)创建的这些product数据该如何处理呢?<br /> <br /> [b]实际情况:[/b]<br /> <br /> 客户并没有认识到openerp可以为产品配置product template, 所以在生成产品主数据的时候使用了默认的方法,这样在现有的系统里有大量类似这样的产品名称:<br /> 产品型号XXXXX - 红色, 产品型号XXXX - 黑色 ...., 事实上对客户的需求了解后,知道他们很多时候需要针对某个产品型号的汇总统计,而不论其颜色或其他属性的差别。所以我们有必要对现有的产品主数据改变。变 为,product.template的name字段为 ‘产品型号XXXX'而product.product的variants字段的值为:类似'红色‘, '黑色‘等。但是客户有几千个产品,手动修改是不现实的,我们创建了一个简单的脚本来实现了这个产品的转换,其中使用到了oersted库<br /> [b] 代码:<br />[/b][code]<br /> import re<br /> from oersted import OEClient<br /><br /> oeclient = OEClient('localhost')                                                  #创建远程客户端对象<br /> oeclient.login('dbname', 'admin', 'admin')                                    #登录<br /> Product = oeclient.create_browse('dbname', 'product.product') #获取product对象<br /> Product_Tmpl = oeclient.create_browse('dbname', 'product.template') #获取product_template对象<br /> prod_objs = Product.search()                                                                  #获取所有product对象实例<br /> pattern = re.compile(r'([^-]+?)\s*-\s*([^-]+)$')      #考虑到客户在定义产品名称时‘-’周围空格的不规范使用<br /> tmpl_prod = {}<br /> unmatched = []<br /> for prod in prod_objs:<br />    if not prod.variants:                                                                    #防止多次运行该程序对已转换对象的修改<br />        matches = pattern.match(prod.name)<br />        if matches and matches.group(1):<br />            tmpl_prod.setdefault(matches.group(1), []).append(prod) #获得例如: {'产品型号XXX‘: [红色产品对象, 黑色产品对象, 白色产品对象}的字典<br />        else:<br />            unmatched.append(prod.name)                  #记录未匹配的产品名称到umatched列表中,并在后面输出,以方便手工处理<br /> for tmpl in tmpl_prod:<br />    if len(tmpl_prod[tmpl]) > 1:                                  #如果tmpl_prod字典的值,就是那个列表[红色产品对象, 黑色产品对象]有大于1项,表示该记录需要处理<br />        old_tmpl = tmpl_prod[tmpl][0].product_tmpl_id #记录列表中第一个产品所对应的产品模板<br />        new_tmpl_id = old_tmpl.copy(old_tmpl.id)          #拷贝获得新的模板对象,这里获得该新建模板的ID<br />        new_tmpl = Product_Tmpl(new_tmpl_id)            #获得新建模板对象<br />        new_tmpl.name = tmpl                                      #改变新建模板的名称为tmpl_prod字典的key值<br />        new_tmpl.active = True                                      #默认的product.template对象并没有active字段,我们做了继承修改,<br />                                                                                    #目的是安全考虑保留原template, <br />        new_tmpl.save()                                                #保存修改后的template<br />        for prod in tmpl_prod[tmpl]:<br />            prod.product_tmpl_id.active = False              #可以直接删除原template,这里处于安全考虑,将其设置为:inactive<br />            prod.product_tmpl_id.save()<br />            m = pattern.match(prod.name)<br />            prod.product_tmpl_id = new_tmpl                  #给product赋予新的template<br />            prod.variants = m.group(2)                            #给product的variants字段赋值,如:红色,黑色<br />            prod.save()<br /> print unmatched                                                        #输出未匹配产品名以方便后续处理<br /> [/code]



  • 校长好贴。<br />请教下,oersted 调用,比xml-rpc 调用有哪些优点?从例子的OEClient 还看不出明显优势,呵呵。


  • 管理员

    老肖的提问很到位。虽然本文提到了这些封装程序是为了简化的目的,但是如何简化,优点在哪并没有强调。<br /><br />我对这些封装库优点的理解是,他们在本地重建了类似server端的browse_object对象, 并事实上扩展了browse_object的能力,比如server 端的browse object是不能进行赋值操作的。而这些封装库是可以的。 这样的对对象的操作方法更加简单也更加pythonic。 <br /><br />大家有兴趣的话可以写一个基于直接xml-rpc的脚本,看看本文中推荐的方法是不是简便些。<br />



  • 关注....<br /><br />有 Windows 的 python 扩展包下载吗?



  • [quote author=digitalsatori link=topic=2495.msg8254#msg8254 date=1309231357]<br />事实上对客户的需求了解后,知道他们很多时候需要针对某个产品型号的汇总统计,而不论其颜色或其他属性的差别。<br />[/quote]<br />服装!<br />要修改产品主数据,总是一个改!<br />我会选择修改前端,带来更好体验,同样保留季节、款号、尺码、颜色表示单一产品信息,前端用Excel数据透视表形式,分组汇总,即可按款号(忽略同款中的不同尺码、颜色)汇总,也可按款号+颜色汇总等,更贴近办公Office体验,效果更好。<br />在7.0基本上也可以不改了吧,附图:<br />[attachimg=1]


  • 管理员

    想问一下Excel的数据透视图,和楼主的oersted的应用实例介绍有什么关系? :o



  • 不要介意,我只是看到业务介绍部分想到的。


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待