用于验证日期范围的 openERP 函数
openERP function for validate date range
我的模块中有两个字段(start_date 和 end_date)。我想验证日期范围,因为 end_date 必须大于 start_date 并显示类似 "End Date Should be greater than Start Date" This is mu cord.
的错误消息
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',
}
我该怎么做?请帮助我做到这一点...
为了加强数据完整性,odoo 支持两种类型的约束:SQL 和 Python。
SQL 约束添加到数据库中的 table 定义并由 PostgreSQL 实现。它们是使用 class 属性 _sql_constraints 定义的。它是一个元组列表,包含约束标识符名称、约束的 SQL 和要使用的错误消息。
Python约束
在 v7 中 api,
_constraint 是元组列表的集合。
元组包含三个参数,
- 方法名称(您实际逻辑编码的地方)
- 验证消息(您要向用户显示的消息)
- 字段列表(要应用约束的字段)
_constraint 将在 create/update 记录上的条件 returns 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
如果你想改变现有的约束,可以使用继承来完成see here
另一种解决方案是在客户端更改时对其进行验证,以便您立即响应:
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!'))
除了 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. ')
我的模块中有两个字段(start_date 和 end_date)。我想验证日期范围,因为 end_date 必须大于 start_date 并显示类似 "End Date Should be greater than Start Date" This is mu cord.
的错误消息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',
}
我该怎么做?请帮助我做到这一点...
为了加强数据完整性,odoo 支持两种类型的约束:SQL 和 Python。
SQL 约束添加到数据库中的 table 定义并由 PostgreSQL 实现。它们是使用 class 属性 _sql_constraints 定义的。它是一个元组列表,包含约束标识符名称、约束的 SQL 和要使用的错误消息。
Python约束
在 v7 中 api,
_constraint 是元组列表的集合。
元组包含三个参数,
- 方法名称(您实际逻辑编码的地方)
- 验证消息(您要向用户显示的消息)
- 字段列表(要应用约束的字段)
_constraint 将在 create/update 记录上的条件 returns 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
如果你想改变现有的约束,可以使用继承来完成see here
另一种解决方案是在客户端更改时对其进行验证,以便您立即响应:
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!'))
除了 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. ')