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
Some checks failed
Deploy to Production / build-and-deploy (push) Failing after 53s
Reviewed-on: #120
This commit is contained in:
@@ -19,3 +19,8 @@ class RequestStatus(models.TextChoices):
|
|||||||
IN_PROGRESS = "in_progress", _("Jarayonda")
|
IN_PROGRESS = "in_progress", _("Jarayonda")
|
||||||
COMPLETED = "completed", _("Bajarildi")
|
COMPLETED = "completed", _("Bajarildi")
|
||||||
REJECTED = "rejected", _("Rad etildi")
|
REJECTED = "rejected", _("Rad etildi")
|
||||||
|
|
||||||
|
|
||||||
|
class RequestPersonType(models.TextChoices):
|
||||||
|
INDIVIDUAL_PERSON = "individual_person", "Jismoniy shaxs"
|
||||||
|
LEGAL_PERSON = "legal_person", 'Yuridik shaxs',
|
||||||
|
|||||||
@@ -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',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -8,64 +8,41 @@ from core.apps.evaluation.choices.request import (
|
|||||||
EvaluationRateType,
|
EvaluationRateType,
|
||||||
RequestObjectType,
|
RequestObjectType,
|
||||||
RequestStatus,
|
RequestStatus,
|
||||||
|
RequestPersonType,
|
||||||
)
|
)
|
||||||
from core.apps.evaluation.models import ReferenceitemModel
|
from core.apps.evaluation.models import ReferenceitemModel
|
||||||
|
|
||||||
|
|
||||||
class EvaluationrequestModel(AbstractBaseModel):
|
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(
|
user = models.ForeignKey(
|
||||||
"accounts.User",
|
"accounts.User",
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name="evaluation_requests",
|
related_name="evaluation_requests",
|
||||||
verbose_name=_("user"),
|
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(
|
value_determined = models.ForeignKey(
|
||||||
"evaluation.ReferenceitemModel",
|
"evaluation.ReferenceitemModel",
|
||||||
verbose_name=_("value determined"),
|
verbose_name=_("value determined"),
|
||||||
@@ -99,47 +76,6 @@ class EvaluationrequestModel(AbstractBaseModel):
|
|||||||
null=True,
|
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):
|
def __str__(self):
|
||||||
return f"Requests #{self.pk} — {self.get_rate_type_display()}"
|
return f"Requests #{self.pk} — {self.get_rate_type_display()}"
|
||||||
@@ -166,3 +102,29 @@ class EvaluationrequestModel(AbstractBaseModel):
|
|||||||
db_table = "EvaluationRequest"
|
db_table = "EvaluationRequest"
|
||||||
verbose_name = _("Evaluation Request")
|
verbose_name = _("Evaluation Request")
|
||||||
verbose_name_plural = _("Evaluation Requests")
|
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")
|
||||||
|
|||||||
@@ -4,8 +4,11 @@ from django.contrib.auth import get_user_model
|
|||||||
|
|
||||||
from rest_framework import serializers
|
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.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()
|
User = get_user_model()
|
||||||
@@ -29,6 +32,8 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
property_rights = ListReferenceitemSerializer(read_only=True)
|
property_rights = ListReferenceitemSerializer(read_only=True)
|
||||||
form_ownership = ListReferenceitemSerializer(read_only=True)
|
form_ownership = ListReferenceitemSerializer(read_only=True)
|
||||||
user = serializers.SerializerMethodField(method_name="get_user")
|
user = serializers.SerializerMethodField(method_name="get_user")
|
||||||
|
customer = EvaluationRequestCustomerSerializer(read_only=True)
|
||||||
|
owner = EvaluationRequestOwnerSerializer(read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = EvaluationrequestModel
|
model = EvaluationrequestModel
|
||||||
@@ -56,6 +61,8 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
"is_archive",
|
"is_archive",
|
||||||
|
"customer",
|
||||||
|
"owner",
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_location(self, obj):
|
def get_location(self, obj):
|
||||||
@@ -113,6 +120,8 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
rate_goal = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
|
rate_goal = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
|
||||||
property_rights = 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())
|
form_ownership = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all())
|
||||||
|
customer = EvaluationRequestCustomerSerializer()
|
||||||
|
owner = EvaluationRequestOwnerSerializer()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = EvaluationrequestModel
|
model = EvaluationrequestModel
|
||||||
@@ -131,6 +140,11 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
"need_delivering",
|
"need_delivering",
|
||||||
"location",
|
"location",
|
||||||
"locationName",
|
"locationName",
|
||||||
|
"customer",
|
||||||
|
"owner",
|
||||||
|
"customer_and_owner_same",
|
||||||
|
"distance_covered",
|
||||||
|
"gov_number"
|
||||||
]
|
]
|
||||||
|
|
||||||
def validate_tex_passport(self, value):
|
def validate_tex_passport(self, value):
|
||||||
@@ -179,7 +193,31 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
if location_name:
|
if location_name:
|
||||||
validated_data["location_name"] = str(location_name)
|
validated_data["location_name"] = str(location_name)
|
||||||
validated_data["user"] = self.context["request"].user
|
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):
|
class ArchiveEvaluationrequestSerializer(serializers.Serializer):
|
||||||
id = serializers.IntegerField(required=True)
|
id = serializers.IntegerField(required=True)
|
||||||
|
|||||||
9
core/apps/evaluation/serializers/request/customer.py
Normal file
9
core/apps/evaluation/serializers/request/customer.py
Normal 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"]
|
||||||
9
core/apps/evaluation/serializers/request/owner.py
Normal file
9
core/apps/evaluation/serializers/request/owner.py
Normal 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"]
|
||||||
Reference in New Issue
Block a user