All Projects → cordery → django-countries-plus

cordery / django-countries-plus

Licence: MIT license
Django model & fixture representing all top level country data from Geonames.org

Programming Languages

python
139335 projects - #7 most used programming language
HTML
75241 projects

Projects that are alternatives of or similar to django-countries-plus

Nager.Country
Worldwide Country Informations (ISO-3166-1 Alpha2, ISO-3166-1 Alpha3, ISO 639-1)
Stars: ✭ 68 (+70%)
Mutual labels:  countries, country-codes
countriesNowAPI
CountriesNow is an Open source API for retrieving geo-information for countries, including their states, cities, population, etc. 🌎
Stars: ✭ 78 (+95%)
Mutual labels:  countries, country-codes
hdx-python-country
Utilities to map between country and region codes and names and to match administrative level names from different sources. Also utilities for foreign exchange enabling obtaining current and historic FX rates for different currencies
Stars: ✭ 16 (-60%)
Mutual labels:  countries, country-codes
Countries
Collection of Country Information for Elixir.
Stars: ✭ 107 (+167.5%)
Mutual labels:  countries
Factbook
factbook gem - scripts for the world factbook (get open structured data e.g JSON etc.)
Stars: ✭ 121 (+202.5%)
Mutual labels:  countries
Awesome Startups
❤️ A curated list of awesome startups
Stars: ✭ 197 (+392.5%)
Mutual labels:  countries
list-of-countries
List of all countries in different formats (ISO, tld, capital, language, population)
Stars: ✭ 22 (-45%)
Mutual labels:  countries
Country Ip Blocks
CIDR country-level IP data, straight from the Regional Internet Registries, updated hourly.
Stars: ✭ 100 (+150%)
Mutual labels:  countries
geonamescache
geonamescache - a Python library for quick access to a subset of GeoNames data.
Stars: ✭ 76 (+90%)
Mutual labels:  countries
Mapsicon
A free collection of maps for every country in the world, available in 11 sizes or in SVG.
Stars: ✭ 1,999 (+4897.5%)
Mutual labels:  countries
Restcountries
Get information about countries via a RESTful API
Stars: ✭ 2,054 (+5035%)
Mutual labels:  countries
Laravel cities
Find any country/city in the world. Get Long/Lat etc. Deploy geonames.org database localy. Optimized DB tree
Stars: ✭ 133 (+232.5%)
Mutual labels:  countries
Country Region Data
A source list of countries, regions and shortcodes in JSON and JS format.
Stars: ✭ 222 (+455%)
Mutual labels:  countries
Countries
Laravel countries and currencies
Stars: ✭ 1,564 (+3810%)
Mutual labels:  countries
Zip-code-of-all-countries-cities-in-the-world-CSV-TXT-SQL-DATABASE
Zip code of all countries in the world along with cities in CSV, TXT, SQL DATABASE
Stars: ✭ 35 (-12.5%)
Mutual labels:  countries
Iso 3166 Countries With Regional Codes
ISO 3166-1 country lists merged with their UN Geoscheme regional codes in ready-to-use JSON, XML, CSV data sets
Stars: ✭ 1,372 (+3330%)
Mutual labels:  countries
country-flags
A small package to convert a country code to the corresponding country flag emoji
Stars: ✭ 27 (-32.5%)
Mutual labels:  countries
Countries
🌎 Public GraphQL API for information about countries
Stars: ✭ 156 (+290%)
Mutual labels:  countries
Countrycode
🎯 Swift country and phone code Picker
Stars: ✭ 175 (+337.5%)
Mutual labels:  countries
CountryPickerView
A simple country code picker on iOS, support chinese,english,spanish,national flag,ISO 3166-1 and calling code.(一个简洁的iOS国家代码选择器,支持中文、英语、西班牙语、国旗、ISO 3166-1、国际电话区号) your can search the ISO 3166 code,calling code or country name,the picker view will refresh automatically according to the content of your search.(你可以搜索ISO 3166码,电话区号或者国家名字,pikerView将会…
Stars: ✭ 26 (-35%)
Mutual labels:  country-codes

Django Countries Plus

https://requires.io/github/cordery/django-countries-plus/requirements.svg?branch=master https://www.codacy.com/project/badge/c74f1b1041f44940b58e0e1587b10453?style=flat-square

django-countries-plus provides a model and fixture containing all top level country data from Geonames.org (http://download.geonames.org/export/dump/countryInfo.txt)

This package also provides a convenience middleware that will look up a country in the database using a defined meta header, ex: the Cloudflare provided geoip META header HTTP_CF_IPCOUNTRY. This country object will be attached to the request object at request.country.

Country Model

The model provides the following fields (original geonames.org column name in parentheses).

  • iso (ISO)
  • iso3 (ISO3)
  • iso_numeric (ISO-Numeric)
  • fips (fips)
  • name (Country)
  • capital
  • area (Area(in sq km))
  • population (population)
  • continent (continent)
  • tld (tld)
  • currency_code (CurrencyCode)
  • currency_name (CurrencyName)
  • currency_symbol (Not part of the original table)
  • phone (Phone)
  • postal_code_format (Postal Code Format)
  • postal_code_regex (Postal Code Regex)
  • languages (Languages)
  • geonameid (geonameid)
  • neighbors (neighbours)
  • equivalent_fips_code (EquivalentFipsCode)

Installation

Step 1: Install From PyPi

pip install django-countries-plus

Step 2: Add countries_plus to your settings INSTALLED_APPS

Step 3: Run python manage.py migrate

Step 4: Load the Countries Data
  1. Load the countries data into your database with the update_countries_plus management command.
    python manage.py update_countries_plus
  2. (alternative) Load the provided fixture from the fixtures directory.
    python manage.py loaddata PATH_TO_COUNTRIES_PLUS/countries_plus/countries_data.json.gz

Usage

Retrieve a Country:

from countries_plus.models import Country
usa = Country.objects.get(iso3='USA')

Update the countries data with the latest geonames.org data:

python manage.py update_countries_plus

This management command will download the latest geonames.org countries data and convert it into Country objects. Existing Country objects will be updated if necessary. No Country objects will be deleted, even if that country has ceased to exist.

Add the Request Country to each Request

  1. Add countries_plus.middleware.AddRequestCountryMiddleware to your MIDDLEWARE setting.

  2. add the following two settings to your settings.py:

    COUNTRIES_PLUS_COUNTRY_HEADER - A string defining the name of the meta header that provides the country code. Ex: 'HTTP_CF_COUNTRY' (from https://support.cloudflare.com/hc/en-us/articles/200168236-What-does-CloudFlare-IP-Geolocation-do-)

    COUNTRIES_PLUS_DEFAULT_ISO - A string containing an iso code for the country you want to use as a fallback in the case of a missing or malformed geoip header. Ex: 'US' or 'DE' or 'BR'

    Example:

    COUNTRIES_PLUS_COUNTRY_HEADER = 'HTTP_CF_COUNTRY'
    COUNTRIES_PLUS_DEFAULT_ISO = 'US'
    

Add the Request Country to the Request Context

  1. Enable the optional middleware as described above
  2. Add countries_plus.context_processors.add_request_country to your 'context_processors' option in the OPTIONS of a DjangoTemplates backend instead (Django 1.8)

Requirements

Python: 3.7+ Django: Tested against the LTS or latest versions of 2.2, 3, and 4.

Integrating with django-languages-plus

If you also have django-languages-plus(https://pypi.python.org/pypi/django-languages-plus) installed then you can run the following command once to associate the two datasets and generate a list of culture codes (pt_BR for example):

from languages_plus.utils import associate_countries_and_languages
associate_countries_and_languages()

Notes on 1.0.1

  • Two countries (Dominican Republic and Puerto Rico) have two phone number prefixes instead of 1. These prefixes are now comma separated.
  • The Country model has had all fields with undefined lengths (ex: name) expanded to max_length=255. Defined length fields (ex: Iso, Iso3) are unchanged.
  • The Country model will no validate on save and reject values of the wrong length. The test suite has been expanded to test this.

Notes on 1.0.0

  • The data migration has been removed in favour of the new management command and manually loading the fixture.
  • The fixture is no longer named initial_data and so must be loaded manually, if desired.
  • In order to provide better compatibility with the way Django loads apps the Country model is no longer importable directly from countries_plus.
  • The get_country_by_request utility function has been moved into the Country model, and is available as Country.get_by_request(request)
  • Test coverage has been substantially improved.
  • If you have been running an earlier version you should run python manage.py update_countries_plus to update your data tables as they may contain incorrect data.

Troubleshooting

I get the following error when trying to run a migration adding a new ForeignKey to the Country model:

django.db.utils.OperationalError: (3780, "Referencing column 'new_country_id' and referenced column 'iso' in foreign key constraint 'companies_company_new_country_id_1a75fd29_fk_countries' are incompatible.")

Due to a decision made many years ago that cannot be easily changed now, countries_plus uses a CharField(max_length=2) for its primary key (the iso column). This means that in MySQL and probably other databases the charset and collation of the two fields (your ForeignKey and the Country.iso) field must be identical. Default collations may change over time, for example MySQL changed its default charset to utf8mb4 and collation to utf8mb4_0900_ai_ci in 8.0. This can cause new tables (such as countries_plus_country) to be created with a different collation than older tables that were migrated to a newer version of MySQL.

To solve the problem, either:

  • convert the countries_plus_country table to use the older collation than your related table is using.
  • or perhaps preferably, convert your related table to use the new utf8mb4_0900_ai_ci collation that the countries_plus table is using (and any other new tables in your database)

For example, running the following would fix the issue by converting your related table:

ALTER TABLE <YOUR_TABLE> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

Running Tests

Does the code actually work?

$ poetry install
$ poetry run pytest

Or for the full tox suite:

$ poetry install
$ pip install tox
$ tox
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].