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

@@ -3,8 +3,7 @@ from django.utils.translation import gettext_lazy as _
from django_core.models import AbstractBaseModel
from model_bakery import baker
from core.apps.evaluation.choices.quick import CarState, CarType, QuickEvaluationStatus
from core.apps.evaluation.choices.vehicle import BodyType, FuelType, VehicleCondition
from core.apps.evaluation.choices.quick import CarType, QuickEvaluationStatus
class QuickEvaluationModel(AbstractBaseModel):
@@ -16,46 +15,115 @@ class QuickEvaluationModel(AbstractBaseModel):
related_name="quick_evaluations",
verbose_name=_("created by"),
)
tech_passport_number = models.CharField(
verbose_name=_("tech passport number"), max_length=50, blank=True, null=True
# Tex passport
tex_passport_serie_num = models.CharField(
verbose_name=_("tech passport series and number"),
max_length=20,
blank=True,
null=True,
)
license_plate = models.CharField(
verbose_name=_("license plate"), max_length=20, blank=True, null=True
tech_passport_issued_date = models.DateField(
verbose_name=_("tech passport issued date"),
blank=True,
null=True,
)
model = models.CharField(verbose_name=_("model"), max_length=255, blank=True, null=True)
brand = models.CharField(verbose_name=_("brand"), max_length=255, blank=True, null=True)
manufacture_year = models.IntegerField(
verbose_name=_("manufacture year"), blank=True, null=True
tech_passport_issued_place = models.CharField(
verbose_name=_("tech passport issued place"),
max_length=255,
blank=True,
null=True,
)
tex_passport_file = models.FileField(
verbose_name=_("tech passport file"),
upload_to="quick_evaluation/tech_passports/%Y/%m/",
blank=True,
null=True,
)
# Car info
car_type = models.CharField(
verbose_name=_("car type"),
max_length=50,
choices=CarType.choices,
blank=True,
null=True,
)
brand = models.ForeignKey(
"evaluation.ReferenceitemModel",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="quick_eval_brands",
verbose_name=_("brand"),
)
marka = models.ForeignKey(
"evaluation.ReferenceitemModel",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="quick_eval_markas",
verbose_name=_("marka"),
)
car_position = models.ForeignKey(
"evaluation.ReferenceitemModel",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="quick_eval_positions",
verbose_name=_("car position"),
)
distance_covered = models.IntegerField(
verbose_name=_("distance covered (km)"),
blank=True,
null=True,
)
body_type = models.ForeignKey(
"evaluation.ReferenceitemModel",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="quick_eval_body_types",
verbose_name=_("body type"),
)
mileage = models.IntegerField(verbose_name=_("mileage"), blank=True, null=True)
vin_number = models.CharField(
verbose_name=_("VIN number"), max_length=50, blank=True, null=True
)
car_number = models.CharField(
verbose_name=_("car number"), max_length=20, blank=True, null=True
)
car_manufactured_date = models.IntegerField(
verbose_name=_("manufacture year"), blank=True, null=True
)
engine_number = models.CharField(
verbose_name=_("engine number"), max_length=50, blank=True, null=True
)
color = models.CharField(verbose_name=_("color"), max_length=50, blank=True, null=True)
fuel_type = models.CharField(
color = models.ForeignKey(
"evaluation.ReferenceitemModel",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="quick_eval_colors",
verbose_name=_("color"),
)
fuel_type = models.ForeignKey(
"evaluation.ReferenceitemModel",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="quick_eval_fuel_types",
verbose_name=_("fuel type"),
max_length=50,
choices=FuelType.choices,
blank=True,
null=True,
)
body_type = models.CharField(
verbose_name=_("body type"),
max_length=50,
choices=BodyType.choices,
blank=True,
state_car = models.ForeignKey(
"evaluation.ReferenceitemModel",
on_delete=models.SET_NULL,
null=True,
)
condition = models.CharField(
verbose_name=_("condition"),
max_length=50,
choices=VehicleCondition.choices,
blank=True,
null=True,
related_name="quick_eval_states",
verbose_name=_("car state"),
)
# Result
estimated_price = models.DecimalField(
verbose_name=_("estimated price"),
max_digits=15,
@@ -69,20 +137,6 @@ class QuickEvaluationModel(AbstractBaseModel):
choices=QuickEvaluationStatus.choices,
default=QuickEvaluationStatus.CREATED,
)
car_type = models.CharField(
verbose_name=_("car type"),
max_length=50,
choices=CarType.choices,
blank=True,
null=True,
)
state_car = models.CharField(
verbose_name=_("car state"),
max_length=50,
choices=CarState.choices,
blank=True,
null=True,
)
def __str__(self):
return f"Quick Evaluation {self.pk} by {self.created_by}"