我已将自定义字段添加到我的sale_order表单中,现在我希望它显示在确认销售订单后生成的相应交货单。在v8中可能有一种更简单的方法可以做到这一点,但我必须在v7中这样做,所以请只回答可以在OpenERP v7中使用的答案。
在尝试了许多其他方法来实现这一目标之后,我在odoo.com上找到了一个建议,有人说你应该尝试重写' _prepare_order_picking'通过返回要在交货单上显示的值的字典,实现从销售订单中的值实际创建交货订单的功能。我已经从该链接提供了代码,但它对我不起作用。这是link。非常感谢任何帮助,我试图让一切都清楚,但如果我需要澄清任何事情,请告诉我,我会编辑我的问题。
我修改了我的代码以便于阅读,并且限制了我需要从销售订单到一个字段的自定义字段的数量,当实际工作时我需要多个,但它应该很容易一旦正确实施,就进行扩展。
我的修改后的代码如下:
。__的OpenERP __ PY:
String getKeyString(ArrayList<String> keys, ArrayList<Integer> keyPos){
if (keyPos.get(keyPos.size()-1) >= keys.size()) //if the last entry from orders arraylist keyPos is greater than size of keys
throw new Exception();
String collect = keyPos.stream().map(i -> keys.get(i))
.map(string ->{
try{
if(string.equals("null")) // happens not very often, ~1time in 1,000
return "";
}
catch(NullPointerException e) { //happens even less 1 in 100,000
return "";
}
return string;
})
.collect(Collectors.joining(","));
if(collect.length()<keyPos.size())
throw new Exception("results in an empty key: ");
return collect;
nicks_sale_fields.py:
HashMap<String, ArrayList<String>> dataLists = new HashMap<>();
ArrayList<Integer> keyPos = new ArrayList<>();
...
public void addDataListEntry(ArrayList<String> values) {
// will overwrite Entry if it already exists
try {
this.dataLists.put(getKeyString(values, keyPos), values);
} catch (Exception e) {
logger.info(e.getMessage());
}
}
nicks_sale_fields.xml:
foo,bar
nicks_delivery_fields.xml:
{
"name" : "Nick's Sale order/delivery order form fields",
"version" : "1.0",
"author" : "Nick",
"category" : "Custom",
"depends" : ['sale', 'stock'],
"description" : """ Sale and delivery order customizations by Nick """,
'data' : ['nicks_sale_fields.xml', 'nicks_delivery_fields.xml'],
'installable' : True,
}
答案 0 :(得分:1)
您需要在sale_stock
文件中添加__openerp__.py
(依赖于销售和库存)模块的依赖关系。像
"depends" : ['sale_stock'],
在nicks_delivery_fields.xml
中,您提供了错误的型号名称来修改交货订单视图。它应该是stock.picking
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="nicks_deliv_order_fields">
<field name="name">stock.picking.out.form</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_out_form"/>
<field name="arch" type="xml">
<xpath expr="/form/sheet/group/group[2]/field[@name='origin']" position="after">
<group string="Delivery order: custom fields">
<field name="my_custom_field" string="Delivery form descriptor" class="oe_inline"/>
</group>
</xpath>
</field>
</record>
</data>
</openerp>
答案 1 :(得分:1)
假设您只想让自定义销售订单字段可用于阅读交货,您可以使用related
计算字段:
class StockPicking(osv.Model):
_inherit='stock.picking'
_columns={
'my_custom_field': fields.related(
'sale_id', 'my_custom_field', type='char',
readonly=True, string='field description'),
}
答案 2 :(得分:1)
感谢大家的帮助,我能够解决我的问题,@ daniel-reis正确地说明了如何使用相关领域,这很有效。使我的模块依赖于__openerp__.py文件中的'sale_stock'也有帮助,所以感谢@ atul-arvind。在此之后没有完全发挥作用我不得不再挖掘一下,发现由于stock.picking.out模型继承stock.picking的方式(在v7中,我认为这在v8中是固定的)所以有必要创建两个自定义类,一个继承自stock.picking,另一个继承自stock.picking.out。然后在每个类中定义您的自定义字段,然后它们将显示,并且继承将正常工作,如下所示:
class stock_picking_out(osv.Model):
_name = 'stock.picking.out'
_inherit = 'stock.picking.out'
_columns = { 'my_custom_field': fields.related(
'sale_id', 'my_custom_field', type='char',
readonly=True, string='field description'),
}
class stock_picking(osv.Model):
_name = 'stock.picking'
_inherit = 'stock.picking'
_columns = { 'my_custom_field': fields.related(
'sale_id', 'my_custom_field', type='char',
readonly=True, string='field description'),
}
然后,在我的xml文件中,我将模型行更改为:
<field name="model">stock.picking.out</field>
从这里开始,我的销售订单中的自定义字段存储在数据库表sale_order中,并正确显示在交货单字段中。
如果对此帖有任何疑问,请随时与我联系,我会尽力回答。