Merge pull request 'add new fields to request-evalution api' (#120) from behruz into main
Some checks failed
Deploy to Production / build-and-deploy (push) Failing after 53s

Reviewed-on: #120
This commit is contained in:
2026-04-28 12:30:43 +00:00
7 changed files with 251 additions and 91 deletions

View File

@@ -19,3 +19,8 @@ class RequestStatus(models.TextChoices):
IN_PROGRESS = "in_progress", _("Jarayonda")
COMPLETED = "completed", _("Bajarildi")
REJECTED = "rejected", _("Rad etildi")
class RequestPersonType(models.TextChoices):
INDIVIDUAL_PERSON = "individual_person", "Jismoniy shaxs"
LEGAL_PERSON = "legal_person", 'Yuridik shaxs',

View File

@@ -0,0 +1,49 @@
# Generated by Django 5.2.7 on 2026-04-28 11:41
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('evaluation', '0036_remove_autoevaluationmodel_form_ownership_and_more'),
]
operations = [
migrations.AddField(
model_name='evaluationrequestmodel',
name='customer_and_owner_same',
field=models.BooleanField(default=False),
),
migrations.CreateModel(
name='EvaluationRequestCustomerModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('type', models.CharField(choices=[('individual_person', 'Jismoniy shaxs'), ('legal_person', 'Yuridik shaxs')], max_length=100)),
('jshshir', models.CharField(max_length=100)),
('evaluation_request', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='customer', to='evaluation.evaluationrequestmodel')),
],
options={
'verbose_name': 'Evaluation Request Customer',
'verbose_name_plural': 'Evaluation Request Customers',
},
),
migrations.CreateModel(
name='EvaluationRequestOwnerModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('type', models.CharField(choices=[('individual_person', 'Jismoniy shaxs'), ('legal_person', 'Yuridik shaxs')], max_length=100)),
('jshshir', models.CharField(max_length=100)),
('evaluation_request', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='owner', to='evaluation.evaluationrequestmodel')),
],
options={
'verbose_name': 'Evaluation Request Owner',
'verbose_name_plural': 'Evaluation Request Owners',
},
),
]

View File

@@ -0,0 +1,88 @@
# Generated by Django 5.2.7 on 2026-04-28 11:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('evaluation', '0037_evaluationrequestmodel_customer_and_owner_same_and_more'),
]
operations = [
migrations.AddField(
model_name='evaluationrequestmodel',
name='distance_covered',
field=models.FloatField(blank=True, default=0.0, null=True),
),
migrations.AddField(
model_name='evaluationrequestmodel',
name='gov_number',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='chassi',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='customer_inn_number',
field=models.CharField(max_length=20),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='is_archive',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='location_lat',
field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='location_lng',
field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='location_name',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='need_delivering',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='object_type',
field=models.CharField(blank=True, choices=[('lightweight_auto', 'Yengil automobil'), ('truck_car', 'Yuk automobil'), ('special_tech', 'Maxsus texnika')], max_length=50, null=True),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='owner_inn_number',
field=models.CharField(max_length=20),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='rate_type',
field=models.CharField(choices=[('auto', 'Automobil'), ('real_estate', "Ko'chmas mulk"), ('equipment', 'Uskuna')], max_length=50),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='status',
field=models.CharField(choices=[('pending', 'Kutilmoqda'), ('in_progress', 'Jarayonda'), ('completed', 'Bajarildi'), ('rejected', 'Rad etildi')], default='pending', max_length=50),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='tex_passport',
field=models.CharField(blank=True, max_length=20, null=True),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='worked_hours',
field=models.IntegerField(blank=True, null=True),
),
]

View File

@@ -8,64 +8,41 @@ from core.apps.evaluation.choices.request import (
EvaluationRateType,
RequestObjectType,
RequestStatus,
RequestPersonType,
)
from core.apps.evaluation.models import ReferenceitemModel
class EvaluationrequestModel(AbstractBaseModel):
# request sender
rate_type = models.CharField(max_length=50,choices=EvaluationRateType.choices)
object_type = models.CharField(max_length=50,choices=RequestObjectType.choices,blank=True,null=True)
status = models.CharField(max_length=50, choices=RequestStatus.choices, default=RequestStatus.PENDING)
distance_covered = models.FloatField(default=0.0, null=True, blank=True)
worked_hours = models.IntegerField(blank=True,null=True)
customer_inn_number = models.CharField(max_length=20)
owner_inn_number = models.CharField(max_length=20)
tex_passport = models.CharField(max_length=20,blank=True,null=True)
chassi = models.CharField(max_length=100,blank=True,null=True)
gov_number = models.CharField(max_length=100, null=True, blank=True)
location_name = models.CharField(max_length=255,blank=True,null=True)
location_lat = models.DecimalField(max_digits=9,decimal_places=6,blank=True, null=True)
location_lng = models.DecimalField(max_digits=9,decimal_places=6,blank=True,null=True)
need_delivering = models.BooleanField(default=True)
is_archive = models.BooleanField(default=False)
customer_and_owner_same = models.BooleanField(default=False)
###################
# Foreign Keys
###################
user = models.ForeignKey(
"accounts.User",
on_delete=models.CASCADE,
related_name="evaluation_requests",
verbose_name=_("user"),
)
# request type -> "Automobil", "Ko'chmas mulk", "Uskuna"
rate_type = models.CharField(
verbose_name=_("rate type"),
max_length=50,
choices=EvaluationRateType.choices,
)
###################
# Automobil fields
###################
object_type = models.CharField(
verbose_name=_("object type"),
max_length=50,
choices=RequestObjectType.choices,
blank=True,
null=True,
)
customer_inn_number = models.CharField(
verbose_name=_("customer INN number"),
max_length=20,
)
owner_inn_number = models.CharField(
verbose_name=_("owner INN number"),
max_length=20,
)
tex_passport = models.CharField(
verbose_name=_("tex passport"),
max_length=20,
blank=True,
null=True,
)
worked_hours = models.IntegerField(
verbose_name=_("worked hours"),
blank=True,
null=True,
)
chassi = models.CharField(
verbose_name=_("chassi"),
max_length=100,
blank=True,
null=True,
)
###################
# Value fields
###################
value_determined = models.ForeignKey(
"evaluation.ReferenceitemModel",
verbose_name=_("value determined"),
@@ -99,47 +76,6 @@ class EvaluationrequestModel(AbstractBaseModel):
null=True,
)
###################
# Location fields
###################
location_name = models.CharField(
verbose_name=_("location name"),
max_length=255,
blank=True,
null=True,
)
location_lat = models.DecimalField(
verbose_name=_("location latitude"),
max_digits=9,
decimal_places=6,
blank=True,
null=True,
)
location_lng = models.DecimalField(
verbose_name=_("location longitude"),
max_digits=9,
decimal_places=6,
blank=True,
null=True,
)
###################
# Other fields
###################
need_delivering = models.BooleanField(
verbose_name=_("need delivering"),
default=True,
)
status = models.CharField(
verbose_name=_("status"),
max_length=50,
choices=RequestStatus.choices,
default=RequestStatus.PENDING,
)
is_archive = models.BooleanField(
verbose_name=_("is archive"),
default=False,
)
def __str__(self):
return f"Requests #{self.pk}{self.get_rate_type_display()}"
@@ -166,3 +102,29 @@ class EvaluationrequestModel(AbstractBaseModel):
db_table = "EvaluationRequest"
verbose_name = _("Evaluation Request")
verbose_name_plural = _("Evaluation Requests")
class EvaluationRequestOwnerModel(AbstractBaseModel):
evaluation_request = models.OneToOneField(EvaluationrequestModel, on_delete=models.CASCADE, related_name='owner')
type = models.CharField(max_length=100, choices=RequestPersonType.choices)
jshshir = models.CharField(max_length=100)
def __str__(self):
return f"Owner #{self.pk}{self.type}"
class Meta:
verbose_name = _("Evaluation Request Owner")
verbose_name_plural = _("Evaluation Request Owners")
class EvaluationRequestCustomerModel(AbstractBaseModel):
evaluation_request = models.OneToOneField(EvaluationrequestModel, on_delete=models.CASCADE, related_name='customer')
type = models.CharField(max_length=100, choices=RequestPersonType.choices)
jshshir = models.CharField(max_length=100)
def __str__(self):
return f"Customer #{self.pk}{self.type}"
class Meta:
verbose_name = _("Evaluation Request Customer")
verbose_name_plural = _("Evaluation Request Customers")

View File

@@ -4,8 +4,11 @@ from django.contrib.auth import get_user_model
from rest_framework import serializers
from core.apps.evaluation.models import EvaluationrequestModel, ReferenceitemModel
from core.apps.evaluation.models import EvaluationrequestModel, ReferenceitemModel, EvaluationRequestOwnerModel, EvaluationRequestCustomerModel
from core.apps.evaluation.serializers.reference import ListReferenceitemSerializer
from core.apps.evaluation.serializers.request.owner import EvaluationRequestOwnerSerializer
from core.apps.evaluation.serializers.request.customer import EvaluationRequestCustomerSerializer
User = get_user_model()
@@ -29,6 +32,8 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
property_rights = ListReferenceitemSerializer(read_only=True)
form_ownership = ListReferenceitemSerializer(read_only=True)
user = serializers.SerializerMethodField(method_name="get_user")
customer = EvaluationRequestCustomerSerializer(read_only=True)
owner = EvaluationRequestOwnerSerializer(read_only=True)
class Meta:
model = EvaluationrequestModel
@@ -56,6 +61,8 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
"created_at",
"updated_at",
"is_archive",
"customer",
"owner",
]
def get_location(self, obj):
@@ -113,6 +120,8 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
rate_goal = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
property_rights = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
form_ownership = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
customer = EvaluationRequestCustomerSerializer()
owner = EvaluationRequestOwnerSerializer()
class Meta:
model = EvaluationrequestModel
@@ -131,6 +140,11 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
"need_delivering",
"location",
"locationName",
"customer",
"owner",
"customer_and_owner_same",
"distance_covered",
"gov_number"
]
def validate_tex_passport(self, value):
@@ -179,7 +193,31 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
if location_name:
validated_data["location_name"] = str(location_name)
validated_data["user"] = self.context["request"].user
return super().create(validated_data)
instance = super().create(validated_data)
customer = validated_data.pop("customer", None)
owner = validated_data.pop("owner", None)
EvaluationRequestCustomerModel.objects.create(
evaluation_request=instance,
type=customer.get("type"),
jshshir=customer.get("jshshir")
)
if not instance.customer_and_owner_same:
EvaluationRequestOwnerModel.objects.create(
evaluation_request=instance,
type=owner.get("type"),
jshshir=owner.get("jshshir")
)
else:
EvaluationRequestOwnerModel.objects.create(
evaluation_request=instance,
type=customer.get("type"),
jshshir=customer.get("jshshir")
)
return instance
class ArchiveEvaluationrequestSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)

View File

@@ -0,0 +1,9 @@
from rest_framework import serializers
from core.apps.evaluation.models.request import EvaluationRequestCustomerModel
class EvaluationRequestCustomerSerializer(serializers.ModelSerializer):
class Meta:
model = EvaluationRequestCustomerModel
fields = ["id", "evaluation_request", "type", "jshshir"]

View File

@@ -0,0 +1,9 @@
from rest_framework import serializers
from core.apps.evaluation.models.request import EvaluationRequestOwnerModel
class EvaluationRequestOwnerSerializer(serializers.ModelSerializer):
class Meta:
model = EvaluationRequestOwnerModel
fields = ["id", "evaluation_request", "type", "jshshir"]