Skip to content

Commit

Permalink
Add module for managing country names and codes.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ryan Casey committed Apr 25, 2014
1 parent ee8fe32 commit 1d6d589
Show file tree
Hide file tree
Showing 3 changed files with 274 additions and 25 deletions.
26 changes: 10 additions & 16 deletions endicia.py
Expand Up @@ -9,17 +9,7 @@
import suds
from suds.client import Client
from suds.sax.element import Element

from shipping import get_country_code

def _normalize_country(country):
country_lookup = {
'united states': 'United States',
'us': 'United States',
'usa': 'United States',
}

return country_lookup.get(country.lower(), country)
from iso_country_codes import lookup_code, lookup_country

class EndiciaError(Exception):
pass
Expand Down Expand Up @@ -58,8 +48,12 @@ def value(self):

@property
def country(self):
return _normalize_country(self._country)

return lookup_country(self._country)

@property
def country_code(self):
return lookup_code(self._country)

class Package(object):
domestic_shipment_types = [
'Priority',
Expand Down Expand Up @@ -131,7 +125,7 @@ def rate(self, package, shipper, recipient, insurance='OFF', insurance_amount=0,

package = package[0]

to_country_code = get_country_code(recipient.country)
to_country_code = lookup_code(recipient.country)

request = self.client.factory.create('PostageRatesRequest')
request.RequesterID = self.credentials['partner_id']
Expand Down Expand Up @@ -348,7 +342,7 @@ def _get_xml(self):
if info.value:
etree.SubElement(root, u'CustomsValue%d' % i).text = str(info.value)
if info.country:
etree.SubElement(root, u'CustomsCountry%d' % i).text = info.country
etree.SubElement(root, u'CustomsCountry%d' % i).text = lookup_code(info.country)

if len(self.customs_info) and self.customs_signer:
etree.SubElement(root, u'CustomsCertify').text = 'TRUE'
Expand All @@ -367,7 +361,7 @@ def __add_address(self, address, type, root):
info['City'] = address.city
info['State'] = address.state
info['PostalCode'] = address.zip
info['CountryCode'] = _normalize_country(address.country.upper())
info['CountryCode'] = lookup_code(address.country)
if address.phone:
info['Phone'] = address.phone
if address.address2:
Expand Down
264 changes: 264 additions & 0 deletions iso_country_codes.py
@@ -0,0 +1,264 @@
#!/usr/bin/env python
# A Python dictionary of 246 official ISO 3166-1-alpha-2 code
# elements and the corresponding country names, as specified in:
# http://www.iso.org/iso/english_country_names_and_code_elements
#
# Karagasidis Dimitris,
# github.com/gatoni

COUNTRY = {
"AF":"AFGHANISTAN",
"AX":"ALAND ISLANDS",
"AL":"ALBANIA",
"DZ":"ALGERIA",
"AS":"AMERICAN SAMOA",
"AD":"ANDORRA",
"AO":"ANGOLA",
"AI":"ANGUILLA",
"AQ":"ANTARCTICA",
"AG":"ANTIGUA AND BARBUDA",
"AR":"ARGENTINA",
"AM":"ARMENIA",
"AW":"ARUBA",
"AU":"AUSTRALIA",
"AT":"AUSTRIA",
"AZ":"AZERBAIJAN",
"BS":"BAHAMAS",
"BH":"BAHRAIN",
"BD":"BANGLADESH",
"BB":"BARBADOS",
"BY":"BELARUS",
"BE":"BELGIUM",
"BZ":"BELIZE",
"BJ":"BENIN",
"BM":"BERMUDA",
"BT":"BHUTAN",
"BO":"BOLIVIA, PLURINATIONAL STATE OF",
"BA":"BOSNIA AND HERZEGOVINA",
"BW":"BOTSWANA",
"BV":"BOUVET ISLAND",
"BR":"BRAZIL",
"IO":"BRITISH INDIAN OCEAN TERRITORY",
"BN":"BRUNEI DARUSSALAM",
"BG":"BULGARIA",
"BF":"BURKINA FASO",
"BI":"BURUNDI",
"KH":"CAMBODIA",
"CM":"CAMEROON",
"CA":"CANADA",
"CV":"CAPE VERDE",
"KY":"CAYMAN ISLANDS",
"CF":"CENTRAL AFRICAN REPUBLIC",
"TD":"CHAD",
"CL":"CHILE",
"CN":"CHINA",
"CX":"CHRISTMAS ISLAND",
"CC":"COCOS (KEELING) ISLANDS",
"CO":"COLOMBIA",
"KM":"COMOROS",
"CG":"CONGO",
"CD":"CONGO, THE DEMOCRATIC REPUBLIC OF THE",
"CK":"COOK ISLANDS",
"CR":"COSTA RICA",
"CI":"COTE D'IVOIRE",
"HR":"CROATIA",
"CU":"CUBA",
"CY":"CYPRUS",
"CZ":"CZECH REPUBLIC",
"DK":"DENMARK",
"DJ":"DJIBOUTI",
"DM":"DOMINICA",
"DO":"DOMINICAN REPUBLIC",
"EC":"ECUADOR",
"EG":"EGYPT",
"SV":"EL SALVADOR",
"GQ":"EQUATORIAL GUINEA",
"ER":"ERITREA",
"EE":"ESTONIA",
"ET":"ETHIOPIA",
"FK":"FALKLAND ISLANDS (MALVINAS)",
"FO":"FAROE ISLANDS",
"FJ":"FIJI",
"FI":"FINLAND",
"FR":"FRANCE",
"GF":"FRENCH GUIANA",
"PF":"FRENCH POLYNESIA",
"TF":"FRENCH SOUTHERN TERRITORIES",
"GA":"GABON",
"GM":"GAMBIA",
"GE":"GEORGIA",
"DE":"GERMANY",
"GH":"GHANA",
"GI":"GIBRALTAR",
"GR":"GREECE",
"GL":"GREENLAND",
"GD":"GRENADA",
"GP":"GUADELOUPE",
"GU":"GUAM",
"GT":"GUATEMALA",
"GG":"GUERNSEY",
"GN":"GUINEA",
"GW":"GUINEA-BISSAU",
"GY":"GUYANA",
"HT":"HAITI",
"HM":"HEARD ISLAND AND MCDONALD ISLANDS",
"VA":"HOLY SEE (VATICAN CITY STATE)",
"HN":"HONDURAS",
"HK":"HONG KONG",
"HU":"HUNGARY",
"IS":"ICELAND",
"IN":"INDIA",
"ID":"INDONESIA",
"IR":"IRAN, ISLAMIC REPUBLIC OF",
"IQ":"IRAQ",
"IE":"IRELAND",
"IM":"ISLE OF MAN",
"IL":"ISRAEL",
"IT":"ITALY",
"JM":"JAMAICA",
"JP":"JAPAN",
"JE":"JERSEY",
"JO":"JORDAN",
"KZ":"KAZAKHSTAN",
"KE":"KENYA",
"KI":"KIRIBATI",
"KP":"KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF",
"KR":"KOREA, REPUBLIC OF",
"KW":"KUWAIT",
"KG":"KYRGYZSTAN",
"LA":"LAO PEOPLE'S DEMOCRATIC REPUBLIC",
"LV":"LATVIA",
"LB":"LEBANON",
"LS":"LESOTHO",
"LR":"LIBERIA",
"LY":"LIBYAN ARAB JAMAHIRIYA",
"LI":"LIECHTENSTEIN",
"LT":"LITHUANIA",
"LU":"LUXEMBOURG",
"MO":"MACAO",
"MK":"MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF",
"MG":"MADAGASCAR",
"MW":"MALAWI",
"MY":"MALAYSIA",
"MV":"MALDIVES",
"ML":"MALI",
"MT":"MALTA",
"MH":"MARSHALL ISLANDS",
"MQ":"MARTINIQUE",
"MR":"MAURITANIA",
"MU":"MAURITIUS",
"YT":"MAYOTTE",
"MX":"MEXICO",
"FM":"MICRONESIA, FEDERATED STATES OF",
"MD":"MOLDOVA, REPUBLIC OF",
"MC":"MONACO",
"MN":"MONGOLIA",
"ME":"MONTENEGRO",
"MS":"MONTSERRAT",
"MA":"MOROCCO",
"MZ":"MOZAMBIQUE",
"MM":"MYANMAR",
"NA":"NAMIBIA",
"NR":"NAURU",
"NP":"NEPAL",
"NL":"NETHERLANDS",
"AN":"NETHERLANDS ANTILLES",
"NC":"NEW CALEDONIA",
"NZ":"NEW ZEALAND",
"NI":"NICARAGUA",
"NE":"NIGER",
"NG":"NIGERIA",
"NU":"NIUE",
"NF":"NORFOLK ISLAND",
"MP":"NORTHERN MARIANA ISLANDS",
"NO":"NORWAY",
"OM":"OMAN",
"PK":"PAKISTAN",
"PW":"PALAU",
"PS":"PALESTINIAN TERRITORY, OCCUPIED",
"PA":"PANAMA",
"PG":"PAPUA NEW GUINEA",
"PY":"PARAGUAY",
"PE":"PERU",
"PH":"PHILIPPINES",
"PN":"PITCAIRN",
"PL":"POLAND",
"PT":"PORTUGAL",
"PR":"PUERTO RICO",
"QA":"QATAR",
"RE":"REUNION",
"RO":"ROMANIA",
"RU":"RUSSIAN FEDERATION",
"RW":"RWANDA",
"BL":"SAINT BARTHELEMY",
"SH":"SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA",
"KN":"SAINT KITTS AND NEVIS",
"LC":"SAINT LUCIA",
"MF":"SAINT MARTIN",
"PM":"SAINT PIERRE AND MIQUELON",
"VC":"SAINT VINCENT AND THE GRENADINES",
"WS":"SAMOA",
"SM":"SAN MARINO",
"ST":"SAO TOME AND PRINCIPE",
"SA":"SAUDI ARABIA",
"SN":"SENEGAL",
"RS":"SERBIA",
"SC":"SEYCHELLES",
"SL":"SIERRA LEONE",
"SG":"SINGAPORE",
"SK":"SLOVAKIA",
"SI":"SLOVENIA",
"SB":"SOLOMON ISLANDS",
"SO":"SOMALIA",
"ZA":"SOUTH AFRICA",
"GS":"SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS",
"ES":"SPAIN",
"LK":"SRI LANKA",
"SD":"SUDAN",
"SR":"SURINAME",
"SJ":"SVALBARD AND JAN MAYEN",
"SZ":"SWAZILAND",
"SE":"SWEDEN",
"CH":"SWITZERLAND",
"SY":"SYRIAN ARAB REPUBLIC",
"TW":"TAIWAN, PROVINCE OF CHINA",
"TJ":"TAJIKISTAN",
"TZ":"TANZANIA, UNITED REPUBLIC OF",
"TH":"THAILAND",
"TL":"TIMOR-LESTE",
"TG":"TOGO",
"TK":"TOKELAU",
"TO":"TONGA",
"TT":"TRINIDAD AND TOBAGO",
"TN":"TUNISIA",
"TR":"TURKEY",
"TM":"TURKMENISTAN",
"TC":"TURKS AND CAICOS ISLANDS",
"TV":"TUVALU",
"UG":"UGANDA",
"UA":"UKRAINE",
"AE":"UNITED ARAB EMIRATES",
"GB":"UNITED KINGDOM",
"US":"UNITED STATES",
"UM":"UNITED STATES MINOR OUTLYING ISLANDS",
"UY":"URUGUAY",
"UZ":"UZBEKISTAN",
"VU":"VANUATU",
"VE":"VENEZUELA, BOLIVARIAN REPUBLIC OF",
"VN":"VIET NAM",
"VG":"VIRGIN ISLANDS, BRITISH",
"VI":"VIRGIN ISLANDS, U.S.",
"WF":"WALLIS AND FUTUNA",
"EH":"WESTERN SAHARA",
"YE":"YEMEN",
"ZM":"ZAMBIA",
"ZW ":"ZIMBABWE"
}

CODE = dict(zip(COUNTRY.values(), COUNTRY.keys()))

def lookup_country(code):
return COUNTRY.get(code.upper(), code)

def lookup_code(country):
return CODE.get(country.upper(), country[0:2].upper())
9 changes: 0 additions & 9 deletions shipping.py
Expand Up @@ -63,12 +63,3 @@ def __repr__(self):
if self.address2:
street += '\n' + self.address2
return '%s\n%s\n%s, %s %s %s' % (self.name, street, self.city, self.state, self.zip, self.country)

def get_country_code(country):
lookup = {
'us': 'US',
'usa': 'US',
'united states': 'US',
}

return lookup.get(country.lower(), country)

0 comments on commit 1d6d589

Please sign in to comment.