import re from django.contrib.auth import get_user_model from rest_framework import serializers from core.apps.evaluation.choices.request import RequestStatus from core.apps.evaluation.models import AutoEvaluationModel, ReferenceitemModel, EvaluationrequestModel from core.apps.evaluation.serializers.reference import ListReferenceitemSerializer 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) 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", "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) class Meta(BaseAutoevaluationSerializer.Meta): fields = BaseAutoevaluationSerializer.Meta.fields + [ # Step 1 "contract_date", "object_inspection_date", "rate_date", "rate_report_date", # 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): value_determined = 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", "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", "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): value_determined = 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", "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", "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") if evaluation_req: 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 class AutoEvaluationSerializer(serializers.Serializer): brand = serializers.CharField() brand_model = serializers.CharField() year = serializers.CharField() color = serializers.CharField() transmission = serializers.CharField() condition = serializers.CharField() fuel_type = serializers.CharField() mileage = serializers.CharField() class AutoEvaluationModelSerializer(serializers.ModelSerializer): user = serializers.StringRelatedField(read_only=True) appraisers = serializers.PrimaryKeyRelatedField( many=True, queryset=User.objects.all(), required=False ) class Meta: model = AutoEvaluationModel fields = ("tex_passport_file", "registration_number", "contract_date", "object_inspection_date", "rate_date", "rate_report_date", "object_type", "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", "value_determined", "rate_type", "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", "rating_goal", "status", "is_archived", "created_at", "updated_at", ) read_only_fields = ( "id", "created_at", "updated_at", )