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:
@@ -4,6 +4,7 @@ from .document import * # noqa
|
||||
from .movable import * # noqa
|
||||
from .quick import * # noqa
|
||||
from .real_estate import * # noqa
|
||||
from .reference import * # noqa
|
||||
from .report import * # noqa
|
||||
from .valuation import * # noqa
|
||||
from .vehicle import * # noqa
|
||||
|
||||
@@ -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)
|
||||
|
||||
48
core/apps/evaluation/serializers/reference/ReferenceItem.py
Normal file
48
core/apps/evaluation/serializers/reference/ReferenceItem.py
Normal file
@@ -0,0 +1,48 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.evaluation.models import ReferenceitemModel
|
||||
|
||||
|
||||
class BaseReferenceitemSerializer(serializers.ModelSerializer):
|
||||
type_display = serializers.CharField(source="get_type_display", read_only=True)
|
||||
parent_name = serializers.CharField(source="parent.name", read_only=True, default=None)
|
||||
|
||||
class Meta:
|
||||
model = ReferenceitemModel
|
||||
fields = [
|
||||
"id",
|
||||
"type",
|
||||
"type_display",
|
||||
"name",
|
||||
"parent",
|
||||
"parent_name",
|
||||
"order",
|
||||
"is_active",
|
||||
]
|
||||
|
||||
|
||||
class ListReferenceitemSerializer(BaseReferenceitemSerializer):
|
||||
class Meta(BaseReferenceitemSerializer.Meta):
|
||||
pass
|
||||
|
||||
|
||||
class RetrieveReferenceitemSerializer(BaseReferenceitemSerializer):
|
||||
children = serializers.SerializerMethodField()
|
||||
|
||||
class Meta(BaseReferenceitemSerializer.Meta):
|
||||
fields = BaseReferenceitemSerializer.Meta.fields + ["children"]
|
||||
|
||||
def get_children(self, obj):
|
||||
children = obj.children.filter(is_active=True).order_by("order", "name")
|
||||
return ListReferenceitemSerializer(children, many=True).data
|
||||
|
||||
|
||||
class CreateReferenceitemSerializer(BaseReferenceitemSerializer):
|
||||
class Meta(BaseReferenceitemSerializer.Meta):
|
||||
fields = [
|
||||
"type",
|
||||
"name",
|
||||
"parent",
|
||||
"order",
|
||||
"is_active",
|
||||
]
|
||||
1
core/apps/evaluation/serializers/reference/__init__.py
Normal file
1
core/apps/evaluation/serializers/reference/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .ReferenceItem import * # noqa
|
||||
Reference in New Issue
Block a user