Files
links/invest/serializers.py
T
2026-04-18 22:01:34 +10:00

141 lines
4.6 KiB
Python

from rest_framework import serializers
from .models import Portfolio, Stock, Transaction
class StockSerializer(serializers.ModelSerializer):
class Meta:
model = Stock
fields = ['id', 'portfolio', 'stock_code', 'quantity']
read_only_fields = ['id']
class TransactionSerializer(serializers.ModelSerializer):
action_display = serializers.CharField(source='get_action_display', read_only=True)
class Meta:
model = Transaction
fields = [
'id', 'portfolio', 'action', 'action_display',
'stock_code', 'quantity', 'date', 'created_at',
]
read_only_fields = ['id', 'created_at']
class PortfolioSerializer(serializers.ModelSerializer):
stocks = StockSerializer(many=True, read_only=True)
class Meta:
model = Portfolio
fields = ['id', 'name', 'created_at', 'stocks']
read_only_fields = ['id', 'created_at']
class PortfolioListSerializer(serializers.ModelSerializer):
stock_count = serializers.SerializerMethodField()
class Meta:
model = Portfolio
fields = ['id', 'name', 'created_at', 'stock_count']
read_only_fields = ['id', 'created_at']
def get_stock_count(self, obj):
return obj.stocks.count()
# ---------------------------------------------------------------------------
# AI Update
# ---------------------------------------------------------------------------
class AIHoldingInputSerializer(serializers.Serializer):
stock_code = serializers.CharField()
quantity = serializers.FloatField()
class AIUpdateSerializer(serializers.Serializer):
portfolio_id = serializers.IntegerField()
holdings = AIHoldingInputSerializer(many=True)
reset = serializers.BooleanField(default=False)
class TransactionSerializer(serializers.ModelSerializer):
action_display = serializers.CharField(source='get_action_display', read_only=True)
class Meta:
model = Transaction
fields = [
'id', 'portfolio', 'action', 'action_display',
'stock_code', 'quantity', 'price_per_share', 'date',
'created_at',
]
read_only_fields = ['id', 'created_at']
class PortfolioSerializer(serializers.ModelSerializer):
stocks = StockSerializer(many=True, read_only=True)
class Meta:
model = Portfolio
fields = ['id', 'name', 'created_at', 'stocks']
read_only_fields = ['id', 'created_at']
class PortfolioListSerializer(serializers.ModelSerializer):
stock_count = serializers.SerializerMethodField()
class Meta:
model = Portfolio
fields = ['id', 'name', 'created_at', 'stock_count']
read_only_fields = ['id', 'created_at']
def get_stock_count(self, obj):
return obj.stocks.count()
# --------------------------------------------------------------------------+
# Holdings (with real-time prices) |
# -------------------------------------------------------------------------+
class HoldingSerializer(serializers.Serializer):
stock_code = serializers.CharField()
quantity = serializers.FloatField()
avg_cost = serializers.FloatField()
current_price = serializers.FloatField()
current_value = serializers.FloatField()
unrealized_pnl = serializers.FloatField()
unrealized_pnl_pct = serializers.FloatField()
class PortfolioHoldingsSerializer(serializers.Serializer):
portfolio_id = serializers.IntegerField()
portfolio_name = serializers.CharField()
holdings = HoldingSerializer(many=True)
total_value = serializers.FloatField()
total_cost = serializers.FloatField()
total_pnl = serializers.FloatField()
total_pnl_pct = serializers.FloatField()
# --------------------------------------------------------------------------+
# AI Update |
# -------------------------------------------------------------------------+
class AIHoldingInputSerializer(serializers.Serializer):
stock_code = serializers.CharField()
quantity = serializers.FloatField()
avg_cost = serializers.FloatField(required=False, default=0.0)
class AIUpdateSerializer(serializers.Serializer):
portfolio_id = serializers.IntegerField()
holdings = AIHoldingInputSerializer(many=True)
reset = serializers.BooleanField(default=False)
class AIUpdateResultSerializer(serializers.Serializer):
stock_code = serializers.CharField()
quantity = serializers.FloatField()
avg_cost = serializers.FloatField()
stock_created = serializers.BooleanField()
tx_status = serializers.CharField()