当前位置: 首页 > 知识库问答 >
问题:

覆盖OpenERP约束

满玉泽
2023-03-14

我想编写一个模块来覆盖模型对象上的一个约束,但仅仅覆盖约束方法是行不通的。我对方法的重写从未被调用,因为OpenERP使用它自己的继承机制。

我试图在hr_timesheet_sheet模块中使登录/注销操作的规则更加灵活,以便员工可以在今天登录后记录前一天的工作时间。为此,我想覆盖action字段上的hr.attendance约束并允许任何更改,然后在时间表级别执行检查,以确保所有出勤操作都在逻辑序列中。

我找到了hr。出勤限制。

def _altern_si_so(self, cr, uid, ids, context=None):
    """ Alternance sign_in/sign_out check.
        Previous (if exists) must be of opposite action.
        Next (if exists) must be of opposite action.
    """
    for att in self.browse(cr, uid, ids, context=context):
        # search and browse for first previous and first next records
        prev_att_ids = self.search(cr, uid, [('employee_id', '=', att.employee_id.id), ('name', '<', att.name), ('action', 'in', ('sign_in', 'sign_out'))], limit=1, order='name DESC')
        next_add_ids = self.search(cr, uid, [('employee_id', '=', att.employee_id.id), ('name', '>', att.name), ('action', 'in', ('sign_in', 'sign_out'))], limit=1, order='name ASC')
        prev_atts = self.browse(cr, uid, prev_att_ids, context=context)
        next_atts = self.browse(cr, uid, next_add_ids, context=context)
        # check for alternance, return False if at least one condition is not satisfied
        if prev_atts and prev_atts[0].action == att.action: # previous exists and is same action
            return False
        if next_atts and next_atts[0].action == att.action: # next exists and is same action
            return False
        if (not prev_atts) and (not next_atts) and att.action != 'sign_in': # first attendance must be sign_in
            return False
    return True

_constraints = [(_altern_si_so, 'Error: Sign in (resp. Sign out) must follow Sign out (resp. Sign in)', ['action'])]

我尝试重写模块中的约束方法,但从未调用我的版本。

def _altern_si_so(self, cr, uid, ids):
    """ Implementing this logic at the attendance level doesn't work, so
    we skip it, and check at the whole time sheet level. 's all good!"""
    return True

我还尝试在同一个字段上添加我自己的约束,但是它调用了两个版本,基本模块的约束可以拒绝保存。

共有1个答案

姚新霁
2023-03-14

我在launchpad上发现了一个bug,它描述了我遇到的问题和修复方法。事实证明,您现在可以覆盖约束,但这非常复杂。您必须在与基本模块具有相同函数名的同一字段上声明自己的约束。然后,也只有到那时,它才会调用您的约束,而不是基本版本。

这是我的模块,它覆盖了行动上的hr\u考勤约束,并允许任何组合。

class hr_attendance(osv.osv):
    _inherit = 'hr.attendance'

    def _altern_si_so(self, cr, uid, ids):
        """ Implementing this logic at the attendance level doesn't work, so
        we skip it, and check at the whole time sheet level. 's all good!"""
        return True

    _constraints = [(_altern_si_so, 
                     'Error: You should never see this message.', 
                     ['action'])]
 类似资料:
  • 与此问题相关。为了自定义我在自定义层中创建的内核配置,此结构: 其中文件实际上是用于手动编译内核(请参阅其他问题)。文件包含以下代码: 我确信该文件已得到处理,因为如果我更改 defconfig 的名称,则会引发“找不到文件”错误。 问题是编译后的内核没有我的自定义。但是如果我将我的deconfig复制到构建目录(即

  • 问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对

  • 我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)

  • 问题内容: 我试图在php中覆盖我的位置,但是我仍然在php.ini文件中获得了2 mb的值。 问题答案: 通过进行设置时,这些设置不会有任何效果。 原因是PHP 在 执行脚本 之前 需要这些值。上载时,将在完成上载后执行目标脚本,因此PHP需要事先知道最大大小。 在,虚拟主机配置或文件中进行设置。一个典型的文件如下所示:

  • 问题内容: 我的Java应用程序引用了一个使用log4j日志记录的第三方jar文件。问题是该jar包含自己的log4j.properties文件,这会导致我的机器上的访问被拒绝的异常,但是我无法控制jar文件来更改其内容。 我尝试在应用程序的类路径中添加自己的log4j.properties文件,但似乎没有效果。如果我尝试使用PropertyConfigurator以编程方式导入自己的设置,则lo

  • 在上一章中,我们讨论了超类和子类。 如果一个类从其超类继承一个方法,那么只要它没有标记为final,就有可能覆盖该方法。 覆盖的好处是:能够定义特定于子类类型的行为,这意味着子类可以根据其需求实现父类方法。 在面向对象的术语中,覆盖意味着覆盖现有方法的功能。 例子 (Example) 我们来看一个例子。 class Animal { public void move() { Sy