from rest_framework import serializers from monitor.models import BitcoinPrice, MarketAnalysis from django.utils import timezone class BitcoinPriceSerializer(serializers.ModelSerializer): class Meta: model = BitcoinPrice fields = ['id', 'timestamp', 'price_usd', 'volume', 'market_cap'] def to_representation(self, instance): # Convert Decimal to float for JSON data = super().to_representation(instance) data['price_usd'] = float(data['price_usd']) if data['volume']: data['volume'] = float(data['volume']) if data['market_cap']: data['market_cap'] = float(data['market_cap']) return data class MarketAnalysisSerializer(serializers.ModelSerializer): class Meta: model = MarketAnalysis fields = ['id', 'timestamp', 'period', 'current_price', 'average_price', 'min_price', 'max_price', 'status', 'threshold_percent', 'lower_threshold', 'upper_threshold', 'is_event', 'event_type'] def to_representation(self, instance): # Convert Decimal to float for JSON data = super().to_representation(instance) decimal_fields = ['current_price', 'average_price', 'min_price', 'max_price', 'threshold_percent', 'lower_threshold', 'upper_threshold'] for field in decimal_fields: if field in data and data[field]: data[field] = float(data[field]) return data class StatusResponseSerializer(serializers.Serializer): """Serializer for status API endpoint.""" current_price = serializers.FloatField() current_status = serializers.CharField() yearly_average = serializers.FloatField() yearly_min = serializers.FloatField() yearly_max = serializers.FloatField() threshold_percent = serializers.FloatField() lower_threshold = serializers.FloatField() upper_threshold = serializers.FloatField() last_yearly_update = serializers.DateTimeField(allow_null=True) last_hourly_update = serializers.DateTimeField(allow_null=True) stale_yearly = serializers.BooleanField() stale_hourly = serializers.BooleanField() fetch_error = serializers.CharField(allow_null=True, allow_blank=True) class ChartDataSerializer(serializers.Serializer): """Serializer for chart data API endpoint.""" timestamps = serializers.ListField(child=serializers.DateTimeField()) prices = serializers.ListField(child=serializers.FloatField()) events = MarketAnalysisSerializer(many=True) threshold_percent = serializers.FloatField() class HealthCheckSerializer(serializers.Serializer): """Serializer for health check endpoint.""" status = serializers.CharField() timestamp = serializers.DateTimeField() checks = serializers.DictField()