Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

验证身份证格式的方法



  • def checkIdcard(self, cr, uid, ids, identification_id, context=None):<br />    Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!','身份证地区非法!']<br />    area={"11":"北京","12":"天津","13":"河北","14":"山西","15":"内蒙古","21":"辽宁","22":"吉林","23":"黑龙江","31":"上海","32":"江苏","33":"浙江","34":"安徽","35":"福建","36":"江西","37":"山东","41":"河南","42":"湖北","43":"湖南","44":"广东","45":"广西","46":"海南","50":"重庆","51":"四川","52":"贵州","53":"云南","54":"西藏","61":"陕西","62":"甘肃","63":"青海","64":"宁夏","65":"新疆","71":"台湾","81":"香港","82":"澳门","91":"国外"}<br />    identification_id=str(identification_id)<br />    identification_id=identification_id.strip()<br />    identification_id_list=list(identification_id)<br />    #地区校验<br />    if(not area[(identification_id)[0:2]]):<br />        raise osv.except_osv(_('提示!'), (''%s&#039;.') %(Errors[4],))<br />    #15位身份号码检测<br />    if(len(identification_id)==15):<br />        if((int(identification_id[6:8])+1900) % 4 == 0 or((int(identification_id[6:8])+1900) % 100 == 0 and (int(identification_id[6:8])+1900) % 4 == 0 )):<br />            erg=re.compile('[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$')#//测试出生日期的合法性<br />        else:<br />            ereg=re.compile('[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$')#//测试出生日期的合法性<br />        if(re.match(ereg,identification_id)):<br /> raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[0],))<br />            <br />        else:<br />            raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[2],))<br />    #18位身份号码检测<br />    elif(len(identification_id)==18):<br />        #出生日期的合法性检查<br />        #闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))<br />        #平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))<br />        if(int(identification_id[6:10]) % 4 == 0 or (int(identification_id[6:10]) % 100 == 0 and int(identification_id[6:10])%4 == 0 )):<br />            ereg=re.compile('[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$')#//闰年出生日期的合法性正则表达式<br />        else:<br />            ereg=re.compile('[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$')#//平年出生日期的合法性正则表达式<br />        #//测试出生日期的合法性<br />        if(re.match(ereg,identification_id)):<br />            #//计算校验位<br />            S = (int(identification_id_list[0]) + int(identification_id_list[10])) * 7 + (int(identification_id_list[1]) + int(identification_id_list[11])) * 9 + (int(identification_id_list[2]) + int(identification_id_list[12])) * 10 + (int(identification_id_list[3]) + int(identification_id_list[13])) * 5 + (int(identification_id_list[4]) + int(identification_id_list[14])) * 8 + (int(identification_id_list[5]) + int(identification_id_list[15])) * 4 + (int(identification_id_list[6]) + int(identification_id_list[16])) * 2 + int(identification_id_list[7]) * 1 + int(identification_id_list[8]) * 6 + int(identification_id_list[9]) * 3<br />            Y = S % 11<br />            M = "F"<br />            JYM = "10X98765432"<br />            M = JYM[Y]#判断校验位<br />            if(M == identification_id_list[17]):#检测ID的校验位<br />                raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[0],))<br />            else:<br />                raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[3],))<br />        else:<br />            raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[2],))<br />    else:<br />        raise osv.except_osv(('提示!'), _(''%s&#039;.') %(Errors[1],))



  • def checkIdcard(self, cr, uid, ids, identification_id, context=None):<br />    Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!','身份证地区非法!']<br />    area={"11":"北京","12":"天津","13":"河北","14":"山西","15":"内蒙古","21":"辽宁","22":"吉林","23":"黑龙江","31":"上海","32":"江苏","33":"浙江","34":"安徽","35":"福建","36":"江西","37":"山东","41":"河南","42":"湖北","43":"湖南","44":"广东","45":"广西","46":"海南","50":"重庆","51":"四川","52":"贵州","53":"云南","54":"西藏","61":"陕西","62":"甘肃","63":"青海","64":"宁夏","65":"新疆","71":"台湾","81":"香港","82":"澳门","91":"国外"}<br />    identification_id=str(identification_id)<br />    identification_id=identification_id.strip()<br />    identification_id_list=list(identification_id)<br />    #地区校验<br />    if(not area[(identification_id)[0:2]]):<br />        raise osv.except_osv(_('提示!'), (''%s&#039;.') %(Errors[4],))<br />    #15位身份号码检测<br />    if(len(identification_id)==15):<br />        if((int(identification_id[6:8])+1900) % 4 == 0 or((int(identification_id[6:8])+1900) % 100 == 0 and (int(identification_id[6:8])+1900) % 4 == 0 )):<br />            erg=re.compile('[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$')#//测试出生日期的合法性<br />        else:<br />            ereg=re.compile('[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$')#//测试出生日期的合法性<br />        if(re.match(ereg,identification_id)):<br /> raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[0],))<br />            <br />        else:<br />            raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[2],))<br />    #18位身份号码检测<br />    elif(len(identification_id)==18):<br />        #出生日期的合法性检查<br />        #闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))<br />        #平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))<br />        if(int(identification_id[6:10]) % 4 == 0 or (int(identification_id[6:10]) % 100 == 0 and int(identification_id[6:10])%4 == 0 )):<br />            ereg=re.compile('[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$')#//闰年出生日期的合法性正则表达式<br />        else:<br />            ereg=re.compile('[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$')#//平年出生日期的合法性正则表达式<br />        #//测试出生日期的合法性<br />        if(re.match(ereg,identification_id)):<br />            #//计算校验位<br />            S = (int(identification_id_list[0]) + int(identification_id_list[10])) * 7 + (int(identification_id_list[1]) + int(identification_id_list[11])) * 9 + (int(identification_id_list[2]) + int(identification_id_list[12])) * 10 + (int(identification_id_list[3]) + int(identification_id_list[13])) * 5 + (int(identification_id_list[4]) + int(identification_id_list[14])) * 8 + (int(identification_id_list[5]) + int(identification_id_list[15])) * 4 + (int(identification_id_list[6]) + int(identification_id_list[16])) * 2 + int(identification_id_list[7]) * 1 + int(identification_id_list[8]) * 6 + int(identification_id_list[9]) * 3<br />            Y = S % 11<br />            M = "F"<br />            JYM = "10X98765432"<br />            M = JYM[Y]#判断校验位<br />            if(M == identification_id_list[17]):#检测ID的校验位<br />                raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[0],))<br />            else:<br />                raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[3],))<br />        else:<br />            raise osv.except_osv(('提示!'), (''%s&#039;.') %(Errors[2],))<br />    else:<br />        raise osv.except_osv(('提示!'), _(''%s&#039;.') %(Errors[1],))



  • 分享 @步科 大大分享的扩展..:<br /><br />[attachimg=1]



  • buke威武,总监威武,已加标签。


  • 管理员

    很好的分享,谢谢。



  • 被贴了 就转图片为文字儿吧:<br /><br />https://pypi.python.org/pypi/python-stdnum<br /><br />[code]<br /><br />...<br />>>> from stdnum.iso7064 import mod_11_2<br />>>> mod_11_2.calc_check_digit('44022919890604423')<br />'X'<br />>>> mod_11_2.validate('44022919890604423X')<br />'44022919890604423X'<br />>>> mod_11_2.validate('440229198906044234')<br />Traceback (most recent call last):<br />  File "<stdin>", line 1, in <module><br />  File "D:\Program Files\Python27\lib\site-packages\stdnum\iso7064\mod_11_2.py",<br /> line 65, in validate<br />    raise InvalidChecksum()<br />stdnum.exceptions.InvalidChecksum: The number's checksum or check digit is inval<br />id.<br />>>> mod_11_2.validate('440229198906044231')<br />Traceback (most recent call last):<br />  File "<stdin>", line 1, in <module><br />  File "D:\Program Files\Python27\lib\site-packages\stdnum\iso7064\mod_11_2.py",<br /> line 65, in validate<br />    raise InvalidChecksum()<br />stdnum.exceptions.InvalidChecksum: The number's checksum or check digit is inval<br />id.<br />>>> mod_11_2.validate('440229198906044236')<br />Traceback (most recent call last):<br />  File "<stdin>", line 1, in <module><br />  File "D:\Program Files\Python27\lib\site-packages\stdnum\iso7064\mod_11_2.py",<br /> line 65, in validate<br />    raise InvalidChecksum()<br />stdnum.exceptions.InvalidChecksum: The number's checksum or check digit is inval<br />id.<br />>>> mod_11_2.validate('44022919890605423X')<br />Traceback (most recent call last):<br />  File "<stdin>", line 1, in <module><br />  File "D:\Program Files\Python27\lib\site-packages\stdnum\iso7064\mod_11_2.py",<br /> line 65, in validate<br />    raise InvalidChecksum()<br />stdnum.exceptions.InvalidChecksum: The number's checksum or check digit is inval<br />id.<br />>>><br /><br />...<br />[/code]


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待