gault-millau/apps/location/models.py

107 lines
3.1 KiB
Python

"""Location app models."""
from django.contrib.postgres.fields import JSONField
from django.contrib.gis.db import models
from django.utils.translation import gettext_lazy as _
from utils.models import ProjectBaseMixin, LocaleManagerMixin
class CountryManager(LocaleManagerMixin):
"""Extended manager for Country model."""
class Country(ProjectBaseMixin):
"""Country model."""
name = JSONField(null=True, blank=True, default=None,
verbose_name=_('Name'), help_text='{"en":"some text"}')
code = models.CharField(max_length=255, blank=True, null=True,
default=None, unique=True, verbose_name=_('Code'))
objects = CountryManager()
class Meta:
"""Meta class."""
verbose_name_plural = _('Countries')
verbose_name = _('Country')
def __str__(self):
return self.code
class Region(models.Model):
"""Region model."""
name = models.CharField(_('name'), max_length=250)
code = models.CharField(_('code'), max_length=250)
parent_region = models.ForeignKey(
'self', verbose_name=_('parent region'), null=True,
blank=True, default=None, on_delete=models.CASCADE)
country = models.ForeignKey(
Country, verbose_name=_('country'), on_delete=models.CASCADE)
class Meta:
"""Meta class."""
verbose_name_plural = _('regions')
verbose_name = _('region')
def __str__(self):
return self.name
class City(models.Model):
"""Region model."""
name = models.CharField(_('name'), max_length=250)
code = models.CharField(_('code'), max_length=250)
region = models.ForeignKey(
Region, verbose_name=_('parent region'), on_delete=models.CASCADE)
country = models.ForeignKey(
Country, verbose_name=_('country'), on_delete=models.CASCADE)
postal_code = models.CharField(
_('postal code'), max_length=10, default='', help_text=_('Ex.: 350018'))
is_island = models.BooleanField(_('is island'), default=False)
class Meta:
verbose_name_plural = _('cities')
verbose_name = _('city')
def __str__(self):
return self.name
class Address(models.Model):
"""Address model."""
city = models.ForeignKey(City, verbose_name=_('city'), on_delete=models.CASCADE)
street_name_1 = models.CharField(
_('street name 1'), max_length=500, blank=True, default='')
street_name_2 = models.CharField(
_('street name 2'), max_length=500, blank=True, default='')
number = models.IntegerField(_('number'))
postal_code = models.CharField(
_('postal code'), max_length=10, blank=True,
default='', help_text=_('Ex.: 350018'))
coordinates = models.PointField(
_('Coordinates'), blank=True, null=True, default=None)
class Meta:
verbose_name_plural = _('Address')
verbose_name = _('Address')
def __str__(self):
return f'{self.id}: {self.get_street_name()[:50]}'
def get_street_name(self):
return self.street_name_1 or self.street_name_2
@property
def latitude(self):
return self.coordinates.y
@property
def longitude(self):
return self.coordinates.x