Skip to content
Snippets Groups Projects
Commit 78d852a6 authored by Todd Dembrey's avatar Todd Dembrey
Browse files

Implement a AddressField to incorporate backend clean methods

parent 512ff380
No related branches found
No related tags found
No related merge requests found
import json
from os import path
from django import forms
from django.core.exceptions import ValidationError
from .widgets import AddressWidget
basepath = path.dirname(__file__)
filepath = path.abspath(path.join(basepath, "static", "addressfield.min.json"))
with open(filepath, encoding='utf8') as address_data:
countries = json.load(address_data)['options']
VALIDATION_DATA = {country['iso']: country for country in countries}
def flatten_data(data):
flattened = dict()
for d in data:
for k, v in d.items():
if isinstance(v, list):
value = flatten_data(v)
else:
value = {k: v}
flattened.update(value)
return flattened
class AddressField(forms.CharField):
widget = AddressWidget
def clean(self, value, **kwargs):
country = value['country']
try:
country_data = VALIDATION_DATA[country]
except KeyError:
raise ValidationError('Invalid country selected')
fields = flatten_data(country_data['fields'])
missing_fields = set(country_data['required']) - set(value.keys())
if missing_fields:
missing_field_name = [fields[field]['label'] for field in missing_fields]
raise ValidationError('Please provide data for: {}'.format(', '.join(missing_field_name)))
super().clean(value, **kwargs)
...@@ -16,7 +16,7 @@ from opentech.apply.stream_forms.blocks import ( ...@@ -16,7 +16,7 @@ from opentech.apply.stream_forms.blocks import (
TextFieldBlock, TextFieldBlock,
) )
from opentech.apply.categories.blocks import CategoryQuestionBlock from opentech.apply.categories.blocks import CategoryQuestionBlock
from addressfield.widgets import AddressWidget from addressfield.fields import AddressField
def find_duplicates(items): def find_duplicates(items):
...@@ -165,7 +165,8 @@ class EmailBlock(MustIncludeFieldBlock): ...@@ -165,7 +165,8 @@ class EmailBlock(MustIncludeFieldBlock):
class AddressFieldBlock(MustIncludeFieldBlock): class AddressFieldBlock(MustIncludeFieldBlock):
name = 'address' name = 'address'
description = 'The postal address of the user' description = 'The postal address of the user'
widget = AddressWidget
field_class = AddressField
class Meta: class Meta:
label = _('Address') label = _('Address')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment