Files
backend-v1/core/apps/evaluation/serializers/request/EvaluationRequest.py
xoliqberdiyev d448324f89 fix
2026-04-20 18:01:00 +05:00

186 lines
6.3 KiB
Python

import re
from django.contrib.auth import get_user_model
from rest_framework import serializers
from core.apps.evaluation.models import EvaluationrequestModel, ReferenceitemModel
from core.apps.evaluation.serializers.reference import ListReferenceitemSerializer
User = get_user_model()
class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
rate_type_display = serializers.CharField(
source="get_rate_type_display", read_only=True
)
object_type_display = serializers.CharField(
source="get_object_type_display", read_only=True, default=None
)
status_display = serializers.CharField(
source="get_status_display", read_only=True
)
location = serializers.SerializerMethodField()
location_name = serializers.CharField(required=False)
value_determined = ListReferenceitemSerializer(read_only=True)
rate_goal = ListReferenceitemSerializer(read_only=True)
property_rights = ListReferenceitemSerializer(read_only=True)
form_ownership = ListReferenceitemSerializer(read_only=True)
user = serializers.SerializerMethodField(method_name="get_user")
class Meta:
model = EvaluationrequestModel
fields = [
"id",
"rate_type",
"rate_type_display",
"object_type",
"object_type_display",
"customer_inn_number",
"owner_inn_number",
"tex_passport",
"value_determined",
"rate_goal",
"property_rights",
"form_ownership",
"worked_hours",
"chassi",
"need_delivering",
"location",
"location_name",
"status",
"status_display",
"user",
"created_at",
"updated_at",
]
def get_location(self, obj):
if obj.location_lat is not None and obj.location_lng is not None:
return {
"lat": float(obj.location_lat),
"lng": float(obj.location_lng),
"name": obj.location_name
}
return None
def get_user(self, obj):
request = self.context.get('request')
return {
"id": obj.user.id,
"phone": obj.user.phone,
"first_name": obj.user.first_name,
"last_name": obj.user.last_name,
"role": obj.user.role,
"avatar": request.build_absolute_uri(obj.user.avatar.url) if obj.user.avatar else None
}
class ListEvaluationrequestSerializer(BaseEvaluationrequestSerializer):
class Meta(BaseEvaluationrequestSerializer.Meta):
pass
class RetrieveEvaluationrequestSerializer(BaseEvaluationrequestSerializer):
class Meta(BaseEvaluationrequestSerializer.Meta):
pass
class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
location = serializers.DictField(required=False, allow_empty=True)
# locationName — string qabul qiladi, location ichida yoki tashqarida yuborsa bo'ladi
locationName = serializers.CharField(
write_only=True,
required=False,
allow_null=True,
allow_blank=True,
)
# Faqat truck_car uchun majburiy — field darajasida optional qilib belgilaymiz,
# validate() da object_type ga qarab tekshiramiz
worked_hours = serializers.IntegerField(
required=False,
allow_null=True,
)
chassi = serializers.CharField(
required=False,
allow_null=True,
allow_blank=True,
)
value_determined = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
rate_goal = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
property_rights = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
form_ownership = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
class Meta:
model = EvaluationrequestModel
fields = [
"value_determined",
"rate_goal",
"property_rights",
"form_ownership",
"rate_type",
"object_type",
"customer_inn_number",
"owner_inn_number",
"tex_passport",
"worked_hours",
"chassi",
"need_delivering",
"location",
"locationName",
]
def validate_tex_passport(self, value):
if value and not re.match(r"^[A-Z]{2}\s?\d{7}$", value):
raise serializers.ValidationError(
"Format: AA 1234567 (2 harf + 7 raqam)"
)
return value
def validate(self, attrs):
rate_type = attrs.get("rate_type")
object_type = attrs.get("object_type")
if rate_type == "auto" and not object_type:
raise serializers.ValidationError(
{"object_type": "rate_type 'auto' bo'lganda object_type majburiy."}
)
if rate_type == "auto" and not attrs.get("tex_passport"):
raise serializers.ValidationError(
{"tex_passport": "rate_type 'auto' bo'lganda tex_passport majburiy."}
)
# worked_hours va chassi FAQAT yuk avtomobil (truck_car) uchun majburiy
if object_type == "truck_car":
if attrs.get("worked_hours") is None:
raise serializers.ValidationError(
{"worked_hours": "Yuk avtomobil uchun ishlagan soati majburiy."}
)
if not attrs.get("chassi"):
raise serializers.ValidationError(
{"chassi": "Yuk avtomobil uchun shassi raqami majburiy."}
)
return attrs
def create(self, validated_data):
location = validated_data.pop("location", None)
location_name = validated_data.pop("locationName", None)
if location:
validated_data["location_lat"] = location.get("lat")
validated_data["location_lng"] = location.get("lng")
if not location_name:
location_name = location.get("name") or location.get("locationName")
if location_name:
validated_data["location_name"] = str(location_name)
validated_data["user"] = self.context["request"].user
return super().create(validated_data)