saas-market-analysis-dubai/apps/analytics/serializers.py
2025-09-17 03:04:22 +05:30

139 lines
4.7 KiB
Python

"""
Serializers for analytics models.
"""
from rest_framework import serializers
from .models import (
Broker, Developer, Project, Land, Transaction, Valuation, Rent,
Forecast, MarketTrend
)
class BrokerSerializer(serializers.ModelSerializer):
"""Serializer for Broker model."""
class Meta:
model = Broker
fields = '__all__'
class DeveloperSerializer(serializers.ModelSerializer):
"""Serializer for Developer model."""
class Meta:
model = Developer
fields = '__all__'
class ProjectSerializer(serializers.ModelSerializer):
"""Serializer for Project model."""
developer_name = serializers.CharField(source='developer.developer_name_en', read_only=True)
class Meta:
model = Project
fields = '__all__'
class LandSerializer(serializers.ModelSerializer):
"""Serializer for Land model."""
project_name = serializers.CharField(source='project.project_name_en', read_only=True)
class Meta:
model = Land
fields = '__all__'
class TransactionSerializer(serializers.ModelSerializer):
"""Serializer for Transaction model."""
project_name = serializers.CharField(source='project.project_name_en', read_only=True)
price_per_sqft = serializers.ReadOnlyField()
class Meta:
model = Transaction
fields = '__all__'
class ValuationSerializer(serializers.ModelSerializer):
"""Serializer for Valuation model."""
class Meta:
model = Valuation
fields = '__all__'
class RentSerializer(serializers.ModelSerializer):
"""Serializer for Rent model."""
project_name = serializers.CharField(source='project.project_name_en', read_only=True)
rent_per_sqft = serializers.ReadOnlyField()
class Meta:
model = Rent
fields = '__all__'
class ForecastSerializer(serializers.ModelSerializer):
"""Serializer for Forecast model."""
class Meta:
model = Forecast
fields = '__all__'
class MarketTrendSerializer(serializers.ModelSerializer):
"""Serializer for MarketTrend model."""
class Meta:
model = MarketTrend
fields = '__all__'
class TransactionSummarySerializer(serializers.Serializer):
"""Serializer for transaction summary statistics."""
total_transactions = serializers.IntegerField()
total_value = serializers.DecimalField(max_digits=15, decimal_places=2)
average_price = serializers.DecimalField(max_digits=15, decimal_places=2)
median_price = serializers.DecimalField(max_digits=15, decimal_places=2)
average_price_per_sqft = serializers.DecimalField(max_digits=10, decimal_places=2)
price_range_min = serializers.DecimalField(max_digits=15, decimal_places=2)
price_range_max = serializers.DecimalField(max_digits=15, decimal_places=2)
class AreaStatsSerializer(serializers.Serializer):
"""Serializer for area statistics."""
area = serializers.CharField()
transaction_count = serializers.IntegerField()
average_price = serializers.DecimalField(max_digits=15, decimal_places=2)
average_price_per_sqft = serializers.DecimalField(max_digits=10, decimal_places=2)
price_trend = serializers.CharField()
class PropertyTypeStatsSerializer(serializers.Serializer):
"""Serializer for property type statistics."""
property_type = serializers.CharField()
transaction_count = serializers.IntegerField()
average_price = serializers.DecimalField(max_digits=15, decimal_places=2)
average_price_per_sqft = serializers.DecimalField(max_digits=10, decimal_places=2)
market_share = serializers.DecimalField(max_digits=5, decimal_places=2)
class TimeSeriesDataSerializer(serializers.Serializer):
"""Serializer for time series data."""
date = serializers.DateTimeField()
value = serializers.DecimalField(max_digits=15, decimal_places=2)
count = serializers.IntegerField()
class ForecastRequestSerializer(serializers.Serializer):
"""Serializer for forecast requests."""
area_en = serializers.CharField(max_length=100)
property_type = serializers.CharField(max_length=50)
property_sub_type = serializers.CharField(max_length=50, required=False, allow_blank=True)
forecast_periods = serializers.IntegerField(default=12, min_value=1, max_value=60)
confidence_level = serializers.DecimalField(default=0.95, max_digits=3, decimal_places=2)
class MarketAnalysisSerializer(serializers.Serializer):
"""Serializer for market analysis results."""
area = serializers.CharField()
property_type = serializers.CharField()
analysis_period = serializers.CharField()
key_metrics = serializers.DictField()
trends = serializers.ListField()
recommendations = serializers.ListField()
forecast_accuracy = serializers.DecimalField(max_digits=5, decimal_places=2, allow_null=True)