【分享】仅限制公司名唯一
-
网上找得到的都是限制合作伙伴partner名称唯一的,V7.0联系人和公司放在一张表里,如果限制partner名唯一,就无法创建同名联系人了。
搜源码,照着addons\base\res\res_currency.py, 拼凑了一下,测试居然成功了 ;D
主要代码,不当之处,恳请斧正:# -*- coding: utf-8 -*-<br /><br />from openerp.osv import fields, osv<br /><br />class res_partner(osv.osv):<br /> _inherit = 'res.partner'<br /><br /> _sql_constraints = [<br /> # Empty constraint, complemented by unique index (see below)<br /> # Still useful to keep sql constraints because it provides a proper error message when a violation occurs.<br /> # Because the constraint and index share the same prefix so that IntegrityError triggered by the index will be caught<br /> # and reported to the user with the sql constraint's error message.<br /> ('name_is_company_unique', 'unique ()', 'Company names must be unique'),<br /> ]<br /><br /> def init(self, cr, context=None):<br /> super(res_partner, self)._auto_init(cr, context)<br /> cr.execute("""SELECT indexname FROM pg_indexes WHERE indexname = 'res_partner_name_is_company_unique_idx'""")<br /> if not cr.fetchone():<br /> cr.execute("""CREATE UNIQUE INDEX "res_partner_name_is_company_unique_idx" ON res_partner (name) WHERE is_company IS True""")<br /><br />res_partner()
两张图解释以上代码中的注释部分:
[attach=1] [attach=2]
下载:<br / https://github.com/youring/company_unique br />OpenERP 7.0 装完此模块后,创建合作伙伴Partner时,如果选中“是一个公司” (is_company = true),则无法创建同名partner,即公司名要唯一;
如果取消选中“是一个公司” ,则可以创建同名partner,即联系人可以同名,比如可以创建n个张先生。 -
unique (name, is_company) 不仅限制了公司同名,也限制了联系人同名。
而实际上,公司内或公司之间,联系人同名的情况很常见。
紧靠sql constraint无法实现上述要求,见
\addons\base\res\res_currency.py def init(self, cr):<br /> # CONSTRAINT/UNIQUE INDEX on (name,company_id) <br /> # /!\ The unique constraint 'unique_name_company_id' is not sufficient, because SQL92<br /> # only support field names in constraint definitions, and we need a function here:<br /> # we need to .....