mirror of
https://github.com/wahyd4/links.git
synced 2026-08-09 05:06:16 +10:00
141 lines
4.6 KiB
Python
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()
|