126 lines
4.1 KiB
Python
126 lines
4.1 KiB
Python
"""Location app models."""
|
|
from django.conf import settings
|
|
from django.contrib.gis.db import models
|
|
from django.db.models.signals import post_save
|
|
from django.db.transaction import on_commit
|
|
from django.dispatch import receiver
|
|
from django.utils.translation import gettext_lazy as _
|
|
from utils.models import ProjectBaseMixin, SVGImageMixin, TranslatedFieldsMixin, TJSONField
|
|
from translation.models import Language
|
|
|
|
|
|
class Country(TranslatedFieldsMixin, SVGImageMixin, ProjectBaseMixin):
|
|
"""Country model."""
|
|
|
|
STR_FIELD_NAME = 'name'
|
|
|
|
name = TJSONField(null=True, blank=True, default=None,
|
|
verbose_name=_('Name'), help_text='{"en-GB":"some text"}')
|
|
code = models.CharField(max_length=255, unique=True, verbose_name=_('Code'))
|
|
low_price = models.IntegerField(default=25, verbose_name=_('Low price'))
|
|
high_price = models.IntegerField(default=50, verbose_name=_('High price'))
|
|
languages = models.ManyToManyField(Language, verbose_name=_('Languages'))
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
|
|
verbose_name_plural = _('Countries')
|
|
verbose_name = _('Country')
|
|
|
|
|
|
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:
|
|
"""Meta class."""
|
|
|
|
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 if self.coordinates else float(0)
|
|
|
|
@property
|
|
def longitude(self):
|
|
return self.coordinates.x if self.coordinates else float(0)
|
|
|
|
@property
|
|
def location_field_indexing(self):
|
|
return {'lat': self.latitude,
|
|
'lon': self.longitude}
|
|
|
|
|
|
# todo: Make recalculate price levels
|
|
@receiver(post_save, sender=Country)
|
|
def run_recalculate_price_levels(sender, instance, **kwargs):
|
|
from establishment.tasks import recalculate_price_levels_by_country
|
|
if settings.USE_CELERY:
|
|
on_commit(lambda: recalculate_price_levels_by_country.delay(
|
|
country_id=instance.id))
|
|
else:
|
|
on_commit(lambda: recalculate_price_levels_by_country(
|
|
country_id=instance.id))
|