在odoo树视图中更改默认排序

时间:2017-12-21 16:40:07

标签: python xml sorting openerp odoo-10

我将此代码添加到project_issue模块中。我创建了一个优先级列表,我希望我的记录列表不是按字母顺序排序,而是按优先级的重要性排序。所以这是我的代码:

sort = fields.Text(compute='_compute_sort')
ipriority = fields.Selection([('none', 'None'), 
                             ('low', 'Low'), 
                             ('normal', 'Normal'), 
                             ('medium', 'Medium'),
                             ('high', 'High'),
                             ('urgent', 'Urgent'),
                             ('immediate', 'Immediate')
                             ], string='Issue Priority', required=True, default='none')
@api.one
def _compute_sort(self):
    if self.ipriority == 'none':
        self.sort = 'ggggggg'
    elif self.ipriority == 'low':
        self.sort = 'fffffff'
    elif self.ipriority == 'normal':
        self.sort = 'eeeeeee'
    elif self.ipriority == 'medium':
        self.sort = 'ddddddd'
    elif self.ipriority == 'high':
        self.sort = 'ccccccc'
    elif self.ipriority == 'urgent':
        self.sort = 'bbbbbbb'
    elif self.ipriority == 'immediate':
        self.sort = 'aaaaaaa'
    return self.ipriority

现在我希望使用sort变量对记录进行排序,因此我将此代码添加到树中:

    <tree string="Issue Tracker Tree" decoration-bf="message_needaction==True" default_order="name">
        <field name="sort" invisible="1"/>
    </tree>

但它不起作用。该列表未排序。排序字段已在树视图中显示,但我无法单击它以手动排序我的记录。

我编辑了第一行,但添加了store="true"。但是当我测试它时,排序字段是空的。 _compute_sort方法不起作用。

2 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,我将排序字段更改为选择字段:

sort = fields.Selection([('a','a'),
                         ('b','b'),
                         ('c','c'),
                         ('d','d'),
                         ('e','e'),
                         ('f','f'),
                         ('g','g'),], string='Sorting', defaut='g')

我更改了方法并调用了onchange api:

@api.onchange('ipriority')
def _onchange_sort(self):
    if self.ipriority == 'none':
        self.sort = 'g'
    elif self.ipriority == 'low':
        self.sort = 'f'
    elif self.ipriority == 'normal':
        self.sort = 'e'
    elif self.ipriority == 'medium':
        self.sort = 'd'
    elif self.ipriority == 'high':
        self.sort = 'c'
    elif self.ipriority == 'urgent':
        self.sort = 'b'
    elif self.ipriority == 'immediate':
        self.sort = 'a'

现在一切正常。

答案 1 :(得分:0)

一个稍微清洁的解决方案是这样的:

sort = fields.Integer(compute='_compute_sort', store=True)
ipriority = fields.Selection([('none', 'None'),
                              ('low', 'Low'),
                              ('normal', 'Normal'),
                              ('medium', 'Medium'),
                              ('high', 'High'),
                              ('urgent', 'Urgent'),
                              ('immediate', 'Immediate')
                             ], string='Issue Priority', required=True, default='none')

@api.multi
@api.depends('ipriority')
def _compute_sort(self):
    sort_order = {
        'immediate': 1,
        'urgent': 2,
        'high': 3,
        'medium': 4,
        'normal': 5,
        'low': 6,
        'none': 7,
    }
    for record in self:
        record.sort = sort_order.get(record.ipriority)

这将存储您的sort字段,因此不需要经常重新计算。它还使其成为Integer字段,而不是Char,它更易于阅读/比较,并且应该更快。

Odoo Fields Documentation