Добавить столбец в строки спецификации в OpenERP v8

Я пытаюсь настроить представление формы спецификации с помощью пользовательского столбца в строках спецификации на основе https://www.odoo.com/apps/modules/7.0/mrp_bom_product_details/

Моя попытка застряла в следующем состоянии:

custom_bom_form.py:

from openerp.osv import fields, osv
from openerp.tools.translate import _

class mrp_bom(osv.osv):
    _inherit = 'mrp.bom'

    _columns ={
        'product_qty_available': fields.related('product_id', 'qty_available', type='float', string='Quantity On Hand', readonly=True),
    }
    _defaults = {
    } 

mrp_bom()

custom_bom_form.xml:

<?xml version="1.0"?>
<openerp>
    <data>

        <record id="mrp_bom_form_view_product_details" model="ir.ui.view">
            <field name="name">mrp.bom.form.product_details</field>
            <field name="model">mrp.bom</field>
            <field name="inherit_id" ref="mrp.mrp_bom_form_view"/>    
            <field name="arch" type="xml">
                <xpath expr="//notebook/page[@string='Components']/field/tree[@string='Components']/field[@name='product_qty']" position="after" >
                    <field name="product_qty_available" />
                </xpath> 
            </field>
        </record>

    </data>
</openerp>

Это приводит к ошибке от Odoo при установке модуля:

ParseError: "ValidateError
Field(s) `arch` failed against a constraint: Invalid view definition

Error details:
Field `product_qty_available` does not exist

Error context:
View `mrp.bom.form.product_details`
[view_id: 1094, xml_id: n/a, model: mrp.bom, parent_id: 675]" while parsing /usr/lib/python2.7/dist-packages/openerp/addons/mrp_bom_product_details/mrp_bom_product_details.xml:5, near
    <record id="mrp_bom_form_view_product_details" model="ir.ui.view">
        <field name="name">mrp.bom.form.product_details</field>
        <field name="model">mrp.bom</field>
        <field name="inherit_id" ref="mrp.mrp_bom_form_view"/>    
        <field name="arch" type="xml">
            <xpath expr="//notebook/page[@string='Components']/field/tree[@string='Components']/field[@name='product_qty']" position="after">
                <field name="product_qty_available"/>
            </xpath> 
        </field>
    </record>

Я не могу понять, почему я не могу ссылаться на product_qty_available там, это работает из других мест в форме спецификации. Например.:

        <field name="arch" type="xml">
            <field name="product_id" position="after">
                <field name="product_qty_available" />
            </field> 
        </field>

Работает.

Также вместо изменения ссылочного поля на что-то, что система знает, работает, например. добавление еще одного столбца product_qty:

        <field name="arch" type="xml">
            <xpath expr="//notebook/page[@string='Components']/field/tree[@string='Components']/field[@name='product_qty']" position="after" >
                <field name="product_qty" />
            </xpath> 
        </field>

Может кто-нибудь показать мне, что я делаю неправильно. Как я могу сослаться на product_qty_available там? Есть ли что-то особенное в странице блокнота?

Обновить

Рабочий py-файл:

from openerp.osv import fields, osv
from openerp.tools.translate import _

class mrp_bom_line(osv.osv):
    _inherit = 'mrp.bom.line'

    _columns ={
        'product_qty_available': fields.related('product_id', 'qty_available', type='float', string='Quantity On Hand', readonly=True),
    }
    _defaults = {
    }

mrp_bom_line()

и xml-файл:

<?xml version="1.0"?>
<openerp>
    <data>

        <record id="mrp_bom_form_view_product_details" model="ir.ui.view">
            <field name="name">mrp.bom.form.product_details</field>
            <field name="model">mrp.bom</field>
            <field name="inherit_id" ref="mrp.mrp_bom_form_view"/>    
            <field name="arch" type="xml">
                <xpath expr="//field[@name='bom_line_ids']/tree/field[@name='product_qty']" position="after">
                    <field name="product_qty_available" />
                </xpath>
            </field>
        </record>

    </data>
</openerp>

person Arie Horst    schedule 04.02.2015    source источник


Ответы (1)


Вы добавили поле product_qty_available в модель mrp.bom и пытаетесь добавить поле внутри поля bom_line_ids - в древовидном представлении bom_line_ids, которое является одним из множества mbrp.bom.line, поэтому система пытается найти поле product_qty_available там в модели mrp.bom.line которого на самом деле нет.

Я не уверен, какова ваша точная цель, но попробуйте следующее

1. Поле добавлено в модель mrp.bom, поэтому вам следует попробовать следующее

<xpath expr="/form/group/group[1]/field[@name='product_id']" position="after">
    <field name="product_qty_available"/>
</xpath>

так что это добавит поле после поля product_id в верхней части экрана, где отображается основная информация.

2.Добавьте поле в модель mrp.bom.line и попробуйте следующее:

<xpath expr="//field[@name='bom_line_ids']/tree/field[@name='product_qty']"  position="after">
    <field name="product_qty_available"/>
</xpath>
person Hardik Patadia    schedule 04.02.2015
comment
Ваше второе предложение - это то, что я пытаюсь выполнить, но пока не повезло. Я изменил файл .py, чтобы определить класс mrp_bom_line, унаследованный от mrp.bom.line, и изменил файл xml с вашим вторым предложением. Затем Odoo по-прежнему сообщает, что product_qty_available не существует. - person Arie Horst; 05.02.2015
comment
Вы можете опубликовать здесь свой код для этого файла .py. Вы перезапустили сервер и обновили модуль? - person Hardik Patadia; 05.02.2015
comment
Если я также изменю модель на mrp.bom.line в файле xml, Odoo выдаст ошибку «Поле message_follower_ids не существует». - person Arie Horst; 05.02.2015
comment
если возможно, отредактируйте свой вопрос и опубликуйте последние обновления, которые вы сделали для файлов .py и .xml. - person Hardik Patadia; 05.02.2015
comment
Я перезапустил сервер и сделал «Обновить список модулей», и теперь он работает! Я пробовал это с некоторыми из своих попыток, но не думал, что это действительно необходимо, поскольку модуль никогда не устанавливался, поэтому прекратил это делать. Есть ли какая-то логика, когда я должен делать одно из этих двух, или я должен всегда делать это? У меня есть еще один вопрос: как узнать, что product_qty_available должен быть в mrp.bom.line унаследованном классе? - person Arie Horst; 05.02.2015
comment
Всякий раз, когда вы делаете какие-либо изменения в файле .py, вы должны перезапустить сервер, иначе изменения не вступят в силу. Если вы внесли какие-либо изменения в .py или .xml, которые привели к изменениям в базе данных, вам необходимо перезапустить модуль и обновить модуль. Если вы вносите какие-либо изменения в .xml, вам не нужно перезапускать сервер, но вам нужно обновить модуль для обновления базы данных. Что касается mrp.bom.line, я получил идею из вашего выражения xpath, показывающего, что вы хотели добавить поле в строку bom, но по ошибке добавили его в mrp.bom . - person Hardik Patadia; 05.02.2015