feat: add ReferenceItem model and update QuickEvaluation FKs
- Create ReferenceitemModel with type, name, parent (self FK), order, is_active fields - Add ReferenceType choices: brand, marka, color, fuel_type, body_type, car_position, state_car - Implement ReferenceItem API (list, retrieve) with filter by type/parent/is_active, search, ordering - Add ReferenceItem admin with list_filter, search, inline editing - Change QuickEvaluation FK fields from shared.OptionsModel to evaluation.ReferenceitemModel - Update serializers and views to use .name instead of .key - Add ReferenceItem to unfold admin navigation
This commit is contained in:
@@ -1,14 +1,21 @@
|
||||
import re
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.evaluation.models import QuickEvaluationModel
|
||||
|
||||
|
||||
class BaseQuickevaluationSerializer(serializers.ModelSerializer):
|
||||
fuel_type_display = serializers.CharField(source="get_fuel_type_display", read_only=True)
|
||||
body_type_display = serializers.CharField(source="get_body_type_display", read_only=True)
|
||||
condition_display = serializers.CharField(source="get_condition_display", read_only=True)
|
||||
created_by_name = serializers.CharField(source="created_by.get_full_name", read_only=True)
|
||||
status_display = serializers.CharField(source="get_status_display", read_only=True)
|
||||
car_type_display = serializers.CharField(source="get_car_type_display", read_only=True)
|
||||
state_car_display = serializers.CharField(source="get_state_car_display", read_only=True)
|
||||
brand_name = serializers.CharField(source="brand.name", read_only=True, default=None)
|
||||
marka_name = serializers.CharField(source="marka.name", read_only=True, default=None)
|
||||
color_name = serializers.CharField(source="color.name", read_only=True, default=None)
|
||||
fuel_type_name = serializers.CharField(source="fuel_type.name", read_only=True, default=None)
|
||||
body_type_name = serializers.CharField(source="body_type.name", read_only=True, default=None)
|
||||
state_car_name = serializers.CharField(source="state_car.name", read_only=True, default=None)
|
||||
car_position_name = serializers.CharField(source="car_position.name", read_only=True, default=None)
|
||||
|
||||
class Meta:
|
||||
model = QuickEvaluationModel
|
||||
@@ -17,55 +24,104 @@ class BaseQuickevaluationSerializer(serializers.ModelSerializer):
|
||||
"created_by",
|
||||
"created_by_name",
|
||||
"brand",
|
||||
"model",
|
||||
"license_plate",
|
||||
"manufacture_year",
|
||||
"brand_name",
|
||||
"marka",
|
||||
"marka_name",
|
||||
"car_number",
|
||||
"car_manufactured_date",
|
||||
"estimated_price",
|
||||
"status",
|
||||
"status_display",
|
||||
"car_type",
|
||||
"car_type_display",
|
||||
"state_car",
|
||||
"state_car_display",
|
||||
"state_car_name",
|
||||
"created_at",
|
||||
]
|
||||
|
||||
|
||||
class ListQuickevaluationSerializer(BaseQuickevaluationSerializer):
|
||||
class Meta(BaseQuickevaluationSerializer.Meta):
|
||||
pass
|
||||
|
||||
|
||||
class RetrieveQuickevaluationSerializer(BaseQuickevaluationSerializer):
|
||||
class Meta(BaseQuickevaluationSerializer.Meta):
|
||||
fields = BaseQuickevaluationSerializer.Meta.fields + [
|
||||
"tech_passport_number",
|
||||
"mileage",
|
||||
"tex_passport_serie_num",
|
||||
"tech_passport_issued_date",
|
||||
"tech_passport_issued_place",
|
||||
"tex_passport_file",
|
||||
"car_position",
|
||||
"car_position_name",
|
||||
"distance_covered",
|
||||
"body_type",
|
||||
"body_type_name",
|
||||
"vin_number",
|
||||
"engine_number",
|
||||
"color",
|
||||
"color_name",
|
||||
"fuel_type",
|
||||
"fuel_type_display",
|
||||
"body_type",
|
||||
"body_type_display",
|
||||
"condition",
|
||||
"condition_display",
|
||||
"fuel_type_name",
|
||||
"updated_at",
|
||||
]
|
||||
|
||||
class CreateQuickevaluationSerializer(BaseQuickevaluationSerializer):
|
||||
class Meta(BaseQuickevaluationSerializer.Meta):
|
||||
|
||||
class CreateQuickevaluationSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = QuickEvaluationModel
|
||||
fields = [
|
||||
"tech_passport_number",
|
||||
"license_plate",
|
||||
"model",
|
||||
"tex_passport_serie_num",
|
||||
"tech_passport_issued_date",
|
||||
"tech_passport_issued_place",
|
||||
"tex_passport_file",
|
||||
"car_type",
|
||||
"brand",
|
||||
"manufacture_year",
|
||||
"mileage",
|
||||
"marka",
|
||||
"car_position",
|
||||
"distance_covered",
|
||||
"body_type",
|
||||
"vin_number",
|
||||
"car_number",
|
||||
"car_manufactured_date",
|
||||
"engine_number",
|
||||
"color",
|
||||
"fuel_type",
|
||||
"body_type",
|
||||
"condition",
|
||||
"car_type",
|
||||
"state_car",
|
||||
]
|
||||
|
||||
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_vin_number(self, value):
|
||||
if value and len(value) != 17:
|
||||
raise serializers.ValidationError("VIN raqami 17 belgidan iborat bo'lishi kerak.")
|
||||
return value
|
||||
|
||||
def validate(self, attrs):
|
||||
car_type = attrs.get("car_type")
|
||||
if car_type == "lightweight":
|
||||
if not attrs.get("distance_covered"):
|
||||
raise serializers.ValidationError(
|
||||
{"distance_covered": "car_type 'lightweight' uchun majburiy."}
|
||||
)
|
||||
if not attrs.get("body_type"):
|
||||
raise serializers.ValidationError(
|
||||
{"body_type": "car_type 'lightweight' uchun majburiy."}
|
||||
)
|
||||
if car_type == "truck":
|
||||
if not attrs.get("vin_number"):
|
||||
raise serializers.ValidationError(
|
||||
{"vin_number": "car_type 'truck' uchun majburiy."}
|
||||
)
|
||||
return attrs
|
||||
|
||||
def create(self, validated_data):
|
||||
request = self.context.get("request")
|
||||
if request and request.user and request.user.is_authenticated:
|
||||
validated_data["created_by"] = request.user
|
||||
return super().create(validated_data)
|
||||
|
||||
Reference in New Issue
Block a user