Files
tripwithbonus/backend/api/account/client/serializers.py
2025-05-21 16:31:09 +03:00

75 lines
2.8 KiB
Python
Raw 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 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)