在Django中验证和存储增值税信息交换系统(VIES)数据。
项目描述
在Django中验证和存储增值税信息交换系统(VIES)数据。
安装
python3 -m pip install django-vies
使用
VATINField for models
from django.db import models
from vies.models import VATINField
class Company(models.Model):
name = models.CharField(max_length=100)
vat = VATINField(blank=True, null=True)
VATIN 包装类,允许访问结果。
>>> from vies.types import VATIN
>>> vat = VATIN('LU', '26375245')
>>> vat.is_valid()
True
>>> vat.data
{
'countryCode': 'LU',
'vatNumber': '26375245',
'requestDate': datetime.date(2020, 4, 13),
'valid': True,
'name': 'AMAZON EUROPE CORE S.A R.L.',
'address': '38, AVENUE JOHN F. KENNEDY\nL-1855 LUXEMBOURG'
}
您还可以使用类方法 VATIN.from_str 从 str 创建 VATIN。
>>> from vies.types import VATIN
>>> vat = VATIN.from_str('LU26375245')
>>> vat.is_valid()
True
VIES API端点可能非常不可靠,并且似乎存在基于IP的访问限制。因此,VATINField 默认不执行基于API的验证。它需要显式启用或在单独的任务中执行。
例如:
from vies.models import VATINField
from vies.validators import VATINValidator
class Company(models.Model):
name = models.CharField(max_length=100)
vat = VATINField(validators=[VATINValidator(verify=True, validate=True)])
validate=True 将告诉验证器针对VIES API进行验证。默认启用 verify,它将仅验证VATIN是否符合国家的规定。
建议在异步任务中执行VIES API验证。
例如,使用celery
from celery import shared_task
from vies.models import VATINField
from vies.types import VATIN
from django.core.exceptions import ValidationError
class Company(models.Model):
name = models.CharField(max_length=100)
vat = VATINField()
vat_is_valid = models.BooleanField(default=False)
def __init__(self, *args, **kwargs):
super(Company, self).__init__(*args, **kwargs)
self.__vat = self.vat
def save(self, *args, **kwargs):
if self.__vat != self.vat:
validate_vat_field.delay(self.pk)
super(Company, self).save(*args, **kwargs)
self.__vat = self.vat
def refresh_from_db(self, *args, **kwargs)
super(Company, self).refresh_from_db(*args, **kwargs)
self.__vat = self.vat
@shared_task
def validate_vat_field(company_id):
company = Company.objects.get(pk=company_id)
vat = VATIN.from_str(company.vat)
try:
vat.validate()
except ValidationError:
company.vat_is_valid = False
else:
company.vat_is_valid = True
finally:
company.save(update_fields=['vat_is_valid'])
您还可以使用 celery.current_app.send_task('validate_vat_field', kwargs={"company_id": self.pk}) 调用异步任务以避免 循环导入错误。
翻译
欢迎贡献翻译,这很简单!
cd vies
django-admin makemessages -l $YOUR_COUNTRY_CODE
只需编辑生成的 PO 文件。欢迎提交拉取请求!
许可证
MIT 许可证 (MIT)
版权所有 (c) 2014-2016 Johannes Hoppe
任何人可免费获得此软件及其相关文档副本(“软件”),不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供副本的个人执行上述操作,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论基于合同、侵权或其他原因,由此软件或软件的使用或其他方式产生、产生于或与软件有关。