""" Миксины для работы с пользователями. """ from rest_framework import serializers from .utils import format_datetime_for_user class TimezoneAwareSerializerMixin: """ Миксин для автоматической конвертации datetime полей в часовой пояс пользователя. Использование: class MySerializer(TimezoneAwareSerializerMixin, serializers.ModelSerializer): class Meta: model = MyModel fields = ['id', 'created_at', 'updated_at', ...] Автоматически конвертирует все datetime поля в часовой пояс пользователя из request.user.timezone """ def to_representation(self, instance): """Переопределяем для конвертации времени в часовой пояс пользователя.""" data = super().to_representation(instance) # Получаем часовой пояс пользователя из request request = self.context.get('request') user_timezone = 'UTC' if request and hasattr(request, 'user') and request.user.is_authenticated: user_timezone = request.user.timezone or 'UTC' # Список полей для конвертации (можно переопределить в дочерних классах) datetime_fields = getattr(self.Meta, 'timezone_aware_fields', None) if datetime_fields is None: # Автоматически определяем datetime поля из модели if hasattr(self.Meta, 'model'): model = self.Meta.model datetime_fields = [] for field in model._meta.get_fields(): if hasattr(field, 'get_internal_type'): field_type = field.get_internal_type() if field_type in ['DateTimeField', 'DateField']: datetime_fields.append(field.name) # Конвертируем все datetime поля в часовой пояс пользователя if datetime_fields: for field_name in datetime_fields: if field_name in data and data[field_name]: field_value = getattr(instance, field_name, None) if field_value: data[field_name] = format_datetime_for_user(field_value, user_timezone) return data