跳转到主要内容

Web Context Tunnel

项目描述

OpenERP的on_changes问题

OpenERP过去使用位置参数传递on_changes Ajax事件参数。这很烦人,因为模块通常需要传递额外的参数,而这些参数在基础的on_change签名中不存在。一旦两个模块尝试修改此签名以添加它们的额外参数,除非有额外的胶水模块通过考虑所有额外参数使它们再次兼容,否则它们将不兼容。但这会导致模块兼容性爆炸。

解决方案

此模块提供了一种简单的解决方案,它将适用于大多数情况。事实上,如果基础的on_change设计为传递上下文参数,则它将起作用。否则,它将不起作用,您应该回到旧的方式。但无论如何,如果on_change没有传递上下文参数,这是一个坏习惯,您当然可以对添加到参数中的上下文进行抱怨。

那么对于传递上下文的on_change,这个模块是如何工作的呢?

好吧,OpenERP已经有一个优雅的解决方案,用于扩展模块修改XML属性:在视图中使用position="attributes"放置一个扩展点,然后重新定义属性。这已经在几个地方使用,用于替换客户端将发送到服务器的"上下文"属性。

这里的想法是将您on_change需要的额外参数包装在那个上下文字典中,就像它是常规Python kwargs一样。然后,这个上下文应该自动传播到on_change调用链中,无论模块顺序如何,也不需要任何修改on_change签名的需要。

只使用position="attributes"和重新定义上下文的问题在于,如果两个独立的模块重新定义上下文,除非有第三个模块考虑到它们两者,否则它们将不兼容。

但使用这个模块,扩展点现在可以使用position="attributes",而不是重新定义"上下文"属性,而是可以这样定义一个新的"context_foo"属性:<attribute name="context_foo">{'my_extra_field': my_extra_field}</attribute>。

本模块以这种方式修改了Web客户端:在向服务器发送Ajax on_change事件请求之前,将所有以“context”开头的节点属性合并成一个单独的上下文字典,保留所有扩展的键和值。在极少数情况下,如果模块真的想覆盖上下文中的值,那么它仍然需要覆盖原始上下文属性(或其他原始属性)。

当然,如果您应该通过API或webservice调用on_change而不是使用Web客户端,只需确保您将所需的额外参数包装在上下文字典中即可。

测试

此模块附带了一个简单的测试文件 static/test/context_tunnel.js。要运行它,请按照此处说明在浏览器中打开页面 /web/tests?mod=web_context_tunnel https://doc.openerp.com/trunk/web/testing 它还应通过PhantomJS进行测试时被Python测试选中。

至于使用web_context_tunnel进行YAML测试的模块,是的,这是可能的。实际上,您需要手动模拟新的Web客户端行为,通过手动确保添加您将在on_change中需要的额外上下文键。例如,在调用on_change之前,您可以使用类似 context.update({'my_extra_field': my_extra_field}) 的 !python 语句来更改上下文。

例如,您可以在以下位置查看将模块转换为使用web_context_tunnel的示例: https://github.com/openerpbrasil/l10n_br_core/commit/33065366726a83dbc69b9f0031c81d82362fbfae

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

此版本没有可用的源代码分发文件。请参阅 生成分发存档的教程

构建分发

odoo8_addon_web_context_tunnel-8.0.2.0.0-py2-none-any.whl (20.0 kB 查看哈希)

上传时间 Python 2

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面