[addresses] adding new config for postal codes around the world. Allows appending the ISO alpha-2 country code to the beginning of the postcode as in e.g. SI-1000 (only used if the postcode begins with a digit). This system was used for postal codes in continental Europe as a recommendation from the CEPT. Now 7 member states still use it, so in those countries add the country-code with higher probability. The config also contains the license plate codes for countries where e.g. L-1234 might be used instead of LU-1234. Allows configuring in which countries postcodes should be validated using Google's per-country validation regexes (and the ability to override with a custom regex), and in which countries other admin component names should be stripped.
This commit is contained in:
51
scripts/geodata/postal_codes/config.py
Normal file
51
scripts/geodata/postal_codes/config.py
Normal file
@@ -0,0 +1,51 @@
|
||||
import copy
|
||||
import operator
|
||||
import os
|
||||
import random
|
||||
import six
|
||||
import yaml
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
from geodata.address_expansions.address_dictionaries import address_phrase_dictionaries
|
||||
from geodata.address_formatting.formatter import AddressFormatter
|
||||
from geodata.configs.utils import nested_get, recursive_merge
|
||||
|
||||
|
||||
this_dir = os.path.realpath(os.path.dirname(__file__))
|
||||
|
||||
POSTAL_CODES_CONFIG_FILE = os.path.join(this_dir, os.pardir, os.pardir, os.pardir,
|
||||
'resources', 'postal_codes', 'config.yaml')
|
||||
|
||||
|
||||
class PostalCodesConfig(object):
|
||||
def __init__(self, config_file=POSTAL_CODES_CONFIG_FILE):
|
||||
self.cache = {}
|
||||
postal_codes_config = yaml.load(open(config_file))
|
||||
|
||||
self.global_config = postal_codes_config['global']
|
||||
self.country_configs = {}
|
||||
|
||||
countries = postal_codes_config.pop('countries', {})
|
||||
|
||||
for k, v in six.iteritems(countries):
|
||||
country_config = countries[k]
|
||||
global_config_copy = copy.deepcopy(self.global_config)
|
||||
self.country_configs[k] = recursive_merge(global_config_copy, country_config)
|
||||
|
||||
self.country_configs[None] = self.global_config
|
||||
|
||||
def get_property(self, key, country=None, default=None):
|
||||
if isinstance(key, six.string_types):
|
||||
key = key.split(u'.')
|
||||
|
||||
config = self.global_config
|
||||
|
||||
if country:
|
||||
country_config = self.country_configs.get(country.lower(), {})
|
||||
if country_config:
|
||||
config = country_config
|
||||
|
||||
return nested_get(config, key, default=default)
|
||||
|
||||
postal_codes_config = PostalCodesConfig()
|
||||
Reference in New Issue
Block a user