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:
Husanjonazamov
2026-03-09 16:04:15 +05:00
parent fd2ecd953a
commit 3798037240
36 changed files with 744 additions and 106 deletions

View File

@@ -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)