from rest_framework import serializers class TelemetryEventSerializer(serializers.Serializer): """یک رویدادِ خام از اپ — نوع‌اش تعیین می‌کند کدام فیلدها معنی دارند. عمداً یک سریالایزرِ آزاد (نه یکی برای هر مدل) چون این اندپوینت دسته‌ای (batch) کار می‌کند و ترکیبِ چند نوع رویداد را با هم می‌گیرد.""" type = serializers.ChoiceField( choices=["session_start", "session_end", "page_view", "click", "error"] ) at = serializers.DateTimeField() screen = serializers.CharField(max_length=150, required=False, allow_blank=True, default="") duration_seconds = serializers.FloatField(required=False, allow_null=True, default=None) element = serializers.CharField(max_length=150, required=False, allow_blank=True, default="") x = serializers.FloatField(required=False, allow_null=True, default=None) y = serializers.FloatField(required=False, allow_null=True, default=None) message = serializers.CharField(required=False, allow_blank=True, default="") stack = serializers.CharField(required=False, allow_blank=True, default="") class TelemetryBatchSerializer(serializers.Serializer): session_id = serializers.CharField(max_length=36) platform = serializers.CharField(max_length=30, required=False, allow_blank=True, default="") app_version = serializers.CharField(max_length=30, required=False, allow_blank=True, default="") events = TelemetryEventSerializer(many=True) def validate_events(self, value): if not value: raise serializers.ValidationError("حداقل یک رویداد لازم است.") return value