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)