Упорядочить по выбору в представлении списка OpenERP 7.0

В представлении списка OpenERP 7 я хочу показать сортировку значений состояния в черновике заказа, назначенное и отмененное в настоящее время отображается в Asc или Desc. Но в моем случае нам нужна сортировка в состоянии черновика, назначенного и отмены заказа. На основе примененного в порядке в файле python

Например, в коде SQL -

select state, date from  object_name
ORDER BY CASE WHEN state = 'draft'  THEN 0 
              WHEN state = 'assigned'  THEN 1 
              WHEN state = 'cancel'  THEN 2
              ELSE 3
END,  date desc

Приведенный выше код sql, примененный в python

_order = ("CASE WHEN state='draft'  THEN 0",
          "WHEN state = 'assigned'  THEN 1",
          "ELSE 2 END, date desc")

В приведенном выше значении выбора сортировки запросов, работающем в pg_admin, но в коде Python это показывает ошибку ниже

Invalid "order" specified. A valid "order" specification is a comma-separated
list of valid field names (optionally followed by asc/desc for the direction)

Основываясь на этом порядке сортировки по значению выбора, как подать заявку в OpenERP? Метод переопределения поиска также применил тот же запрос sql, но показывает ту же проблему.


person ankita    schedule 12.08.2013    source источник


Ответы (4)


Попробуйте создать функциональное поле с атрибутом хранилища, которое загружает функцию при изменении состояния. Например

def _get_state(cr, uid, ids,field_name, context=None):
    res={}
    for obj in self.browse(cr, uid, ids, context):
        res[obj.id] = (obj.state=='draft' and 0) or (obj.state=='assigned' and 1) or (obj.state=='cancel' and 2) or 3
    return res

_columns = {
current_state_num: fields.function(_get_state,string='Current state',type='integer',store={'your.current.model.name':(lambda cr, uid, ids, context:ids,['state'],20)})
}
_order = "current_state_num,date desc"
person OmaL    schedule 01.09.2013

Возможным решением является выполнение самого запроса из функции Python. Затем вы можете вызвать эту функцию из действия или другого метода. например

def _my_custom_search(self, cr, uid, object_name, context=None):
    sql_req = """
select id, state, date from  %s
ORDER BY CASE WHEN state = 'draft'  THEN 0 
              WHEN state = 'assigned'  THEN 1 
              WHEN state = 'cancel'  THEN 2
              ELSE 3
END,  date desc""" %(object_name, )

    cr.execute(sql_req)
    res = cr.fetchall()
    return res

Вам нужно выбрать поле id в дополнение к полям, по которым вы будете упорядочивать. Другая возможность — изменить фильтр по умолчанию для представления. Добавление фильтра по умолчанию в древовидном представлении

person Mike    schedule 15.08.2013
comment
Спасибо за ответ, Майк, я попробую - person ankita; 16.08.2013

Другим обходным путем может быть сортировка по статусу и изменение порядка ваших состояний в поле:

'state': fields.selection([('draft','Draft'),('assigned','Assigned'), ('cancel','Cancelled'),('other' ....
...
_order = "state, date desc"

ИЛИ вы можете создать новое функциональное поле (например, sort_priority) и использовать аналогичную функцию, чтобы присвоить значение приоритету, а затем упорядочить по этому полю.

person TimoSolo    schedule 27.08.2013

Если вы умеете читать по-немецки, эту запись в блоге есть отличное решение. Вот его адаптированная версия:

class some_table(osv.Model):
    _name = 'some.table'
    _columns = {
        ...
        ...
        'state' : field.selection(...),
        ...
        ...

    def _generate_order_by(self, order_spec, query):
        "correctly orders state field if state is in query"
        order_by = super(some_table, self)._generate_order_by(order_spec, query)
        if order_spec and 'state ' in order_spec:
            state_column = self._columns['state']
            state_order = 'CASE '
            for i, state in enumerate(state_column.selection):
                state_order += "WHEN %s.state='%s' THEN %i " % (self._table, state[0], i)
            state_order += 'END '
            order_by = order_by.replace('"%s"."state" ' % self._table, state_order)
        return order_by
person Ethan Furman    schedule 02.12.2013