домен openerp как сравнить 2 поля даты в odoo

Я создаю метод, когда я меняю дату получения продукта и количество на дату stock.move, я объявляю start_date = fields.Datetime() в своем классе

def onchange_project(self, cr, uid,start_date):
    """
    onchange handler of start date.
    """  
    pool_stockmove =self.pool.get('stock.move')
    domain =[('date','>=',start_date)]  
    ids = pool_stockmove.search(cr, uid, domain)

этот метод отлично работает, но я хочу сравнить «дату запаса» между датой start_date >= start_date И date ‹= start_date. Я также хочу отформатировать дату, как метод на hr_timesheet

cr.execute('SELECT id \
                FROM hr_timesheet_sheet_sheet \
                WHERE (date_from <= %s and %s <= date_to) \
                    AND user_id=%s \
                    AND id <> %s',(sheet.date_to, sheet.date_from, new_user_id, sheet.id))
            if cr.fetchall():
                return False

Спасибо


person Achref MH    schedule 25.06.2015    source источник


Ответы (3)


Даты хранятся в строковом формате. Вы можете сравнить с использованием sql, как в вашем примере hr, но я бы предложил сравнить его с использованием ORM, а не с исходным sql. Это удобнее и рекомендуется использовать всегда, т.к. sql ускользает от безопасности и других проверок, что прописано в коде (но, возможно, в вашем коде это не так).

Трудно понять, с какой датой вы хотите сравнить и почему не можете этого сделать.

Я думаю, вы хотите сделать что-то вроде этого:

[('date', '>=', 'start_date'), ('date', '<=', 'start_date')]

Домен определяется как список кортежей. Такой синтаксис означает, что по умолчанию между кортежами используется and. Вы можете указать это так (но это одно и то же):

['&', ('date', '>=', 'start_date'), ('date', '<=', 'start_date')]

Это означает то же самое, что и строка выше (если используется '|', означает or).

Дамы Odoo используют польскую нотацию: https://en.wikipedia.org/wiki/Polish_notation

А для форматирования дат вы можете использовать модуль Python datetime, чтобы изменить форматирование даты, если вам нужно.

person Andrius    schedule 29.06.2015

Вы можете попробовать что-то вроде этого

 cr.execute("SELECT id FROM hr_timesheet_sheet_sheet WHERE (date_from >= %s AND date_to <= %s) AND (user_id=%s) AND (id <> %s)",(sheet.date_from,sheet.date_to, new_user_id, sheet.id))                 
 if cr.fetchall():
     return False

Я надеюсь, что это должно быть полезно для вас :)

person DASADIYA CHAITANYA    schedule 26.06.2015
comment
Спасибо за ответ. Я не знаю, как я могу отформатировать дату с помощью метода и как я могу вызвать его, чтобы использовать start_date для форматирования. Это мне нужно точно. - person Achref MH; 26.06.2015

это простой пример: employee = self.env['hr.employee'].search([], order='name asc')

    for employee in employees:
        presence_count = self.env['hr.attendance'].search_count([
            ('employee_id', '=', employee.id),
            ('check_in', '>=', date_start_obj.strftime(DATETIME_FORMAT)),
            ('check_out', '<=', date_end_obj.strftime(DATETIME_FORMAT)),
        ])

        absence_count = date_diff - presence_count

        docs.append({
            'employee': employee.name,
            'presence': presence_count,
            'absence': absence_count,
        })
person Mohsen S. Hassan    schedule 02.01.2020