Files
bitcoin_monitor/api/serializers.py
2026-01-16 22:20:18 +03:00

70 lines
2.8 KiB
Python

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()