1 Commits

Author SHA1 Message Date
Husanjonazamov
8207b750b8 sort yangilandi 2026-03-12 17:29:10 +05:00
15 changed files with 18 additions and 141 deletions

View File

@@ -13,7 +13,7 @@ from config.env import env
def home(request):
return HttpResponse("OK: #a06cf173b69ce36a54b5e1cacd87c2f1b8edf6e9")
return HttpResponse("OK: #7bcf7bdc7f8b10357921efee0415dc6211137338")
urlpatterns = [

View File

@@ -1,6 +1,5 @@
from django.contrib.auth import admin
from django.utils.translation import gettext_lazy as _
from django.utils.safestring import mark_safe
from unfold.admin import ModelAdmin
from unfold.forms import AdminPasswordChangeForm # UserCreationForm,
from unfold.forms import UserChangeForm
@@ -11,7 +10,6 @@ class CustomUserAdmin(admin.UserAdmin, ModelAdmin):
# add_form = UserCreationForm
form = UserChangeForm
list_display = (
"display_avatar",
"first_name",
"last_name",
"phone",
@@ -19,7 +17,7 @@ class CustomUserAdmin(admin.UserAdmin, ModelAdmin):
)
search_fields = ("phone", "first_name", "last_name", "username")
autocomplete_fields = ["groups", "user_permissions"]
fieldsets = ((None, {"fields": ("phone", "avatar",)}),) + (
fieldsets = ((None, {"fields": ("phone",)}),) + (
(None, {"fields": ("username", "password")}),
(_("Personal info"), {"fields": ("first_name", "last_name", "email")}),
(
@@ -38,15 +36,6 @@ class CustomUserAdmin(admin.UserAdmin, ModelAdmin):
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
)
def display_avatar(self, obj):
if obj.avatar:
return mark_safe(
f'<img src="{obj.avatar.url}" width="35" height="35" style="border-radius: 50%; object-fit: cover;" />'
)
return _("No Image")
display_avatar.short_description = _("Avatar")
class PermissionAdmin(ModelAdmin):
list_display = ("name",)

View File

@@ -1,18 +0,0 @@
# Generated by Django 5.2.7 on 2026-03-17 12:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0002_alter_user_role'),
]
operations = [
migrations.AddField(
model_name='user',
name='avatar',
field=models.ImageField(blank=True, null=True, upload_to='avatars/'),
),
]

View File

@@ -16,7 +16,6 @@ class User(auth_models.AbstractUser):
choices=RoleChoice,
default=RoleChoice.USER,
)
avatar = models.ImageField(upload_to="avatars/", null=True, blank=True)
USERNAME_FIELD = "phone"
objects = UserManager()

View File

@@ -19,6 +19,5 @@ class UserUpdateSerializer(serializers.ModelSerializer):
model = get_user_model()
fields = [
"first_name",
"last_name",
"avatar"
"last_name"
]

View File

@@ -6,7 +6,7 @@ from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _
from django_core import exceptions
from drf_spectacular.utils import extend_schema
from rest_framework import status, throttling, request, parsers
from rest_framework import status, throttling, request
from rest_framework.response import Response
from rest_framework.exceptions import PermissionDenied
from rest_framework.viewsets import GenericViewSet
@@ -160,11 +160,6 @@ class ResetPasswordView(BaseViewSetMixin, GenericViewSet, UserService):
@extend_schema(tags=["me"])
class MeView(BaseViewSetMixin, GenericViewSet, UserService):
permission_classes = [IsAuthenticated]
parser_classes = (
parsers.MultiPartParser,
parsers.FormParser,
parsers.JSONParser,
)
def get_serializer_class(self):
match self.action:

View File

@@ -10,4 +10,3 @@ class ReferenceType(models.TextChoices):
BODY_TYPE = "body_type", _("Body type")
CAR_POSITION = "car_position", _("Car position")
STATE_CAR = "state_car", _("Car state")
EVALUATION_PURPOSE = "evaluation_purpose", _("Evaluation purpose")

View File

@@ -1,23 +0,0 @@
# Generated by Django 5.2.7 on 2026-03-17 13:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('evaluation', '0018_evaluationrequestmodel'),
]
operations = [
migrations.AddField(
model_name='evaluationrequestmodel',
name='location_name',
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='location name'),
),
migrations.AlterField(
model_name='evaluationrequestmodel',
name='chassi',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='chassi'),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 5.2.7 on 2026-03-17 14:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('evaluation', '0019_evaluationrequestmodel_location_name_and_more'),
]
operations = [
migrations.AlterField(
model_name='referenceitemmodel',
name='type',
field=models.CharField(choices=[('brand', 'Brand'), ('marka', 'Marka'), ('color', 'Color'), ('fuel_type', 'Fuel type'), ('body_type', 'Body type'), ('car_position', 'Car position'), ('state_car', 'Car state'), ('evaluation_purpose', 'Evaluation purpose')], max_length=50, verbose_name='type'),
),
]

View File

@@ -65,9 +65,8 @@ class EvaluationrequestModel(AbstractBaseModel):
blank=True,
null=True,
)
chassi = models.CharField(
chassi = models.IntegerField(
verbose_name=_("chassi"),
max_length=100,
blank=True,
null=True,
)
@@ -75,12 +74,6 @@ class EvaluationrequestModel(AbstractBaseModel):
verbose_name=_("need delivering"),
default=True,
)
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,
@@ -101,9 +94,8 @@ class EvaluationrequestModel(AbstractBaseModel):
choices=RequestStatus.choices,
default=RequestStatus.PENDING,
)
def __str__(self):
return f"Request #{self.pk}{self.get_rate_type_display()}"
return f"Requests #{self.pk}{self.get_rate_type_display()}"
@classmethod
def _baker(cls):

View File

@@ -46,12 +46,3 @@ class CreateReferenceitemSerializer(BaseReferenceitemSerializer):
"order",
"is_active",
]
class EvaluationPurposeSerializer(serializers.ModelSerializer):
label = serializers.CharField(source="name")
value = serializers.IntegerField(source="id")
class Meta:
model = ReferenceitemModel
fields = ["label", "value"]

View File

@@ -17,8 +17,6 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
)
location = serializers.SerializerMethodField()
location_name = serializers.CharField(required=False)
class Meta:
model = EvaluationrequestModel
fields = [
@@ -38,7 +36,6 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
"chassi",
"need_delivering",
"location",
"location_name",
"status",
"status_display",
"created_at",
@@ -47,11 +44,7 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
def get_location(self, obj):
if obj.location_lat is not None and obj.location_lng is not None:
return {
"lat": float(obj.location_lat),
"lng": float(obj.location_lng),
"name": obj.location_name
}
return {"lat": float(obj.location_lat), "lng": float(obj.location_lng)}
return None
@@ -66,9 +59,9 @@ class RetrieveEvaluationrequestSerializer(BaseEvaluationrequestSerializer):
class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
location = serializers.DictField(required=False)
# Frontend may send locationName
locationName = serializers.CharField(write_only=True, required=False)
location = serializers.DictField(
child=serializers.FloatField(), required=False
)
class Meta:
model = EvaluationrequestModel
@@ -86,7 +79,6 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
"chassi",
"need_delivering",
"location",
"locationName",
]
def validate_tex_passport(self, value):
@@ -112,7 +104,7 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
{"tex_passport": "rate_type 'auto' bo'lganda tex_passport majburiy."}
)
# worked_hours va chassi faqat yuk automobil uchun majburiy (truck_car)
# worked_hours va chassi majburiy agar object_type=truck_car
if object_type == "truck_car":
if attrs.get("worked_hours") is None:
raise serializers.ValidationError(
@@ -123,20 +115,18 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
{"chassi": "Yuk automobil uchun shassi majburiy."}
)
# location majburiy agar need_delivering=true
if attrs.get("need_delivering", True) and not attrs.get("location"):
raise serializers.ValidationError(
{"location": "Yetkazish kerak bo'lganda manzil majburiy."}
)
return attrs
def create(self, validated_data):
location = validated_data.pop("location", None)
location_name = validated_data.pop("locationName", None)
if location:
validated_data["location_lat"] = location.get("lat")
validated_data["location_lng"] = location.get("lng")
if not location_name:
location_name = location.get("name") or location.get("locationName")
if location_name:
validated_data["location_name"] = location_name
validated_data["user"] = self.context["request"].user
return super().create(validated_data)

View File

@@ -14,11 +14,9 @@ from .views import (
ValuationDocumentView,
ValuationView,
VehicleView,
EvaluationPurposeView,
)
router = DefaultRouter()
router.register("evaluation-purpose", EvaluationPurposeView, basename="evaluation-purpose")
router.register("evaluation-request", EvaluationrequestView, basename="evaluation-request")
router.register("reference-item", ReferenceitemView, basename="reference-item")
router.register("valuation-document", ValuationDocumentView, basename="valuation-document")

View File

@@ -11,25 +11,9 @@ from core.apps.evaluation.serializers.reference import (
CreateReferenceitemSerializer,
ListReferenceitemSerializer,
RetrieveReferenceitemSerializer,
EvaluationPurposeSerializer,
)
@extend_schema(tags=["EvaluationPurpose"])
class EvaluationPurposeView(BaseViewSetMixin, ReadOnlyModelViewSet):
queryset = ReferenceitemModel.objects.filter(
type="evaluation_purpose", is_active=True
).order_by("order", "name")
serializer_class = EvaluationPurposeSerializer
permission_classes = [AllowAny]
pagination_class = None
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
search_fields = ["name"]
ordering_fields = ["name", "order"]
ordering = ["order", "name"]
@extend_schema(tags=["ReferenceItem"])
class ReferenceitemView(BaseViewSetMixin, ReadOnlyModelViewSet):
queryset = ReferenceitemModel.objects.select_related("parent").filter(is_active=True)

View File

@@ -84,7 +84,7 @@ services:
max-file: "5"
web:
image: husanjon/sifatbaho:49
image: husanjon/sifatbaho:46
env_file:
- .env
environment: