diff --git a/cities/migrations/0001_initial.py b/cities/migrations/0001_initial.py index 18263795..21c9fd71 100644 --- a/cities/migrations/0001_initial.py +++ b/cities/migrations/0001_initial.py @@ -4,10 +4,14 @@ from django.db import models, migrations import django.contrib.gis.db.models.fields +import swapper + class Migration(migrations.Migration): dependencies = [ + swapper.dependency('cities', 'City'), + swapper.dependency('cities', 'Country'), ] operations = [ @@ -37,6 +41,7 @@ class Migration(migrations.Migration): ('alt_names', models.ManyToManyField(to='cities.AlternativeName')), ], options={ + 'swappable': swapper.swappable_setting('cities', 'City'), 'verbose_name_plural': 'cities', }, ), @@ -58,10 +63,11 @@ class Migration(migrations.Migration): ('tld', models.CharField(max_length=5)), ('capital', models.CharField(max_length=100)), ('alt_names', models.ManyToManyField(to='cities.AlternativeName')), - ('neighbours', models.ManyToManyField(related_name='neighbours_rel_+', to='cities.Country')), + ('neighbours', models.ManyToManyField(related_name='neighbours_rel_+', to=swapper.get_model_name('cities', 'Country'))), ], options={ 'ordering': ['name'], + 'swappable': swapper.swappable_setting('cities', 'Country'), 'verbose_name_plural': 'countries', }, ), @@ -93,7 +99,7 @@ class Migration(migrations.Migration): ('subregion_name', models.CharField(max_length=100, db_index=True)), ('district_name', models.CharField(max_length=100, db_index=True)), ('alt_names', models.ManyToManyField(to='cities.AlternativeName')), - ('country', models.ForeignKey(related_name='postal_codes', to='cities.Country')), + ('country', models.ForeignKey(related_name='postal_codes', to=swapper.get_model_name('cities', 'Country'))), ], options={ 'abstract': False, @@ -108,7 +114,7 @@ class Migration(migrations.Migration): ('name_std', models.CharField(max_length=200, verbose_name='standard name', db_index=True)), ('code', models.CharField(max_length=200, db_index=True)), ('alt_names', models.ManyToManyField(to='cities.AlternativeName')), - ('country', models.ForeignKey(to='cities.Country')), + ('country', models.ForeignKey(to=swapper.get_model_name('cities', 'Country'))), ], options={ 'abstract': False, @@ -132,7 +138,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='city', name='country', - field=models.ForeignKey(to='cities.Country'), + field=models.ForeignKey(to=swapper.get_model_name('cities', 'Country')), ), migrations.AddField( model_name='city', diff --git a/cities/migrations/0002_continent_models_and_foreign_keys.py b/cities/migrations/0002_continent_models_and_foreign_keys.py index e8472c18..63fe2e00 100644 --- a/cities/migrations/0002_continent_models_and_foreign_keys.py +++ b/cities/migrations/0002_continent_models_and_foreign_keys.py @@ -7,12 +7,13 @@ import django.db.models.deletion import uuid +import swapper from ..conf import CONTINENT_DATA def add_continents(apps, schema_editor): - Continent = apps.get_model('cities', 'Continent') + Continent = swapper.load_model('cities', 'Continent') for ccode, cdata in CONTINENT_DATA.items(): try: @@ -33,16 +34,16 @@ def rm_continents(apps, schema_editor): def add_continent_fks(apps, schema_editor): - Country = apps.get_model('cities', 'Country') - Continent = apps.get_model('cities', 'Continent') + Country = swapper.load_model('cities', 'Country') + Continent = swapper.load_model('cities', 'Continent') for continent in Continent.objects.all(): Country.objects.filter(continent_code=continent.code).update(continent=continent) def rm_continent_fks(apps, schema_editor): - Country = apps.get_model('cities', 'Country') - Continent = apps.get_model('cities', 'Continent') + Country = swapper.load_model('cities', 'Country') + Continent = swapper.load_model('cities', 'Continent') for continent in Continent.objects.all(): Country.objects.filter(continent=continent).update(continent_code=continent.code) @@ -52,6 +53,7 @@ class Migration(migrations.Migration): dependencies = [ ('cities', '0001_initial'), + swapper.dependency('cities', 'Country'), ] operations = [ @@ -65,6 +67,7 @@ class Migration(migrations.Migration): ], options={ 'abstract': False, + 'swappable': swapper.swappable_setting('cities', 'Continent'), }, ), migrations.AddField( @@ -75,7 +78,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='country', name='continent', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='countries', to='cities.Continent'), + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='countries', to=swapper.get_model_name('cities', 'Continent')), ), migrations.RunPython(add_continents, rm_continents), migrations.RenameField( diff --git a/cities/models.py b/cities/models.py index fd807920..549fc660 100644 --- a/cities/models.py +++ b/cities/models.py @@ -6,6 +6,9 @@ from django.utils.encoding import python_2_unicode_compatible from django.contrib.gis.db import models from django.contrib.gis.geos import Point + +import swapper + from .conf import settings __all__ = [ @@ -39,14 +42,22 @@ def __str__(self): return force_text(self.name) -class Continent(Place): +class BaseContinent(Place): code = models.CharField(max_length=2, unique=True, db_index=True) def __str__(self): return force_text(self.name) + class Meta: + abstract = True + + +class Continent(BaseContinent): + class Meta(BaseContinent.Meta): + swappable = swapper.swappable_setting('cities', 'Continent') + -class Country(Place): +class BaseCountry(Place): code = models.CharField(max_length=2, db_index=True) code3 = models.CharField(max_length=3, db_index=True) population = models.IntegerField() @@ -61,6 +72,7 @@ class Country(Place): neighbours = models.ManyToManyField("self") class Meta: + abstract = True ordering = ['name'] verbose_name_plural = "countries" @@ -69,6 +81,11 @@ def parent(self): return None +class Country(BaseCountry): + class Meta(BaseCountry.Meta): + swappable = swapper.swappable_setting('cities', 'Country') + + class Region(Place): name_std = models.CharField(max_length=200, db_index=True, verbose_name="standard name") code = models.CharField(max_length=200, db_index=True) @@ -95,7 +112,7 @@ def full_code(self): return ".".join([self.parent.parent.code, self.parent.code, self.code]) -class City(Place): +class BaseCity(Place): name_std = models.CharField(max_length=200, db_index=True, verbose_name="standard name") location = models.PointField() population = models.IntegerField() @@ -107,6 +124,7 @@ class City(Place): timezone = models.CharField(max_length=40) class Meta: + abstract = True verbose_name_plural = "cities" @property @@ -114,6 +132,11 @@ def parent(self): return self.region +class City(BaseCity): + class Meta(BaseCity.Meta): + swappable = swapper.swappable_setting('cities', 'City') + + class District(Place): name_std = models.CharField(max_length=200, db_index=True, verbose_name="standard name") location = models.PointField() diff --git a/setup.py b/setup.py index 48acb640..48765546 100644 --- a/setup.py +++ b/setup.py @@ -14,13 +14,14 @@ def read(fname): setup( name='django-cities', - version='0.4.1', + version='0.4.2', description='Place models and worldwide place data for Django', author='Ben Dowling', author_email='ben.m.dowling@gmail.com', url='https://github.com/coderholic/django-cities', packages=find_packages(exclude=['example']), install_requires=[ + 'swapper', 'tqdm', ], include_package_data=True,