feat: wire contract PDF context and align MechanicAuto with AutoEvaluation

- contract PDF: map report/customer/owner/contract from AutoEvaluationModel
  fields, accept inspection via POST serializer, fetch CBU.uz currency rates
- MechanicAutoEvaluation: add distance_covered, object_owner_residence and
  car_position/body_type/fuel_type/state_car/assessment_task_type FKs; drop
  car_type and single tex_passport_file in favour of multi-file FK model

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
xoliqberdiyev
2026-05-05 18:51:24 +05:00
parent 25e92623fd
commit 80a1f5ff17
10 changed files with 560 additions and 164 deletions

View File

@@ -4,7 +4,6 @@ from django_core.models import AbstractBaseModel
from model_bakery import baker
from core.apps.evaluation.choices.auto import (
AutoCarType,
AutoCarWheel,
AutoEvaluationStatus,
AutoObjectType,
@@ -50,12 +49,57 @@ class MechanicAutoEvaluationModel(AbstractBaseModel):
blank=True,
)
tex_passport_file = models.FileField(
verbose_name=_("tech passport file"),
upload_to="mechanic_evaluation/tech_passports/%Y/%m/",
distance_covered = models.PositiveIntegerField(
verbose_name=_("distance covered"),
blank=True,
null=True,
)
object_owner_residence = models.CharField(
verbose_name=_("object owner residence"),
max_length=255,
blank=True,
null=True,
)
car_position = models.ForeignKey(
'evaluation.ReferenceitemModel',
verbose_name=_("car position"),
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name='evaluation_mechanic_auto_car_position',
)
body_type = models.ForeignKey(
'evaluation.ReferenceitemModel',
verbose_name=_("body type"),
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name='evaluation_mechanic_auto_body_type',
)
fuel_type = models.ForeignKey(
'evaluation.ReferenceitemModel',
verbose_name=_("fuel type"),
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name='evaluation_mechanic_auto_fuel_type',
)
state_car = models.ForeignKey(
'evaluation.ReferenceitemModel',
verbose_name=_("state car"),
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name='evaluation_mechanic_auto_state_car',
)
assessment_task_type = models.ForeignKey(
'evaluation.ReferenceitemModel',
verbose_name=_("assessment task type"),
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name='evaluation_mechanic_auto_assessment_task_type',
)
# ── Step 1 — Umumiy ma'lumotlar ──────────────────────────────────
registration_number = models.CharField(
@@ -170,12 +214,6 @@ class MechanicAutoEvaluationModel(AbstractBaseModel):
blank=True,
null=True,
)
car_type = models.IntegerField(
verbose_name=_("car type"),
choices=AutoCarType.choices,
blank=True,
null=True,
)
car_wheel = models.IntegerField(
verbose_name=_("car wheel"),
choices=AutoCarWheel.choices,
@@ -248,3 +286,27 @@ class MechanicAutoEvaluationModel(AbstractBaseModel):
db_table = "MechanicAutoEvaluation"
verbose_name = _("Mechanic Auto Evaluation")
verbose_name_plural = _("Mechanic Auto Evaluations")
class MechanicAutoEvaluationTexPassportFile(AbstractBaseModel):
mechanic_auto_evaluation = models.ForeignKey(
MechanicAutoEvaluationModel,
on_delete=models.CASCADE,
related_name="tex_passport_files",
)
file = models.FileField(
verbose_name=_("tech passport file"),
upload_to="mechanic_evaluation/tech_passports/%Y/%m/",
)
def __str__(self):
return f"Tex passport file for MechanicAutoEvaluation #{self.mechanic_auto_evaluation_id}"
@classmethod
def _baker(cls):
return baker.make(cls)
class Meta:
db_table = "MechanicAutoEvaluationTexPassportFile"
verbose_name = _("Mechanic Auto Evaluation Tex Passport File")
verbose_name_plural = _("Mechanic Auto Evaluation Tex Passport Files")