跳转到主要内容

在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_strstr 创建 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

任何人可免费获得此软件及其相关文档副本(“软件”),不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供副本的个人执行上述操作,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论基于合同、侵权或其他原因,由此软件或软件的使用或其他方式产生、产生于或与软件有关。

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面