Use a choice field for invoice address countries

This commit is contained in:
Raphael Michel
2017-07-19 12:08:18 +02:00
parent f8ed21c819
commit d2b0e7209f
13 changed files with 96 additions and 14 deletions

View File

@@ -9,7 +9,17 @@ from pretix.base.models import (
from pretix.base.signals import register_ticket_outputs
class CompatibleCountryField(serializers.Field):
def to_representation(self, instance: InvoiceAddress):
if instance.country:
return str(instance.country)
else:
return instance.country_old
class InvoiceAdddressSerializer(I18nAwareModelSerializer):
country = CompatibleCountryField(source='*')
class Meta:
model = InvoiceAddress
fields = ('last_modified', 'company', 'name', 'street', 'zipcode', 'city', 'country', 'vat_id')

View File

@@ -100,7 +100,7 @@ class OrderListExporter(BaseExporter):
order.invoice_address.street,
order.invoice_address.zipcode,
order.invoice_address.city,
order.invoice_address.country,
order.invoice_address.country if order.invoice_address.country else order.invoice_address.country_old,
order.invoice_address.vat_id,
]
except InvoiceAddress.DoesNotExist:

View File

@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-07-19 09:10
from __future__ import unicode_literals
import django_countries
from django.db import migrations, models
def fwd(app, schema_editor):
InvoiceAddress = app.get_model('pretixbase', 'InvoiceAddress')
for ia in InvoiceAddress.objects.all():
if ia.company or ia.vat_id:
ia.is_business = True
ia.save()
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0069_invoice_prefix'),
]
operations = [
migrations.RenameField(
model_name='invoiceaddress',
old_name='country',
new_name='country_old',
),
migrations.AddField(
model_name='invoiceaddress',
name='country',
field=django_countries.fields.CountryField(default='', max_length=2, verbose_name='Country'),
preserve_default=False,
),
migrations.AddField(
model_name='invoiceaddress',
name='is_business',
field=models.BooleanField(default=False, verbose_name='Business customer'),
),
migrations.RunPython(
fwd, migrations.RunPython.noop
),
]

View File

@@ -19,6 +19,7 @@ from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.timezone import make_aware, now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django_countries.fields import CountryField
from pretix.base.reldate import RelativeDateWrapper
@@ -727,13 +728,15 @@ class CartPosition(AbstractPosition):
class InvoiceAddress(models.Model):
last_modified = models.DateTimeField(auto_now=True)
is_business = models.BooleanField(default=False, verbose_name=_('Business customer'))
order = models.OneToOneField(Order, null=True, blank=True, related_name='invoice_address')
company = models.CharField(max_length=255, blank=True, verbose_name=_('Company name'))
name = models.CharField(max_length=255, verbose_name=_('Full name'), blank=True)
street = models.TextField(verbose_name=_('Address'), blank=False)
zipcode = models.CharField(max_length=30, verbose_name=_('ZIP code'), blank=False)
city = models.CharField(max_length=255, verbose_name=_('City'), blank=False)
country = models.CharField(max_length=255, verbose_name=_('Country'), blank=False)
country_old = models.CharField(max_length=255, verbose_name=_('Country'), blank=False)
country = CountryField(verbose_name=_('Country'), blank=False, blank_label=_('Select country'))
vat_id = models.CharField(max_length=255, blank=True, verbose_name=_('VAT ID'))

View File

@@ -37,8 +37,11 @@ def build_invoice(invoice: Invoice) -> Invoice:
{i.name}
{i.street}
{i.zipcode} {i.city}
{i.country}""")
invoice.invoice_to = addr_template.format(i=invoice.order.invoice_address).strip()
{country}""")
invoice.invoice_to = addr_template.format(
i=invoice.order.invoice_address,
country=invoice.order.invoice_address.country.name if invoice.order.invoice_address.country else invoice.order.invoice_address.country_old
).strip()
if invoice.order.invoice_address.vat_id:
invoice.invoice_to += "\n" + pgettext("invoice", "VAT-ID: %s") % invoice.order.invoice_address.vat_id
except InvoiceAddress.DoesNotExist:

View File

@@ -347,7 +347,7 @@
<dt>{% trans "ZIP code and city" %}</dt>
<dd>{{ order.invoice_address.zipcode }} {{ order.invoice_address.city }}</dd>
<dt>{% trans "Country" %}</dt>
<dd>{{ order.invoice_address.country }}</dd>
<dd>{{ order.invoice_address.country.name|default:order.invoice_address.country_old }}</dd>
{% if request.event.settings.invoice_address_vatid %}
<dt>{% trans "VAT ID" %}</dt>
<dd>{{ order.invoice_address.vat_id }}</dd>

View File

@@ -83,7 +83,7 @@
<dt>{% trans "ZIP code and city" %}</dt>
<dd>{{ addr.zipcode }} {{ addr.city }}</dd>
<dt>{% trans "Country" %}</dt>
<dd>{{ addr.country }}</dd>
<dd>{{ addr.country.name }}</dd>
{% if request.event.settings.invoice_address_vatid %}
<dt>{% trans "VAT ID" %}</dt>
<dd>{{ addr.vat_id }}</dd>

View File

@@ -182,7 +182,7 @@
<dt>{% trans "ZIP code and city" %}</dt>
<dd>{{ order.invoice_address.zipcode }} {{ order.invoice_address.city }}</dd>
<dt>{% trans "Country" %}</dt>
<dd>{{ order.invoice_address.country }}</dd>
<dd>{{ order.invoice_address.country.name|default:order.invoice_address.country_old }}</dd>
{% if request.event.settings.invoice_address_vatid %}
<dt>{% trans "VAT ID" %}</dt>
<dd>{{ order.invoice_address.vat_id }}</dd>

View File

@@ -219,6 +219,7 @@ INSTALLED_APPS = [
'django_otp.plugins.otp_totp',
'django_otp.plugins.otp_static',
'statici18n',
'django_countries'
]
try:

View File

@@ -41,3 +41,5 @@ chardet<3.1.0,>=3.0.2
mt-940==3.2
vobject==0.9.*
pycountry
django-countries
pyuca # for better sorting of country names in django-countries

View File

@@ -3,6 +3,7 @@ from decimal import Decimal
from unittest import mock
import pytest
from django_countries.fields import Country
from pytz import UTC
from pretix.base.models import InvoiceAddress, Order, OrderPosition
@@ -29,7 +30,7 @@ def order(event, item):
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, payment_provider='banktransfer', locale='en'
)
InvoiceAddress.objects.create(order=o, company="Sample company")
InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ'))
OrderPosition.objects.create(
order=o,
item=item,
@@ -82,7 +83,7 @@ TEST_ORDER_RES = {
"street": "",
"zipcode": "",
"city": "",
"country": "",
"country": "NZ",
"vat_id": ""
},
"positions": [TEST_ORDERPOSITION_RES],
@@ -259,7 +260,7 @@ TEST_INVOICE_RES = {
"number": "DUMMY-00001",
"is_cancellation": False,
"invoice_from": "",
"invoice_to": "Sample company",
"invoice_to": "Sample company\n\n\n \nNew Zealand",
"date": "2017-12-10",
"refers": None,
"locale": "en",

View File

@@ -4,6 +4,7 @@ from decimal import Decimal
import pytest
from django.db import DatabaseError
from django.utils.timezone import now
from django_countries.fields import Country
from pretix.base.models import (
Event, Invoice, InvoiceAddress, Item, ItemVariation, Order, OrderPosition,
@@ -71,15 +72,26 @@ def test_locale_user(env):
assert inv.locale == order.locale
@pytest.mark.django_db
def test_address_old_country(env):
event, order = env
event.settings.set('invoice_language', 'en')
InvoiceAddress.objects.create(company='Acme Company', street='221B Baker Street',
zipcode='12345', city='London', country_old='England', country='',
order=order)
inv = generate_invoice(order)
assert inv.invoice_to == "Acme Company\n\n221B Baker Street\n12345 London\nEngland"
@pytest.mark.django_db
def test_address(env):
event, order = env
event.settings.set('invoice_language', 'en')
InvoiceAddress.objects.create(company='Acme Company', street='221B Baker Street',
zipcode='12345', city='London', country='UK',
zipcode='12345', city='London', country=Country('GB'),
order=order)
inv = generate_invoice(order)
assert inv.invoice_to == "Acme Company\n\n221B Baker Street\n12345 London\nUK"
assert inv.invoice_to == "Acme Company\n\n221B Baker Street\n12345 London\nUnited Kingdom"
@pytest.mark.django_db
@@ -87,8 +99,8 @@ def test_address_vat_id(env):
event, order = env
event.settings.set('invoice_language', 'en')
InvoiceAddress.objects.create(company='Acme Company', street='221B Baker Street',
name='Sherlock Holmes', zipcode='12345', city='London', country='UK',
vat_id='UK1234567', order=order)
name='Sherlock Holmes', zipcode='12345', city='London', country_old='UK',
country='', vat_id='UK1234567', order=order)
inv = generate_invoice(order)
assert inv.invoice_to == "Acme Company\nSherlock Holmes\n221B Baker Street\n12345 London\nUK\nVAT-ID: UK1234567"