Files
tripwithbonus/RoutesApp/models.py
2025-02-28 14:43:34 +03:00

205 lines
7.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.db import models
from django.utils.translation import gettext_lazy as _
from BaseModels.base_models import BaseModel
from colorfield.fields import ColorField
from datetime import datetime
type_transport_choices = [
('road', _('Авто (любой наземный транспорт)')),
('avia', _('Авиа')),
('', _('Мне без разницы')),
]
transfer_location_choices = (
('airport', _('В аэропорту')),
('city', _('По городу')),
('other', _('По договоренности'))
)
cargo_type_choices = (
('letter', _('Письмо\Документы')),
('package', _('Посылка (до 30кг)')),
('passenger', _('Попутчик')),
('parcel', _('Бандероль (до 5кг)')),
('cargo', _('Груз (свыше 30 кг)')),
)
owner_type_choices = (
('customer', _('Заказчик')),
('mover', _('Перевозчик'))
)
class Route(BaseModel):
from django.contrib.auth.models import User
from ReferenceDataApp.models import City
owner_type = models.CharField(
choices=owner_type_choices, default='customer', verbose_name=_('Тип опреации'))
type_transport = models.CharField(
choices=type_transport_choices, default='', verbose_name=_('Выберите способ перевозки'),
blank=True
)
# не обязательно с v2
departure_DT = models.DateTimeField(
verbose_name=_('Дата и время выезда'), null=True, blank=True
)
arrival_DT = models.DateTimeField(verbose_name=_('Дата и время прибытия'))
# не используем с v2
from_address_point = models.IntegerField(
verbose_name=_('Пункт выезда'), null=True, blank=True
)
# не используем с v2
to_address_point = models.IntegerField(
verbose_name=_('Пункт приезда'), null=True, blank=True
)
from_city = models.ForeignKey(
City, verbose_name=_('Город отправки'), related_name='rel_routes_for_cityFrom', on_delete=models.SET_NULL,
null=True, blank=True
)
to_city = models.ForeignKey(
City, verbose_name=_('Город получения'), related_name='rel_routes_for_cityTo', on_delete=models.SET_NULL,
null=True, blank=True
)
# не используем с v2
from_place = models.CharField(
choices=transfer_location_choices, default='other',
verbose_name=_('Откуда можете забрать?'),
null=True, blank=True
)
# не используем с v2
to_place = models.CharField(
choices=transfer_location_choices, default='other',
verbose_name=_('Куда можете доставить?'),
null=True, blank=True
)
cargo_type = models.CharField(
choices=cargo_type_choices, default='letter', verbose_name=_('Могу перевезти')
)
# не используем с v2
weight = models.IntegerField(verbose_name=_('Укажите вес до (кг)'), null=True, blank=True)
phone = models.CharField(verbose_name=_('Укажите номер для связи'), blank=True, null=True)
# не используем с v2
extra_phone = models.CharField(verbose_name=_('Дополнительный номер'), blank=True, null=True)
receive_msg_by_email = models.BooleanField(default=False, verbose_name=_('Получать уведомления по E-mail'))
# не используем с v2
receive_msg_by_sms = models.BooleanField(default=False, verbose_name=_('Получать уведомления по SMS'))
owner = models.ForeignKey(User, verbose_name=_('Владелец'), related_name='rel_routes_for_owner', on_delete=models.CASCADE)
# добавлен в v2
comment = models.TextField(verbose_name='Примечания', null=True, blank=True)
rising_DT = models.DateTimeField(
verbose_name=_('Дата и время последнего поднятия'),
blank=True, null=True
)
highlight_color = ColorField(
verbose_name=_('Цвет выделения'),
blank=True, null=True
)
highlight_end_DT = models.DateTimeField(
verbose_name=_('Дата и время окончания выделения'),
blank=True, null=True
)
def __str__(self):
if self.name:
return f'{self.name}'
else:
return str(self.id)
class Meta:
verbose_name = _(u'Маршрут')
verbose_name_plural = _(u'Маршруты')
ordering = ('name',)
def is_highlighted_now(self):
if self.highlight_end_DT and datetime.now() < self.highlight_end_DT:
return True
return False
def get_permission_for_raise(self):
from SubscribesApp.funcs import get_cur_user_subscribe
user_subscribe = get_cur_user_subscribe(self.owner)
if not user_subscribe:
return False
data_Dict = user_subscribe.remains_route_adding_options()
if data_Dict['remains_route_rising_count'] > 0:
return True
return False
def get_permission_for_highlight(self):
from SubscribesApp.funcs import get_cur_user_subscribe
user_subscribe = get_cur_user_subscribe(self.owner)
if not user_subscribe:
return False
data_Dict = user_subscribe.remains_route_adding_options()
if data_Dict['remains_route_highlight_count'] > 0:
return True
return False
def from_country_n_city_str(self):
res = _('Неизвестно')
if self.from_city:
res = self.from_city.get_country_n_city_str()
return res
def to_country_n_city_str(self):
res = _('Неизвестно')
if self.to_city:
res = self.to_city.get_country_n_city_str()
return res
def get_address_points(self):
from ReferenceDataApp.models import Airport, City
try:
if self.type_transport == 'avia':
from_address_point_objs = Airport.objects.filter(id=self.from_address_point)
from_address_point_Dict = from_address_point_objs.values(
'id', 'name', 'iata_code', 'city__name', 'city__country__name')[0]
to_address_point_objs = Airport.objects.filter(id=self.to_address_point)
to_address_point_Dict = to_address_point_objs.values(
'id', 'name', 'iata_code', 'city__name', 'city__country__name')[0]
from_address_point_txt = f'{from_address_point_Dict["iata_code"]} - {from_address_point_Dict["name"]}'
to_address_point_txt = f'{to_address_point_Dict["iata_code"]} - {to_address_point_Dict["name"]}'
else:
from_address_point_objs = City.objects.filter(id=self.from_address_point)
from_address_point_Dict = from_address_point_objs.values(
'id', 'name', 'country__name')[0]
to_address_point_objs = City.objects.filter(id=self.to_address_point)
to_address_point_Dict = to_address_point_objs.values(
'id', 'name', 'country__name')[0]
from_address_point_txt = f'{from_address_point_Dict["name"]} / {from_address_point_Dict["country__name"]}'
to_address_point_txt = f'{to_address_point_Dict["name"]} / {to_address_point_Dict["country__name"]}'
return {
'from_address_point_obj': from_address_point_objs[0],
'from_address_point_Dict': from_address_point_Dict,
'from_address_point_txt': from_address_point_txt,
'to_address_point_obj': to_address_point_objs[0],
'to_address_point_Dict': to_address_point_Dict,
'to_address_point_txt': to_address_point_txt,
}
except Exception as e:
print(f'get_address_points Error = {str(e)}')
return None