OpenERP-v7:从销售订单中将自定义字段添加到交货单

时间:2015-07-09 19:41:28

标签: python openerp odoo openerp-7

我已将自定义字段添加到我的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,
}

3 个答案:

答案 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中,并正确显示在交货单字段中。

如果对此帖有任何疑问,请随时与我联系,我会尽力回答。