validation.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import re
  4. from library.validator import Validator, FieldValidationError, UnicodeValidationError
  5. from library.validator.fields import StringField, DictField
  6. from apps.web.merchant.constant import WechatSubjectType, ContactType
  7. class CodeNameValidator(Validator):
  8. name = StringField(required=True, unicodeName=u"地址名称", requiredError=UnicodeValidationError(detail=u"缺少地址名称"))
  9. code = StringField(required=True, unicodeName=u"地址编号", requiredError=UnicodeValidationError(detail=u"缺少地址编号"))
  10. @staticmethod
  11. def validate_name(value):
  12. if not value:
  13. raise UnicodeValidationError(detail=u"无效的地址名称")
  14. return value
  15. @staticmethod
  16. def validate(value):
  17. if not value:
  18. raise UnicodeValidationError(detail=u"无效的地址编号")
  19. return value
  20. class LegalValidator(Validator):
  21. # 身份图片信息
  22. urlA = StringField(required=True, unicodeName=u"法人身份证照片【人像面】", requiredError=UnicodeValidationError(detail=u"缺少身份证照片"))
  23. urlB = StringField(required=True, unicodeName=u"法人身份证照片【国徽面】", requiredError=UnicodeValidationError(detail=u"缺少身份证照片"))
  24. # 证件信息内容
  25. name = StringField(required=True, unicodeName=u"姓名", requiredError=UnicodeValidationError(detail=u"缺少法人姓名"))
  26. cardNo = StringField(required=True, unicodeName=u"证件号码", requiredError=UnicodeValidationError(detail=u"缺少法人证件号码"))
  27. startTime = StringField(required=True, unicodeName=u"签发日期", requiredError=UnicodeValidationError(detail=u"缺少法人证件签发日期"))
  28. endTime = StringField(required=True, unicodeName=u"失效日期", requiredError=UnicodeValidationError(detail=u"缺少法人证件失效日期"))
  29. # 省市区的地址回调
  30. province = DictField(validator=CodeNameValidator, required=True, unicodeName="法人身份证地区【省】", requiredError=UnicodeValidationError(detail=u"请选择法人身份证地区【省】"))
  31. city = DictField(validator=CodeNameValidator, required=True, unicodeName="法人身份证地区【市】", requiredError=UnicodeValidationError(detail=u"请选择法人身份证地区【市】"))
  32. area = DictField(validator=CodeNameValidator, required=True, unicodeName="法人身份证地区【区】", requiredError=UnicodeValidationError(detail=u"请选择法人身份证地区【区】"))
  33. # 详细地址的输入 街道等等
  34. addr = StringField(required=True, unicodeName="法人身份证【详细地址】", requiredError=UnicodeValidationError(detail=u"请填写法人身份证【详细地址】"))
  35. @staticmethod
  36. def validate(data):
  37. if not data:
  38. raise FieldValidationError(u"法人信息为空,请重新填写")
  39. return data
  40. class ContactValidator(Validator):
  41. # 身份图片信息
  42. urlA = StringField(required=True, unicodeName=u"联系人身份证照片【人像面】", requiredError=UnicodeValidationError(detail=u"缺少身份证照片"))
  43. urlB = StringField(required=True, unicodeName=u"联系人身份证照片【国徽面】", requiredError=UnicodeValidationError(detail=u"缺少身份证照片"))
  44. # 证件信息内容
  45. name = StringField(required=True, unicodeName=u"联系人姓名", requiredError=UnicodeValidationError(detail=u"缺少联系人姓名"))
  46. cardNo = StringField(required=True, unicodeName=u"联系人证件号码", requiredError=UnicodeValidationError(detail=u"缺少联系人证件号码"))
  47. startTime = StringField(required=True, unicodeName=u"联系人签发日期", requiredError=UnicodeValidationError(detail=u"缺少联系人证件签发日期"))
  48. endTime = StringField(required=True, unicodeName=u"联系人失效日期", requiredError=UnicodeValidationError(detail=u"缺少联系人证件失效日期"))
  49. province = DictField(validator=CodeNameValidator, required=True, unicodeName="联系人身份证地区【省】", requiredError=UnicodeValidationError(detail=u"请选择联系人身份证地区【省】"))
  50. city = DictField(validator=CodeNameValidator, required=True, unicodeName="联系人身份证地区【市】", requiredError=UnicodeValidationError(detail=u"请选择联系人身份证地区【市】"))
  51. area = DictField(validator=CodeNameValidator, required=True, unicodeName="联系人身份证地区【区】", requiredError=UnicodeValidationError(detail=u"请选择联系人身份证地区【区】"))
  52. # 详细地址的输入 街道等等
  53. addr = StringField(required=True, unicodeName="联系人身份证【详细地址】", requiredError=UnicodeValidationError(detail=u"请填写联系人身份证【详细地址】"))
  54. class BusinessLicenceValidator(Validator):
  55. busLicenseUrl = StringField(required=True, unicodeName=u"营业执照照片", requiredError=UnicodeValidationError(detail=u"缺少营业执照照片"))
  56. busName = StringField(required=True, unicodeName=u"公司名称", requiredError=UnicodeValidationError(detail=u"缺少公司名称"))
  57. busCode = StringField(required=True, unicodeName=u"统一社会信用码", requiredError=UnicodeValidationError(detail=u"缺少统一社会信用码"))
  58. startTime = StringField(required=True, unicodeName=u"营业执照起始时间", requiredError=UnicodeValidationError(detail=u"缺少营业执照起始时间"))
  59. endTime = StringField(required=True, unicodeName=u"营业执照结束事件", requiredError=UnicodeValidationError(detail=u"缺少营业执照结束事件"))
  60. province = DictField(validator=CodeNameValidator, required=True, unicodeName="营业执照地区【省】", requiredError=UnicodeValidationError(detail=u"请选择营业执照地区【省】"))
  61. city = DictField(validator=CodeNameValidator, required=True, unicodeName="营业执照地区【市】", requiredError=UnicodeValidationError(detail=u"请选择营业执照地区【市】"))
  62. area = DictField(validator=CodeNameValidator, required=True, unicodeName="营业执照地区【区】", requiredError=UnicodeValidationError(detail=u"请选择营业执照地区【区】"))
  63. addr = StringField(required=True, unicodeName=u"公司地址详细地址", requiredError=UnicodeValidationError(detail=u"缺少公司详细地址"))
  64. class SubjectValidator(Validator):
  65. businessLicenceInfo = DictField(validator=BusinessLicenceValidator, unicodeName=u"营业执照信息", requiredError=UnicodeValidationError(detail=u"缺少营业执照信息"))
  66. def validate(self, data):
  67. return data
  68. class CertificateValidator(Validator):
  69. merchantType = StringField(required=True, unicodeName=u"商户类型", requiredError=UnicodeValidationError(detail=u"缺少商户类型"))
  70. contactType = StringField(required=True, unicodeName="联系人类型", requiredError=UnicodeValidationError(detail=u"缺少联系人类型"))
  71. businessAuthorizationLetter = StringField(unicodeName="业务办理授权函")
  72. legalInfo = DictField(required=True, unicodeName=u"负责人/法人信息", requiredError=UnicodeValidationError(detail=u"缺少法人信息"), validator=LegalValidator)
  73. contactInfo = DictField(required=False, unicodeName=u"联系人信息", requiredError=UnicodeValidationError(detail=u"缺少联系人信息"), validator=ContactValidator)
  74. subjectInfo = DictField(required=False, unicodeName=u"主体信息【营业执照】", requiredError=UnicodeValidationError(detail=u"缺少营业执照信息"), Validator=SubjectValidator)
  75. @staticmethod
  76. def validate_merchantType(value):
  77. """
  78. 验证商户类型
  79. """
  80. if value not in WechatSubjectType.choices():
  81. raise FieldValidationError(u"错误的商户类型,请重新选择")
  82. return value
  83. def validate(self, data):
  84. if not data.get("contactInfo") and data["merchantType"] != WechatSubjectType.SUBJECT_TYPE_MICRO:
  85. raise UnicodeValidationError(detail=u"缺少联系人信息")
  86. if not data.get("subjectInfo") and data["merchantType"] != WechatSubjectType.SUBJECT_TYPE_MICRO:
  87. raise UnicodeValidationError(detail=u"缺少营业执照信息")
  88. # 处理联系人类型
  89. contactType = data.pop("contactType", str(ContactType.LEGAL.code))
  90. if data["merchantType"] != WechatSubjectType.SUBJECT_TYPE_MICRO:
  91. # 商户类型为企业且联系人类型为 经办人的情况下 需要检查授权书
  92. if contactType == ContactType.SUPER:
  93. businessAuthorizationLetter = data.pop("businessAuthorizationLetter", None)
  94. if not businessAuthorizationLetter:
  95. raise UnicodeValidationError(detail=u"缺少业务办理授权函")
  96. else:
  97. businessAuthorizationLetter = ""
  98. else:
  99. contactType = str(ContactType.LEGAL.code)
  100. businessAuthorizationLetter = ""
  101. # 小微商户的情况下 ,联系人即为自身
  102. if data["merchantType"] == WechatSubjectType.SUBJECT_TYPE_MICRO:
  103. data["contactInfo"] = data["legalInfo"].copy()
  104. data["contactInfo"]["contactType"] = contactType
  105. data["contactInfo"]["businessAuthorizationLetter"] = businessAuthorizationLetter
  106. return data
  107. class SettleValidator(Validator):
  108. """
  109. 结算信息的校验
  110. 结算信息无论是企业商户还是个人商户都 需要的信息 并且字段一致
  111. """
  112. bankCardImg = StringField(required=True, unicodeName="银行卡照片", requiredError=UnicodeValidationError(detail=u"银行照片缺失,请确认照片信息上传"))
  113. bankName = StringField(required=True, unicodeName="银行名称", requiredError=UnicodeValidationError(detail=u"银行名称缺失,请确认银行名称选择正确"))
  114. bankCardCode = StringField(required=True, unicodeName="银行卡号", requiredError=UnicodeValidationError(detail=u"银行卡号缺失,请确认卡号填写无误"))
  115. bankCardSubCode = StringField(required=True, unicodeName="支行联行号", requiredError=UnicodeValidationError(detail=u"支行联行号缺失,请确认支行选择无误"))
  116. bankCardSubName = StringField(required=True, unicodeName="支行名称", requiredError=UnicodeValidationError(detail=u"支行联行号缺失,请确认支行选择无误"))
  117. @staticmethod
  118. def validate_backCardImg(value):
  119. if not value:
  120. raise UnicodeValidationError(detail=u"无效的银行卡照片,请重新上传")
  121. return value
  122. @staticmethod
  123. def validate_bankName(value):
  124. if not value:
  125. raise UnicodeValidationError(detail=u"无效的银行名称,请重新上传")
  126. return value
  127. @staticmethod
  128. def validate_bankCardCode(value):
  129. if not value:
  130. raise UnicodeValidationError(detail=u"无效的银行卡号,请重新上传")
  131. return value
  132. @staticmethod
  133. def validate_bankCardSubCode(value):
  134. if not value:
  135. raise UnicodeValidationError(detail=u"无效的开户行支行(10001),请重新上传")
  136. return value
  137. @staticmethod
  138. def validate_bankCardSubName(value):
  139. if not value:
  140. raise UnicodeValidationError(detail=u"无效的开户行支行(10002),请重新上传")
  141. return value
  142. class BusinessValidator(Validator):
  143. storeAUrl = StringField(required=True, unicodeName=u"门头照片", requiredError=UnicodeValidationError(detail=u"门头照片缺失,请确认照片上传信息"))
  144. storeBUrl = StringField(required=True, unicodeName=u"门店照片", requiredError=UnicodeValidationError(detail=u"门店照片缺失,请确认照片上传信息"))
  145. storeCUrl = StringField(required=True, unicodeName=u"店内照片", requiredError=UnicodeValidationError(detail=u"店内照片缺失,请确认照片上传信息"))
  146. storeShotName = StringField(required=True, unicodeName=u"商户简称", requiredError=UnicodeValidationError(detail=u"商户简称缺失,请填写商户简称"))
  147. province = DictField(validator=CodeNameValidator, required=True, unicodeName="营业地区【省】", requiredError=UnicodeValidationError(detail=u"请选择营业地区【省】"))
  148. city = DictField(validator=CodeNameValidator, required=True, unicodeName="营业地区【市】", requiredError=UnicodeValidationError(detail=u"请选择营业地区【市】"))
  149. area = DictField(validator=CodeNameValidator, required=True, unicodeName="营业地区【区】", requiredError=UnicodeValidationError(detail=u"请选择营业地区【区】"))
  150. addr = StringField(required=True, unicodeName="营业地区【详细地址】", requiredError=UnicodeValidationError(detail=u"请填写营业地区【详细地址】"))
  151. @staticmethod
  152. def validate_storeAUrl(value):
  153. if not value:
  154. raise UnicodeValidationError(detail=u"无效的门头照,请重新上传")
  155. return value
  156. @staticmethod
  157. def validate_storeBUrl(value):
  158. if not value:
  159. raise UnicodeValidationError(detail=u"无效的门店照,请重新上传")
  160. return value
  161. @staticmethod
  162. def validate_storeCUrl(value):
  163. if not value:
  164. raise UnicodeValidationError(detail=u"无效的店内照,请重新上传")
  165. return value
  166. @staticmethod
  167. def validate_addr(value):
  168. if not value:
  169. raise UnicodeValidationError(u"无效的营业地区【详细地址】,请重新填写")
  170. return value