Compare commits
1 Commits
207363dc6a
...
request-ar
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a08c81ff3 |
@@ -13,7 +13,7 @@ from config.env import env
|
|||||||
|
|
||||||
|
|
||||||
def home(request):
|
def home(request):
|
||||||
return HttpResponse("OK: #2a08ad9662f957a3a0b75b8c8440d49b0b4e9ae4")
|
return HttpResponse("OK: #d4e6d80c86fcf4422f71238c6552dfa4b42f9737")
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Generated by Django 6.0.4 on 2026-04-23 07:24
|
# Generated by Django 6.0.4 on 2026-04-23 07:22
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='quickevaluationmodel',
|
model_name='evaluationrequestmodel',
|
||||||
name='is_archive',
|
name='is_archive',
|
||||||
field=models.BooleanField(default=False, verbose_name='is archive'),
|
field=models.BooleanField(default=False, verbose_name='is archive'),
|
||||||
),
|
),
|
||||||
@@ -132,11 +132,6 @@ class QuickEvaluationModel(AbstractBaseModel):
|
|||||||
default=QuickEvaluationStatus.CREATED,
|
default=QuickEvaluationStatus.CREATED,
|
||||||
)
|
)
|
||||||
|
|
||||||
is_archive = models.BooleanField(
|
|
||||||
verbose_name=_("is archive"),
|
|
||||||
default=False,
|
|
||||||
)
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"Quick Evaluation {self.pk} by {self.created_by}"
|
return f"Quick Evaluation {self.pk} by {self.created_by}"
|
||||||
|
|
||||||
|
|||||||
@@ -118,6 +118,10 @@ class EvaluationrequestModel(AbstractBaseModel):
|
|||||||
choices=RequestStatus.choices,
|
choices=RequestStatus.choices,
|
||||||
default=RequestStatus.PENDING,
|
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()}"
|
||||||
|
|
||||||
|
|||||||
@@ -38,8 +38,7 @@ class BaseQuickevaluationSerializer(serializers.ModelSerializer):
|
|||||||
"state_car_name",
|
"state_car_name",
|
||||||
"created_at",
|
"created_at",
|
||||||
"distance_covered",
|
"distance_covered",
|
||||||
"tex_passport_serie_num",
|
"tex_passport_serie_num"
|
||||||
"is_archive"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -126,8 +125,3 @@ class CreateQuickevaluationSerializer(serializers.ModelSerializer):
|
|||||||
if request and request.user and request.user.is_authenticated:
|
if request and request.user and request.user.is_authenticated:
|
||||||
validated_data["created_by"] = request.user
|
validated_data["created_by"] = request.user
|
||||||
return super().create(validated_data)
|
return super().create(validated_data)
|
||||||
|
|
||||||
|
|
||||||
class ArchiveQuickevaluationSerializer(serializers.Serializer):
|
|
||||||
id = serializers.IntegerField(required=True)
|
|
||||||
is_archive = serializers.BooleanField(required=True)
|
|
||||||
@@ -55,6 +55,7 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
"user",
|
"user",
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
|
"is_archive",
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_location(self, obj):
|
def get_location(self, obj):
|
||||||
@@ -183,3 +184,7 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
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)
|
return super().create(validated_data)
|
||||||
|
|
||||||
|
class ArchiveEvaluationrequestSerializer(serializers.Serializer):
|
||||||
|
id = serializers.IntegerField(required=True)
|
||||||
|
is_archive = serializers.BooleanField(required=True)
|
||||||
@@ -29,7 +29,7 @@ from .views import (
|
|||||||
DidoxCompanyInfoAPIView,
|
DidoxCompanyInfoAPIView,
|
||||||
TechPassportAPIView,
|
TechPassportAPIView,
|
||||||
EvaluationStatusChange,
|
EvaluationStatusChange,
|
||||||
ArchiveQuickEvaluationView,
|
ArchiveEvaluationrequestView,
|
||||||
)
|
)
|
||||||
|
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
@@ -75,5 +75,5 @@ urlpatterns = [
|
|||||||
),
|
),
|
||||||
path("evaluation-request/<int:pk>/change-status/", EvaluationStatusChange.as_view(),
|
path("evaluation-request/<int:pk>/change-status/", EvaluationStatusChange.as_view(),
|
||||||
name="evaluation-change-status"),
|
name="evaluation-change-status"),
|
||||||
path("quick-evaluation/archive/", ArchiveQuickEvaluationView.as_view(), name="quick-evaluation-archive"),
|
path("evaluation-request/archive/", ArchiveEvaluationrequestView.as_view(), name="evaluation-request-archive"),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import AllowAny
|
||||||
from rest_framework.generics import GenericAPIView
|
from rest_framework.generics import GenericAPIView
|
||||||
|
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ from core.services.didox import DidoxService
|
|||||||
|
|
||||||
class DidoxCompanyInfoAPIView(GenericAPIView):
|
class DidoxCompanyInfoAPIView(GenericAPIView):
|
||||||
authentication_classes = []
|
authentication_classes = []
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [AllowAny]
|
||||||
|
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
tags=["Didox"],
|
tags=["Didox"],
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
from django_core.mixins import BaseViewSetMixin
|
from django_core.mixins import BaseViewSetMixin
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
from drf_spectacular.utils import extend_schema
|
||||||
from rest_framework.filters import OrderingFilter, SearchFilter
|
from rest_framework.filters import OrderingFilter, SearchFilter
|
||||||
from rest_framework.parsers import FormParser, MultiPartParser
|
from rest_framework.parsers import FormParser, MultiPartParser
|
||||||
from rest_framework.permissions import AllowAny, IsAuthenticated
|
from rest_framework.permissions import AllowAny
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import ModelViewSet
|
||||||
from rest_framework.generics import GenericAPIView
|
|
||||||
from rest_framework.response import Response
|
|
||||||
from rest_framework import status
|
|
||||||
from django.shortcuts import get_object_or_404
|
|
||||||
|
|
||||||
from core.apps.evaluation.filters.quick import QuickevaluationFilter
|
from core.apps.evaluation.filters.quick import QuickevaluationFilter
|
||||||
from core.apps.evaluation.models import QuickEvaluationModel
|
from core.apps.evaluation.models import QuickEvaluationModel
|
||||||
@@ -16,7 +12,6 @@ from core.apps.evaluation.serializers.quick import (
|
|||||||
CreateQuickevaluationSerializer,
|
CreateQuickevaluationSerializer,
|
||||||
ListQuickevaluationSerializer,
|
ListQuickevaluationSerializer,
|
||||||
RetrieveQuickevaluationSerializer,
|
RetrieveQuickevaluationSerializer,
|
||||||
ArchiveQuickevaluationSerializer,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -25,7 +20,7 @@ class QuickEvaluationView(BaseViewSetMixin, ModelViewSet):
|
|||||||
queryset = QuickEvaluationModel.objects.select_related(
|
queryset = QuickEvaluationModel.objects.select_related(
|
||||||
"created_by", "brand", "marka", "color", "fuel_type",
|
"created_by", "brand", "marka", "color", "fuel_type",
|
||||||
"body_type", "state_car", "car_position",
|
"body_type", "state_car", "car_position",
|
||||||
).filter(is_archive=False)
|
).all()
|
||||||
serializer_class = ListQuickevaluationSerializer
|
serializer_class = ListQuickevaluationSerializer
|
||||||
permission_classes = [AllowAny]
|
permission_classes = [AllowAny]
|
||||||
parser_classes = [MultiPartParser, FormParser]
|
parser_classes = [MultiPartParser, FormParser]
|
||||||
@@ -55,76 +50,3 @@ class QuickEvaluationView(BaseViewSetMixin, ModelViewSet):
|
|||||||
"retrieve": RetrieveQuickevaluationSerializer,
|
"retrieve": RetrieveQuickevaluationSerializer,
|
||||||
"create": CreateQuickevaluationSerializer,
|
"create": CreateQuickevaluationSerializer,
|
||||||
}
|
}
|
||||||
|
|
||||||
@extend_schema(tags=["QuickEvaluation"])
|
|
||||||
class ArchiveQuickEvaluationView(GenericAPIView):
|
|
||||||
permission_classes = [IsAuthenticated]
|
|
||||||
|
|
||||||
def get_serializer_class(self):
|
|
||||||
if self.request.method == "GET":
|
|
||||||
return ListQuickevaluationSerializer
|
|
||||||
return ArchiveQuickevaluationSerializer
|
|
||||||
|
|
||||||
@extend_schema(
|
|
||||||
tags=["QuickEvaluation"],
|
|
||||||
summary="Get archived quick evaluations list",
|
|
||||||
description="""
|
|
||||||
Returns only archived quick evaluations.
|
|
||||||
|
|
||||||
This endpoint works like quick-evaluation/,
|
|
||||||
but only records with is_archive=True are returned.
|
|
||||||
""",
|
|
||||||
responses={200: ListQuickevaluationSerializer(many=True)},
|
|
||||||
)
|
|
||||||
def get(self, request, *args, **kwargs):
|
|
||||||
queryset = QuickEvaluationModel.objects.filter(
|
|
||||||
is_archive=True
|
|
||||||
).order_by("-created_at")
|
|
||||||
|
|
||||||
serializer = self.get_serializer(queryset, many=True)
|
|
||||||
|
|
||||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
||||||
|
|
||||||
@extend_schema(
|
|
||||||
tags=["QuickEvaluation"],
|
|
||||||
summary="Archive or unarchive quick evaluation",
|
|
||||||
description="""
|
|
||||||
Update archive status for quick evaluation.
|
|
||||||
|
|
||||||
- is_archive=true → archive
|
|
||||||
- is_archive=false → remove from archive
|
|
||||||
""",
|
|
||||||
request=ArchiveQuickevaluationSerializer,
|
|
||||||
responses={
|
|
||||||
200: OpenApiResponse(
|
|
||||||
description="Archive status updated successfully"
|
|
||||||
),
|
|
||||||
400: OpenApiResponse(
|
|
||||||
description="Validation error"
|
|
||||||
),
|
|
||||||
404: OpenApiResponse(
|
|
||||||
description="Quick evaluation not found"
|
|
||||||
),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
def post(self, request, *args, **kwargs):
|
|
||||||
serializer = self.get_serializer(data=request.data)
|
|
||||||
serializer.is_valid(raise_exception=True)
|
|
||||||
|
|
||||||
validated_data = serializer.validated_data
|
|
||||||
|
|
||||||
obj = get_object_or_404(
|
|
||||||
QuickEvaluationModel,
|
|
||||||
id=validated_data["id"]
|
|
||||||
)
|
|
||||||
|
|
||||||
obj.is_archive = validated_data["is_archive"]
|
|
||||||
obj.save(update_fields=["is_archive"])
|
|
||||||
|
|
||||||
return Response(
|
|
||||||
{
|
|
||||||
"success": True,
|
|
||||||
"message": "Archive status updated successfully"
|
|
||||||
},
|
|
||||||
status=status.HTTP_200_OK
|
|
||||||
)
|
|
||||||
@@ -17,8 +17,11 @@ from core.apps.evaluation.serializers.request import (
|
|||||||
CreateEvaluationrequestSerializer,
|
CreateEvaluationrequestSerializer,
|
||||||
ListEvaluationrequestSerializer,
|
ListEvaluationrequestSerializer,
|
||||||
RetrieveEvaluationrequestSerializer,
|
RetrieveEvaluationrequestSerializer,
|
||||||
|
ArchiveEvaluationrequestSerializer,
|
||||||
)
|
)
|
||||||
from core.apps.evaluation.choices.request import RequestStatus
|
from core.apps.evaluation.choices.request import RequestStatus
|
||||||
|
from rest_framework.generics import GenericAPIView
|
||||||
|
from drf_spectacular.utils import OpenApiResponse
|
||||||
|
|
||||||
|
|
||||||
# class RequestPagination(PageNumberPagination):
|
# class RequestPagination(PageNumberPagination):
|
||||||
@@ -172,3 +175,76 @@ class EvaluationStatusChange(APIView):
|
|||||||
'status': evaluation.status,
|
'status': evaluation.status,
|
||||||
'id': evaluation.pk
|
'id': evaluation.pk
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@extend_schema(tags=["EvaluationRequest"])
|
||||||
|
class ArchiveEvaluationrequestView(GenericAPIView):
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.request.method == "GET":
|
||||||
|
return ListEvaluationrequestSerializer
|
||||||
|
return ArchiveEvaluationrequestSerializer
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
tags=["EvaluationRequest"],
|
||||||
|
summary="Get archived evaluation requests list",
|
||||||
|
description="""
|
||||||
|
Returns only archived evaluation requests.
|
||||||
|
|
||||||
|
This endpoint works like evaluation-request/,
|
||||||
|
but only records with is_archive=True are returned.
|
||||||
|
""",
|
||||||
|
responses={200: ListEvaluationrequestSerializer(many=True)},
|
||||||
|
)
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
queryset = EvaluationrequestModel.objects.filter(
|
||||||
|
is_archive=True
|
||||||
|
).order_by("-created_at")
|
||||||
|
|
||||||
|
serializer = self.get_serializer(queryset, many=True)
|
||||||
|
|
||||||
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
tags=["EvaluationRequest"],
|
||||||
|
summary="Archive or unarchive evaluation request",
|
||||||
|
description="""
|
||||||
|
Update archive status for evaluation request.
|
||||||
|
|
||||||
|
- is_archive=true → archive
|
||||||
|
- is_archive=false → remove from archive
|
||||||
|
""",
|
||||||
|
request=ArchiveEvaluationrequestSerializer,
|
||||||
|
responses={
|
||||||
|
200: OpenApiResponse(
|
||||||
|
description="Archive status updated successfully"
|
||||||
|
),
|
||||||
|
400: OpenApiResponse(
|
||||||
|
description="Validation error"
|
||||||
|
),
|
||||||
|
404: OpenApiResponse(
|
||||||
|
description="Evaluation request not found"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
serializer = self.get_serializer(data=request.data)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
|
||||||
|
validated_data = serializer.validated_data
|
||||||
|
|
||||||
|
obj = get_object_or_404(
|
||||||
|
EvaluationrequestModel,
|
||||||
|
id=validated_data["id"]
|
||||||
|
)
|
||||||
|
|
||||||
|
obj.is_archive = validated_data["is_archive"]
|
||||||
|
obj.save(update_fields=["is_archive"])
|
||||||
|
|
||||||
|
return Response(
|
||||||
|
{
|
||||||
|
"success": True,
|
||||||
|
"message": "Archive status updated successfully"
|
||||||
|
},
|
||||||
|
status=status.HTTP_200_OK
|
||||||
|
)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import AllowAny
|
||||||
from rest_framework.generics import GenericAPIView
|
from rest_framework.generics import GenericAPIView
|
||||||
|
|
||||||
from drf_spectacular.utils import (
|
from drf_spectacular.utils import (
|
||||||
@@ -14,7 +14,7 @@ from ..serializers import TechPassportSerializer
|
|||||||
|
|
||||||
class TechPassportAPIView(GenericAPIView):
|
class TechPassportAPIView(GenericAPIView):
|
||||||
authentication_classes = []
|
authentication_classes = []
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [AllowAny]
|
||||||
|
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
tags=["Tech Passport"],
|
tags=["Tech Passport"],
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ services:
|
|||||||
max-file: "5"
|
max-file: "5"
|
||||||
|
|
||||||
web:
|
web:
|
||||||
image: husanjon/sifatbaho:108
|
image: husanjon/sifatbaho:107
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
@@ -129,7 +129,7 @@ services:
|
|||||||
max-file: "5"
|
max-file: "5"
|
||||||
|
|
||||||
celery:
|
celery:
|
||||||
image: husanjon/sifatbaho:108
|
image: husanjon/sifatbaho:107
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
Reference in New Issue
Block a user