Skip to content

Commit 7a4c88b

Browse files
committed
example of improved zipcode handling (see #20)
1 parent 59f82ac commit 7a4c88b

File tree

5 files changed

+83
-8
lines changed

5 files changed

+83
-8
lines changed

tests/data_app/migrations/0001_initial.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 2.1.7 on 2019-02-28 23:53
1+
# Generated by Django 2.2.4 on 2019-08-21 02:43
22

33
from django.db import migrations, models
44
import django.db.models.deletion
@@ -13,10 +13,11 @@ class Migration(migrations.Migration):
1313

1414
operations = [
1515
migrations.CreateModel(
16-
name='FKModel',
16+
name='Address',
1717
fields=[
1818
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19-
('notes', models.TextField()),
19+
('city', models.CharField(max_length=50)),
20+
('postal_code', models.CharField(max_length=10)),
2021
],
2122
),
2223
migrations.CreateModel(
@@ -35,9 +36,12 @@ class Migration(migrations.Migration):
3536
('name', models.CharField(max_length=255)),
3637
],
3738
),
38-
migrations.AddField(
39-
model_name='fkmodel',
40-
name='type',
41-
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='data_app.Type'),
39+
migrations.CreateModel(
40+
name='FKModel',
41+
fields=[
42+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
43+
('notes', models.TextField()),
44+
('type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='data_app.Type')),
45+
],
4246
),
4347
]

tests/data_app/models.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,14 @@ def __str__(self):
3838
self.type,
3939
self.notes,
4040
)
41+
42+
43+
class Address(models.Model):
44+
city = models.CharField(max_length=50)
45+
postal_code = models.CharField(max_length=10)
46+
47+
def __str__(self):
48+
return "%s %s" % (
49+
self.city,
50+
self.postal_code,
51+
)

tests/data_app/wizard.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from rest_framework import serializers
2-
from .models import SimpleModel, Type, FKModel
2+
from .models import SimpleModel, Type, FKModel, Address
33
import data_wizard
44

55

@@ -49,8 +49,25 @@ class Meta:
4949
fields = "__all__"
5050

5151

52+
class NumericCharField(serializers.CharField):
53+
def to_internal_value(self, data):
54+
if isinstance(data, float):
55+
data = int(data)
56+
return str(data)
57+
58+
59+
class AddressSerializer(serializers.ModelSerializer):
60+
postal_code = NumericCharField()
61+
62+
class Meta:
63+
model = Address
64+
fields = "__all__"
65+
66+
5267
data_wizard.register(SimpleModel)
5368
data_wizard.register('Simple Model - Incomplete', IncompleteSerializer)
5469
data_wizard.register(FKModel)
5570
data_wizard.register('FK Model By Name', SlugSerializer)
5671
data_wizard.register('New Type + FK Model', NestedSerializer)
72+
data_wizard.register(Address)
73+
data_wizard.register('Address with Zip Code', AddressSerializer)

tests/media/addresses.xlsx

9.47 KB
Binary file not shown.

tests/test_numbers.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from .base import BaseImportTestCase
2+
3+
4+
class SimpleTestCase(BaseImportTestCase):
5+
def test_xlsx_zipcode_default(self):
6+
# Use auto-generated serializer (created by registering model)
7+
self.serializer_name = 'data_wizard.registry.AddressSerializer'
8+
run = self.upload_file('addresses.xlsx')
9+
10+
# Import and verify results
11+
self.create_identifier('zipcode', 'postal_code')
12+
self.auto_import(run, expect_input_required=False)
13+
self.assert_status(run, 2)
14+
self.assert_ranges(run, [
15+
"Data Column 'city -> city' at Rows 1-2, Column 0",
16+
"Data Column 'zipcode -> postal_code' at Rows 1-2, Column 1",
17+
])
18+
19+
# Records imported, but with '.0' due to XLSX number parsing
20+
self.assert_records(run, [
21+
"Imported 'Minneapolis 55455.0' at row 1",
22+
"Imported 'Chicago 60611.0' at row 2",
23+
])
24+
25+
def test_xlsx_zipcode_improved(self):
26+
# Use custom serializer
27+
self.serializer_name = 'tests.data_app.wizard.AddressSerializer'
28+
run = self.upload_file('addresses.xlsx')
29+
30+
# Import and verify results
31+
self.create_identifier('zipcode', 'postal_code')
32+
self.auto_import(run, expect_input_required=False)
33+
self.assert_status(run, 2)
34+
self.assert_ranges(run, [
35+
"Data Column 'city -> city' at Rows 1-2, Column 0",
36+
"Data Column 'zipcode -> postal_code' at Rows 1-2, Column 1",
37+
])
38+
39+
# With a custom serializer, the '.0' can be avoided
40+
self.assert_records(run, [
41+
"Imported 'Minneapolis 55455' at row 1",
42+
"Imported 'Chicago 60611' at row 2",
43+
])

0 commit comments

Comments
 (0)