"""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