如何在OpenERP7中创建one2many表的摘要表?

时间:2015-05-25 10:26:44

标签: python xml openerp odoo openerp-7

我有树型:res.partnermy_categorypartner_my_category_rel。合作伙伴和类别之间的关系是 many2many ,但我需要在关系表中存储一些属性(不仅是ID,还有注册日期),所以,正如您所知,我有我自己创建中间表(我将其命名为partner_my_category_rel)。因此,在res.partner中,我有一个指向表partner_my_category_rel one2many 字段。

现在我想创建一个摘要表。摘要表必须每个类别只显示一行(此行将是具有最后一个注册日期的行)。

示例:合作伙伴属于黄金类别两次(注册日期 19/09/08 31/12/09 )以及类别白银一次(注册日期 20/04/13 。摘要表必须只显示两行,每个黄金一行,一个白银 31/12/09 20/04/13 )。

但我在每行添加了一个按钮打开历史记录,以查看每个类别的所有记录,因此,如果我在类别 gold 的行中点击此按钮,弹出窗口将打开,我将能够在树状视图中看到 gold 类别的两个记录。

完成(使用type =“one2many”的函数字段)。但它们必须是可编辑的。现在我的问题出现了。如果我开始编辑记录,即使我没有保存更改,当我关闭表单时没问题,但是在这样做之后,如果我切换到其他伙伴并重复相同的过程,我在关闭时会收到JavaScript错误形式:

未捕获的TypeError:无法读取未定义的属性'get'

我尝试了两种方法(在历史的树视图中添加属性editable="bottom",并创建一个表单,以便能够编辑单击它们的历史记录)。两种情况都会出现JS错误。

我无法理解为什么(这不是关于特定记录,因为我第一次打开合作伙伴并不重要,它不会引发错误,但我稍后打开的其他合作伙伴会这样做)。

编辑表单的案例

按钮代码打开历史记录

def open_history(self, cr, uid, ids, context=None):
    """ Utility method used to add an "Open History" button in partner views """
    partner_my_category_obj = self.browse(cr, uid, ids[0], context=context)
    data_obj = self.pool.get('ir.model.data')
    form_data_id = data_obj.get_object_reference(cr, uid, 'res_partner_extended', 'partner_category_rel_edit_form_view')
    tree_data_id = data_obj.get_object_reference(cr, uid, 'res_partner_extended', 'partner_category_rel_tree_view')
    form_view_id = form_data_id and form_data_id[1] or False
    tree_view_id = tree_data_id and tree_data_id[1] or False
    return {
        'name': _('History of "%s"') % partner_my_category_obj.category_id.name,
        'view_type': 'form',
        'view_mode': 'form',
        'view_id': False,
        'views': [(tree_view_id, 'tree'), (form_view_id, 'form'),],
        'res_model': 'partner.category.rel',
        'domain': '[("partner_id", "=", %d), ("category_id", "=", %d)]' % (partner_my_category_obj.partner_id, partner_my_category_obj.category_id.id),
        'type': 'ir.actions.act_window',
        'target': 'new',
        'flags': {'tree': {'action_buttons': True},
                  'form': {'action_buttons': True},}
    }

树视图的代码

<record id="partner_category_rel_tree_view" model="ir.ui.view">
    <field name="name">partner.category.rel_tree</field>
    <field name="model">partner.category.rel</field>
    <field name="type">tree</field>
    <field name="arch" type="xml">
        <tree string="Categories">
            <field name="registration_date" />
        </tree>
    </field>
</record>

编辑表单视图的代码

<record id="partner_category_rel_edit_form_view" model="ir.ui.view">
    <field name="name">partner.category.rel.edit.form</field>
    <field name="model">partner.category.rel</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form string="Category" create="false" version="7.0">
            <group>
                <group col="4">
                    <field name="registration_date" required="1" />
                </group>
            </group>
        </form>
    </field>
</record>

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

根据您的描述,我认为您的模型设计是错误的。

你想拥有:

[Partner] -->N [Partner Category] -->N [Partner Category Dates]

或者可以使用更平坦的模型结构:

[Partner] -->N [Partner Category Dates]

在最后一种情况下,您将为每个合作伙伴/类别的最后一条记录另外计算字段Is latest?True,否则为False。在此字段上使用过滤器可以获得所需的效果,旧日期仍然是存储并可供列出。如果甚至可以考虑使用active保留字段来实现该效果。

答案 1 :(得分:0)

我刚刚找到了解决方案!!

当我点击按钮关闭放弃保存时出现问题,弹出窗口已关闭且函数字段为type = “one2many”没时间重装。

所以我在函数字段中添加了一个选项:

<field name="summary" options="{'reload_on_button': True}">
   <tree>
      ...
   </tree>
</field>

选项 reload_on_button 似乎每次点击修改它的按钮时重新加载函数字段。

无论如何,谢谢你的帮助。希望这对任何人都有帮助!