358 lines
13 KiB
Python
358 lines
13 KiB
Python
import re
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from rest_framework import serializers
|
|
|
|
from core.apps.evaluation.models import AutoEvaluationModel,ReferenceitemModel, EvaluationrequestModel
|
|
from core.apps.evaluation.serializers.reference import ListReferenceitemSerializer
|
|
from core.apps.evaluation.choices.request import RequestStatus
|
|
|
|
User = get_user_model()
|
|
|
|
class BaseAutoevaluationSerializer(serializers.ModelSerializer):
|
|
status_display = serializers.CharField(source="get_status_display", read_only=True)
|
|
object_type_display = serializers.CharField(source="get_object_type_display", read_only=True, default=None)
|
|
object_owner_type_display = serializers.CharField(source="get_object_owner_type_display", read_only=True, default=None)
|
|
rate_type = ListReferenceitemSerializer(read_only=True)
|
|
value_determined = ListReferenceitemSerializer(read_only=True)
|
|
property_rights = ListReferenceitemSerializer(read_only=True)
|
|
form_ownership = ListReferenceitemSerializer(read_only=True)
|
|
user = serializers.SerializerMethodField(method_name="get_user", read_only=True)
|
|
|
|
class Meta:
|
|
model = AutoEvaluationModel
|
|
fields = [
|
|
"id",
|
|
"contract_date",
|
|
"object_inspection_date",
|
|
"object_owner_individual_person_passport_num",
|
|
"object_owner_type",
|
|
"object_owner_individual_person_f_name",
|
|
"object_owner_individual_person_l_name",
|
|
"object_owner_individual_person_p_name",
|
|
"object_owner_legal_entity",
|
|
"object_owner_legal_inn",
|
|
"tex_passport_serie_num",
|
|
"rating_goal",
|
|
"registration_number",
|
|
"object_type",
|
|
"object_type_display",
|
|
"car_brand",
|
|
"car_model",
|
|
"car_number",
|
|
"manufacture_year",
|
|
"car_color",
|
|
"status",
|
|
"status_display",
|
|
"created_at",
|
|
"value_determined",
|
|
"rate_type",
|
|
"property_rights",
|
|
"form_ownership",
|
|
"user",
|
|
"evaluation_request",
|
|
]
|
|
|
|
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,
|
|
"avatar": request.build_absolute_uri(obj.user.avatar.url) if obj.user.avatar else None
|
|
} if obj.user else None
|
|
|
|
|
|
class ListAutoevaluationSerializer(BaseAutoevaluationSerializer):
|
|
class Meta(BaseAutoevaluationSerializer.Meta):
|
|
pass
|
|
|
|
|
|
class RetrieveAutoevaluationSerializer(BaseAutoevaluationSerializer):
|
|
car_type_display = serializers.CharField(source="get_car_type_display", read_only=True, default=None)
|
|
car_wheel_display = serializers.CharField(source="get_car_wheel_display", read_only=True, default=None)
|
|
# object_location_highways_display = serializers.CharField(
|
|
# source="get_object_location_highways_display", read_only=True, default=None
|
|
# )
|
|
# object_location_covenience_display = serializers.CharField(
|
|
# source="get_object_location_covenience_display", read_only=True, default=None
|
|
# )
|
|
|
|
class Meta(BaseAutoevaluationSerializer.Meta):
|
|
fields = BaseAutoevaluationSerializer.Meta.fields + [
|
|
# Step 1
|
|
"contract_date",
|
|
"object_inspection_date",
|
|
"rate_date",
|
|
"rate_report_date",
|
|
"rate_object_name",
|
|
# Step 2
|
|
"object_owner_type",
|
|
"object_owner_type_display",
|
|
"object_owner_individual_person_f_name",
|
|
"object_owner_individual_person_l_name",
|
|
"object_owner_individual_person_p_name",
|
|
"object_owner_individual_person_passport_num",
|
|
"object_owner_legal_entity",
|
|
"object_owner_legal_inn",
|
|
# Step 4
|
|
"tex_passport_serie_num",
|
|
"tex_passport_file",
|
|
"tex_passport_gived_date",
|
|
"tex_passport_gived_location",
|
|
"car_type",
|
|
"car_type_display",
|
|
"car_wheel",
|
|
"car_wheel_display",
|
|
"car_dvigatel_number",
|
|
# Extra
|
|
"valuation",
|
|
"vehicle",
|
|
"rating_goal",
|
|
"updated_at",
|
|
]
|
|
|
|
|
|
class UpdateAutoevaluationSerializer(serializers.ModelSerializer):
|
|
property_rights = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
value_determined = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
form_ownership = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
value_determined = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
rate_type = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
|
|
|
|
class Meta:
|
|
model = AutoEvaluationModel
|
|
fields = [
|
|
# Step 1
|
|
"registration_number",
|
|
"contract_date",
|
|
"object_inspection_date",
|
|
"rate_date",
|
|
"rate_report_date",
|
|
"rate_object_name",
|
|
"object_type",
|
|
# Step 2
|
|
"object_owner_type",
|
|
"object_owner_individual_person_f_name",
|
|
"object_owner_individual_person_l_name",
|
|
"object_owner_individual_person_p_name",
|
|
"object_owner_individual_person_passport_num",
|
|
"object_owner_legal_entity",
|
|
"object_owner_legal_inn",
|
|
"property_rights",
|
|
"form_ownership",
|
|
"value_determined",
|
|
"rate_type",
|
|
# Step 4
|
|
"tex_passport_file",
|
|
"tex_passport_serie_num",
|
|
"tex_passport_gived_date",
|
|
"tex_passport_gived_location",
|
|
"car_type",
|
|
"car_wheel",
|
|
"car_brand",
|
|
"car_model",
|
|
"car_number",
|
|
"manufacture_year",
|
|
"car_dvigatel_number",
|
|
"car_color",
|
|
]
|
|
|
|
def validate_tex_passport_serie_num(self, value):
|
|
if value and not re.match(r"^[A-Z]{3}\s?\d{7}$", value):
|
|
raise serializers.ValidationError(
|
|
"Format: AAA 1234567 (3 harf + 7 raqam)"
|
|
)
|
|
return value
|
|
|
|
def validate_object_owner_individual_person_passport_num(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):
|
|
owner_type = attrs.get("object_owner_type")
|
|
|
|
if owner_type == 1:
|
|
required_fields = {
|
|
"object_owner_individual_person_f_name": "Ismi",
|
|
"object_owner_individual_person_l_name": "Familiyasi",
|
|
"object_owner_individual_person_p_name": "Sharifi",
|
|
"object_owner_individual_person_passport_num": "Passport raqami",
|
|
}
|
|
for field, label in required_fields.items():
|
|
if not attrs.get(field):
|
|
raise serializers.ValidationError(
|
|
{field: f"Jismoniy shaxs uchun {label} majburiy."}
|
|
)
|
|
|
|
elif owner_type == 2:
|
|
if not attrs.get("object_owner_legal_entity"):
|
|
raise serializers.ValidationError(
|
|
{"object_owner_legal_entity": "Yuridik shaxs nomi majburiy."}
|
|
)
|
|
if not attrs.get("object_owner_legal_inn"):
|
|
raise serializers.ValidationError(
|
|
{"object_owner_legal_inn": "INN raqami majburiy."}
|
|
)
|
|
|
|
return attrs
|
|
|
|
class CreateAutoevaluationSerializer(serializers.ModelSerializer):
|
|
property_rights = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
value_determined = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
form_ownership = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
value_determined = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
rate_type = serializers.PrimaryKeyRelatedField(
|
|
queryset=ReferenceitemModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
evaluation_request = serializers.PrimaryKeyRelatedField(
|
|
queryset=EvaluationrequestModel.objects.all(),
|
|
required=False,
|
|
allow_null=True,
|
|
)
|
|
|
|
|
|
class Meta:
|
|
model = AutoEvaluationModel
|
|
fields = [
|
|
# Step 1
|
|
"registration_number",
|
|
"evaluation_request",
|
|
"contract_date",
|
|
"object_inspection_date",
|
|
"rate_date",
|
|
"rate_report_date",
|
|
"rate_object_name",
|
|
"object_type",
|
|
# Step 2
|
|
"object_owner_type",
|
|
"object_owner_individual_person_f_name",
|
|
"object_owner_individual_person_l_name",
|
|
"object_owner_individual_person_p_name",
|
|
"object_owner_individual_person_passport_num",
|
|
"object_owner_legal_entity",
|
|
"object_owner_legal_inn",
|
|
"property_rights",
|
|
"form_ownership",
|
|
"value_determined",
|
|
"rate_type",
|
|
# Step 4
|
|
"tex_passport_serie_num",
|
|
"tex_passport_file",
|
|
"tex_passport_gived_date",
|
|
"tex_passport_gived_location",
|
|
"car_type",
|
|
"car_wheel",
|
|
"car_brand",
|
|
"car_model",
|
|
"car_number",
|
|
"manufacture_year",
|
|
"car_dvigatel_number",
|
|
"car_color",
|
|
]
|
|
|
|
def validate_tex_passport_serie_num(self, value):
|
|
if value and not re.match(r"^[A-Z]{3}\s?\d{7}$", value):
|
|
raise serializers.ValidationError(
|
|
"Format: AAA 1234567 (3 harf + 7 raqam)"
|
|
)
|
|
return value
|
|
|
|
def validate_object_owner_individual_person_passport_num(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):
|
|
owner_type = attrs.get("object_owner_type")
|
|
if owner_type == 1:
|
|
required_fields = {
|
|
"object_owner_individual_person_f_name": "Ismi",
|
|
"object_owner_individual_person_l_name": "Familiyasi",
|
|
"object_owner_individual_person_p_name": "Sharifi",
|
|
"object_owner_individual_person_passport_num": "Passport raqami",
|
|
}
|
|
for field, label in required_fields.items():
|
|
if not attrs.get(field):
|
|
raise serializers.ValidationError(
|
|
{field: f"Jismoniy shaxs uchun {label} majburiy."}
|
|
)
|
|
|
|
elif owner_type == 2:
|
|
if not attrs.get("object_owner_legal_entity"):
|
|
raise serializers.ValidationError(
|
|
{"object_owner_legal_entity": "Yuridik shaxs nomi majburiy."}
|
|
)
|
|
if not attrs.get("object_owner_legal_inn"):
|
|
raise serializers.ValidationError(
|
|
{"object_owner_legal_inn": "INN raqami majburiy."}
|
|
)
|
|
|
|
return attrs
|
|
|
|
def create(self, validated_data):
|
|
user = self.context.get('request').user
|
|
validated_data['user'] = user
|
|
evaluation_req = validated_data.get("evaluation_request")
|
|
evaluation_req.status = RequestStatus.IN_PROGRESS
|
|
evaluation_req.save()
|
|
return super().create(validated_data)
|
|
|
|
|
|
class AutoEvaluationAppraisersSerializer(serializers.Serializer):
|
|
ids = serializers.ListField(child=serializers.IntegerField())
|
|
|
|
def validate(self, data):
|
|
if not data.get("ids"):
|
|
raise serializers.ValidationError("Appraisers IDs are required.")
|
|
users = User.objects.filter(id__in=data["ids"])
|
|
if not users:
|
|
raise serializers.ValidationError("Invalid appraisers IDs.")
|
|
data['users'] = users
|
|
return data
|