from rest_framework import serializers from apps.reviews.models import Review def _display_name(user) -> str: if user.name: return user.name # حریمِ خصوصی: برای کاربرِ بی‌نام، فقط ۴ رقمِ آخرِ شماره نشان داده می‌شود. return f"کاربر ...{user.phone[-4:]}" class ReviewSerializer(serializers.ModelSerializer): user_display = serializers.SerializerMethodField() like_count = serializers.IntegerField(read_only=True) liked_by_me = serializers.SerializerMethodField() is_mine = serializers.SerializerMethodField() class Meta: model = Review fields = [ "id", "user_display", "body", "is_approved", "like_count", "liked_by_me", "is_mine", "created_at", "updated_at", ] read_only_fields = ["is_approved", "created_at", "updated_at"] def get_user_display(self, obj: Review) -> str: return _display_name(obj.user) def get_liked_by_me(self, obj: Review) -> bool: request = self.context.get("request") if request is None or not request.user.is_authenticated: return False # get_liked_ids (اگر در context باشد) از یک کوئریِ batch پر می‌شود تا # برای فهرست، به‌ازای هر نظر یک کوئریِ جدا نزنیم. liked_ids = self.context.get("liked_ids") if liked_ids is not None: return obj.id in liked_ids return obj.likes.filter(user=request.user).exists() def get_is_mine(self, obj: Review) -> bool: request = self.context.get("request") return bool(request and request.user.is_authenticated and obj.user_id == request.user.id) class ReviewWriteSerializer(serializers.Serializer): body = serializers.CharField(max_length=1000) def validate_body(self, value: str) -> str: value = value.strip() if not value: raise serializers.ValidationError("متنِ نظر نمی‌تواند خالی باشد.") return value