75 lines
2.8 KiB
Python
75 lines
2.8 KiB
Python
from rest_framework import serializers
|
||
from routes.models import Route, City
|
||
from django.conf import settings
|
||
from routes.constants.routeChoices import cargo_type_choices, type_transport_choices
|
||
import pytz
|
||
|
||
class RouteSerializer(serializers.ModelSerializer):
|
||
from_city_name = serializers.SerializerMethodField()
|
||
to_city_name = serializers.SerializerMethodField()
|
||
from_country_name = serializers.SerializerMethodField()
|
||
to_country_name = serializers.SerializerMethodField()
|
||
formatted_departure = serializers.SerializerMethodField()
|
||
formatted_arrival = serializers.SerializerMethodField()
|
||
formatted_cargo_type = serializers.SerializerMethodField()
|
||
formatted_transport = serializers.SerializerMethodField()
|
||
|
||
class Meta:
|
||
model = Route
|
||
fields = '__all__'
|
||
|
||
def get_from_city_name(self, obj):
|
||
try:
|
||
city = City.objects.get(id=obj.from_city_id)
|
||
return city.name
|
||
except City.DoesNotExist:
|
||
return None
|
||
|
||
def get_to_city_name(self, obj):
|
||
try:
|
||
city = City.objects.get(id=obj.to_city_id)
|
||
return city.name
|
||
except City.DoesNotExist:
|
||
return None
|
||
|
||
def get_from_country_name(self, obj):
|
||
try:
|
||
city = City.objects.get(id=obj.from_city_id)
|
||
return city.country.international_name or city.country.official_name
|
||
except (City.DoesNotExist, AttributeError):
|
||
return None
|
||
|
||
def get_to_country_name(self, obj):
|
||
try:
|
||
city = City.objects.get(id=obj.to_city_id)
|
||
return city.country.international_name or city.country.official_name
|
||
except (City.DoesNotExist, AttributeError):
|
||
return None
|
||
|
||
def _convert_to_local_time(self, dt):
|
||
if dt is None:
|
||
return None
|
||
# проверяем что у datetime есть временная зона (если нет, считаем UTC)
|
||
if dt.tzinfo is None:
|
||
dt = pytz.UTC.localize(dt)
|
||
# конвертируем в локальную временную зону
|
||
local_tz = pytz.timezone(settings.TIME_ZONE)
|
||
local_dt = dt.astimezone(local_tz)
|
||
return local_dt
|
||
|
||
def get_formatted_departure(self, obj):
|
||
local_dt = self._convert_to_local_time(obj.departure_DT)
|
||
return local_dt.strftime("%d.%m.%Y, %H:%M") if local_dt else None
|
||
|
||
def get_formatted_arrival(self, obj):
|
||
local_dt = self._convert_to_local_time(obj.arrival_DT)
|
||
return local_dt.strftime("%d.%m.%Y, %H:%M") if local_dt else None
|
||
|
||
def get_formatted_cargo_type(self, obj):
|
||
cargo_types = dict(cargo_type_choices)
|
||
return cargo_types.get(obj.cargo_type, obj.cargo_type)
|
||
|
||
def get_formatted_transport(self, obj):
|
||
transport_types = dict(type_transport_choices)
|
||
return transport_types.get(obj.type_transport, obj.type_transport)
|