我对 OpenERP 复制感到疯狂,如果我复制员工目录中的用户,它会复制所有内容(系统的每个用户),如果我复制一个组,它只会复制一些内容,显然它不会创建副本...如果我复制菜单,它不会复制子菜单选项。
WTF 会在“幕后”重复做事吗?副本和副本一样吗?它是否创建一个指向同一对象的新引用?是浅拷贝还是深拷贝?
我使用的是 OpenERP 7 LTS。
重复的菜单调用 OpenERPcopy方法,默认情况下该方法实现为浅表副本(关系除外)one2many。
浅复制意味着创建记录的新副本,并尽可能复制所有字段值作为引用。例如,如果您复制一名员工,则复制员工的部门将简单地设置为与被复制员工相同的部门,系统不会创建该部门的副本。
对于one2many关系(通常是连接父记录与其子记录的关系,如发票与其行之间的关系),子记录也会重复,因为原始记录无法从其原始父记录中剥离。当关系将记录连接到实际上不是其子项的“相关记录”时,
此默认行为可能会导致不可预见的副作用:例如,关系可以将员工链接到她的时间表条目,但在以下情况下这些条目绝对不应该重复:该员工是重复的。one2manyone2many
因此,OpenERP的各种对象模型可以在copy操作过程中实现额外的逻辑,并显式关闭不包含真正“子项”的关系的重复one2many,以及更改任何复制的值(例如在记录名称)。
如果您在仅使用标准 OpenERP 模块复制记录时看到不正确的行为,则可能是一个错误,应在官方 bugtracker上报告。如果您使用额外的模块,请确保它们不会one2many在某些模型上添加字段而不copy相应地覆盖该方法。
PS:如果您复制“员工目录”中的记录,您实际上是在复制员工(人力资源资源),而不是用户(具有登录访问权限的用户帐户)。这些在 OpenERP 中是独立的概念,因为有些员工可能不需要登录(没有用户帐户),而有些用户可能不是员工(例如承包商或系统帐户)。
更新: OpenERP 7.0中当前存在一个错误,导致复制用户时相关员工的复制无效,以及复制员工时导致下属的类似复制。这个错误说明了当模块无法正确处理它们定义的 one2many 关系的重复时会发生什么情况。