Files
account_store/ReferenceDataApp/models.py
2024-07-16 15:34:35 +03:00

125 lines
5.0 KiB
Python

import pytz
from django.db import models
from BaseModels.base_models import BaseModel
from django.utils.translation import gettext_lazy as _
from datetime import datetime
class Country(BaseModel):
international_name = models.CharField(max_length=250, verbose_name=_('Международное название'), blank=True, null=True)
official_name = models.CharField(max_length=250, verbose_name=_('Официальное название'), blank=True, null=True)
short_code = models.CharField(max_length=2, verbose_name=_('Код страны по ISO3166-1:alpha2'))
code = models.CharField(max_length=3, verbose_name=_('Код страны по ISO3166-1:alpha3'))
num_code = models.CharField(max_length=3, verbose_name=_('Код страны по ISO3166-1:numeric'), blank=True, null=True)
flag_img_url = models.URLField(verbose_name=_('Ссылка на изображение флага'), blank=True, null=True)
geo_lat = models.CharField(max_length=20, verbose_name=_('GPS широта'), blank=True, null=True)
geo_lon = models.CharField(max_length=20, verbose_name=_('GPS долгота'), blank=True, null=True)
timezone = models.CharField(max_length=250, verbose_name=_('Часовая зона'), blank=True, null=True)
area_id = models.BigIntegerField(blank=True, null=True)
parsing_finished_DT = models.DateTimeField(verbose_name=_('Дата и время завершения парсинга'), blank=True, null=True)
def __str__(self):
if self.name:
return f'{self.name}'
elif self.international_name:
return f'{self.international_name}'
elif self.official_name:
return f'{self.official_name}'
elif self.code:
return f'{self.code}'
class Meta:
verbose_name = _('Страна')
verbose_name_plural = _('Страны')
ordering = ('name', 'code')
class City(BaseModel):
country = models.ForeignKey(
Country, verbose_name=_('Страна'), related_name='rel_cities_for_country', on_delete=models.CASCADE)
geo_lat = models.CharField(max_length=20, verbose_name=_('GPS широта'), blank=True, null=True)
geo_lon = models.CharField(max_length=20, verbose_name=_('GPS долгота'), blank=True, null=True)
area_id = models.BigIntegerField(blank=True, null=True)
timezone = models.CharField(max_length=250, verbose_name=_('Часовая зона'), blank=True, null=True)
parsing_finished_DT = models.DateTimeField(verbose_name=_('Дата и время завершения парсинга'), blank=True, null=True)
def __str__(self):
if self.name:
return f'{self.name}'
else:
return f'{self.id}'
def get_n_save_timezone(self):
from ReferenceDataApp.funcs import tzf
self.timezone = tzf.timezone_at(lng=float(self.geo_lon), lat=float(self.geo_lat))
self.save(update_fields=['timezone'])
return self.timezone
def get_current_datetime(self):
if not self.timezone:
self.timezone = self.get_n_save_timezone()
return datetime.now(tz=pytz.timezone(self.timezone))
def get_country_n_city_str(self):
country = _('Неизвестно')
city = self.name
if self.country:
country = self.country
return f'{city} / {country}'
class Meta:
verbose_name = _('Город')
verbose_name_plural = _('Города')
ordering = ('name',)
class Airport(BaseModel):
city = models.ForeignKey(
City, verbose_name=_('Город'), related_name='rel_airports_for_city', on_delete=models.CASCADE,
blank=True, null=True)
international_name = models.CharField(max_length=250, verbose_name=_('Международное название'), blank=True, null=True)
iata_code = models.CharField(max_length=3, verbose_name='IATA')
icao_code = models.CharField(max_length=4, verbose_name='ICAO')
geo_lat = models.CharField(max_length=20, verbose_name=_('GPS широта'), blank=True, null=True)
geo_lon = models.CharField(max_length=20, verbose_name=_('GPS долгота'), blank=True, null=True)
timezone = models.CharField(max_length=250, verbose_name=_('Часовая зона'), blank=True, null=True)
area_id = models.BigIntegerField(blank=True, null=True)
parsing_finished_DT = models.DateTimeField(verbose_name=_('Дата и время завершения парсинга'), blank=True, null=True)
def __str__(self):
if self.name:
return f'{self.name}'
elif self.international_name:
return f'{self.international_name}'
elif self.iata_code:
return f'{self.iata_code}'
elif self.icao_code:
return f'{self.icao_code}'
else:
return f'{self.id}'
class Meta:
verbose_name = _('Аэропорт')
verbose_name_plural = _('Аэропорты')
ordering = ('name', 'iata_code')