Функция openERP для проверки диапазона дат

У меня есть два поля в моем модуле (start_date и end_date). Я хочу проверить диапазон дат, так как end_date должен быть больше, чем start_date, и отобразить сообщение об ошибке, например «Дата окончания должна быть больше, чем дата начала». Это мю шнур.

from openerp.osv import osv, fields


class op_batch(osv.Model):

    _name = 'op.batch'
    _columns = {
        'name': fields.char(size=25, string='Name', required=True),
        'code': fields.char(size=15, string='Code', required=True),
        'start_date': fields.date(size=15, string='Start Date', required=True),
        'end_date': fields.date(size=15, string='End Date', required=True, onchange="validate_date_range"),
        'state': fields.selection(
        [('planned', 'Planned'), ('running', 'Running'), ('cancel', 'Cancel'), ('finished', 'finished')],
        string='State'),
        'course_id': fields.many2one('op.course', string='Course', ondelete='restrict', required=True),
}

    def validate_date_range(self, cr, uid, vals, context=None):
        en_date = date.start_date.value
        st_date = date.end_date.value
        if en_date < st_date:
            raise Warning(_("End Date Should be greater than Start Date"))
    return True

    _sql_constraints = [('code', 'UNIQUE (code)', 'The CODE of the Batch must be unique!')]

    _defaults = {
    'state': 'planned',
    }

как мне это сделать? Пожалуйста, помогите мне сделать это...


person Chamal    schedule 01.04.2015    source источник


Ответы (3)


Для обеспечения целостности данных odoo поддерживает два типа ограничений: SQL и Python.

Ограничения SQL добавляются к определению таблицы в базе данных и реализуются PostgreSQL. Они определяются с помощью атрибута класса _sql_constraints. Это список кортежей с именем идентификатора ограничения, SQL для ограничения и используемым сообщением об ошибке.

Ограничение Python

В v7 API,

_constraint – это набор списков кортежей.

Кортеж содержит три параметра,

  1. Имя метода (где закодирована ваша фактическая логика)
  2. Сообщение проверки (сообщение, которое вы хотите показать пользователю)
  3. Список полей (поля, к которым вы хотите применить ограничение)

_constraint вызовет сообщение проверки, если условие возвращает False при создании/обновлении записи.

Просто добавьте ограничения для этого,

def _check_date(self, cr, uid, vals, context=None):
    for obj in self.browse(cr, uid, ids):
        start_date = obj.start_date
        end_date = obj.end_date

        if start_date and end_date:
            DATETIME_FORMAT = "%Y-%m-%d"  ## Set your date format here
            from_dt = datetime.datetime.strptime(start_date, DATETIME_FORMAT)
            to_dt = datetime.datetime.strptime(end_date, DATETIME_FORMAT)

            if to_dt < from_dt:
                return False
    return True

_constraints = [
        (_check_date, 'Your Message!', ['start_date','end_date']),
    ]

В v8 API,

@api.constrains

Этот декоратор гарантирует, что декорированная функция будет вызываться при операции создания, записи, отмены связи. Если ограничение выполнено, функция должна вызвать openerp.exceptions.Warning с соответствующим сообщением.

@api.multi
@api.constrains('start_date','end_date')
def _check_date(self):
    for obj in self:
        start_date = obj.start_date
        end_date = obj.end_date

        if start_date and end_date:
            DATETIME_FORMAT = "%Y-%m-%d"  ## Set your date format here
            from_dt = datetime.datetime.strptime(start_date, DATETIME_FORMAT)
            to_dt = datetime.datetime.strptime(end_date, DATETIME_FORMAT)

            if to_dt < from_dt:
                #raise your exception

Если вы хотите изменить существующие ограничения, это можно сделать с помощью наследования см. здесь

person Emipro Technologies Pvt. Ltd.    schedule 01.04.2015
comment
Спасибо, Emipro Technologies. Это было очень полезно. Также мне нужно изменить идентификаторы в методе просмотра и импортировать дату и время. БЛАГОДАРЮ ВАС - person Chamal; 02.04.2015
comment
Спасибо за дополнения. - person Emipro Technologies Pvt. Ltd.; 02.04.2015
comment
Почему вы используете материал формата? Вы можете просто сравнить строки... или нет? Я думал, что дата всегда преобразовывалась в %Y-%m-%d перед запуском проверки ограничения. - person yucer; 23.10.2015
comment
Этому есть веская причина: если вы не конвертируете это в объект, то это считается сравнением строк, а для строки (даже формат тот же) это не даст идеального результата, скажем, '2015-10-03 ' и '2015-2-04' это не даст вам правильного результата. - person Emipro Technologies Pvt. Ltd.; 23.10.2015
comment
если для месяца указан однозначный формат, то для февраля это 2, а для октября - 10, а в строке февраль выше, чем октябрь :) - person Emipro Technologies Pvt. Ltd.; 23.10.2015

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

from openerp import exceptions, _

    @api.onchange('start_date','end_date')
    def check_change(self):
        if start_date > end_date:   # already in "%Y-%m-%d" format
            raise exceptions.ValidationError(_('Your Message!'))
person yucer    schedule 23.10.2015
comment
Я должен добавить, что здесь легко, потому что у вас есть обе даты от клиента для сравнения. Но я не очень хорошо знаю, как действовать при сравнении с текущей датой, потому что этот код работает на сервере. Я не помню, конвертируются ли даты в часовой пояс сервера перед запуском onchage API. - person yucer; 23.10.2015

Помимо onchange, мы можем использовать ограничения... Это помогает проверять что-то при создании и редактировании, а также при изменении. Вот мой код, и он отлично работает

@api.multi
@api.constrains('start_date', 'start_date')
def _check_date(self):
    start_date = self.start_date
    end_date = self.end_date

    if (start_date and end_date) and (start_date > end_date):
        raise ValidationError(_('The start date must be less than to the end date. ')
person Ridma Gimhani    schedule 29.03.2018
comment
Спасибо за ответы на вопросы, но этот ответ не добавляет никакой дополнительной ценности, поскольку то же самое уже указано в принятом ответе. На SO мы не любим повторений. Пожалуйста, рассмотрите возможность удаления этого ответа. - person ViG; 29.03.2018