Merge branch 'main' of https://gitea.felixits.uz/sifatbaho/backend-v1 into shaxob
# Conflicts: # core/apps/accounts/serializers/user.py # core/apps/accounts/urls.py # core/apps/accounts/views/user.py # core/apps/evaluation/urls.py # core/apps/evaluation/views/request.py
This commit is contained in:
@@ -13,3 +13,4 @@ from .valuation import * # noqa
|
||||
from .vehicle import * # noqa
|
||||
from .didox import * # noqa
|
||||
from .tech_passport import * # noqa
|
||||
from .certificate import * # noqa
|
||||
|
||||
@@ -160,7 +160,6 @@ class AutoEvaluationListAppraisersView(GenericAPIView):
|
||||
@extend_schema(tags=["AutoEvaluation"])
|
||||
class GetArchivedEvaluationListAPIView(ListAPIView):
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
def get_queryset(self):
|
||||
return AutoEvaluationModel.objects.filter(is_archived=True)
|
||||
|
||||
|
||||
23
core/apps/evaluation/views/certificate.py
Normal file
23
core/apps/evaluation/views/certificate.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from django_core.mixins import BaseViewSetMixin
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.viewsets import ModelViewSet
|
||||
from core.apps.evaluation.models import CertificateModel
|
||||
from core.apps.evaluation.serializers.certificate import BaseCertificateSerializer
|
||||
from rest_framework.filters import SearchFilter
|
||||
from rest_framework.parsers import MultiPartParser, FormParser
|
||||
|
||||
@extend_schema(tags=["Certificate"],request=BaseCertificateSerializer)
|
||||
class CertificateView(BaseViewSetMixin, ModelViewSet):
|
||||
queryset = CertificateModel.objects.all()
|
||||
serializer_class = BaseCertificateSerializer
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
parser_classes = [MultiPartParser, FormParser]
|
||||
|
||||
filter_backends = [SearchFilter]
|
||||
search_fields = ["title"]
|
||||
|
||||
pagination_class = None
|
||||
|
||||
action_permission_classes = {}
|
||||
@@ -1,6 +1,6 @@
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.generics import GenericAPIView
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ from core.services.didox import DidoxService
|
||||
|
||||
class DidoxCompanyInfoAPIView(GenericAPIView):
|
||||
authentication_classes = []
|
||||
permission_classes = [AllowAny]
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@extend_schema(
|
||||
tags=["Didox"],
|
||||
@@ -31,7 +31,6 @@ class DidoxCompanyInfoAPIView(GenericAPIView):
|
||||
def get(self, request, *args, **kwargs):
|
||||
tin = kwargs.get("tin")
|
||||
|
||||
# 🔥 TYPE CHECK
|
||||
try:
|
||||
tin = int(tin)
|
||||
except (TypeError, ValueError):
|
||||
@@ -48,4 +47,14 @@ class DidoxCompanyInfoAPIView(GenericAPIView):
|
||||
status=status.HTTP_502_BAD_GATEWAY
|
||||
)
|
||||
|
||||
# if both name and personalNum are null/empty -> 404
|
||||
name = data.get("name")
|
||||
personal_num = data.get("personalNum")
|
||||
|
||||
if not name and not personal_num:
|
||||
return Response(
|
||||
{"detail": "Company or person not found"},
|
||||
status=status.HTTP_404_NOT_FOUND
|
||||
)
|
||||
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
@@ -1,10 +1,14 @@
|
||||
from django_core.mixins import BaseViewSetMixin
|
||||
from django_filters.rest_framework import DjangoFilterBackend
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
from rest_framework.filters import OrderingFilter, SearchFilter
|
||||
from rest_framework.parsers import FormParser, MultiPartParser
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.permissions import AllowAny, IsAuthenticated
|
||||
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.models import QuickEvaluationModel
|
||||
@@ -12,6 +16,7 @@ from core.apps.evaluation.serializers.quick import (
|
||||
CreateQuickevaluationSerializer,
|
||||
ListQuickevaluationSerializer,
|
||||
RetrieveQuickevaluationSerializer,
|
||||
ArchiveQuickevaluationSerializer,
|
||||
)
|
||||
|
||||
|
||||
@@ -20,7 +25,7 @@ class QuickEvaluationView(BaseViewSetMixin, ModelViewSet):
|
||||
queryset = QuickEvaluationModel.objects.select_related(
|
||||
"created_by", "brand", "marka", "color", "fuel_type",
|
||||
"body_type", "state_car", "car_position",
|
||||
).all()
|
||||
).filter(is_archive=False)
|
||||
serializer_class = ListQuickevaluationSerializer
|
||||
permission_classes = [AllowAny]
|
||||
parser_classes = [MultiPartParser, FormParser]
|
||||
@@ -50,3 +55,76 @@ class QuickEvaluationView(BaseViewSetMixin, ModelViewSet):
|
||||
"retrieve": RetrieveQuickevaluationSerializer,
|
||||
"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
|
||||
)
|
||||
@@ -1,23 +1,27 @@
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from django_core.mixins import BaseViewSetMixin
|
||||
from django_filters.rest_framework import DjangoFilterBackend
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from rest_framework import status
|
||||
from rest_framework.filters import OrderingFilter, SearchFilter
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.pagination import PageNumberPagination
|
||||
from rest_framework.permissions import AllowAny, IsAuthenticated
|
||||
from rest_framework.viewsets import ModelViewSet
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.viewsets import ModelViewSet
|
||||
from rest_framework import status
|
||||
|
||||
from core.apps.accounts.choices import RoleChoice
|
||||
from core.apps.evaluation.choices.request import RequestStatus
|
||||
from core.apps.evaluation.filters.request import EvaluationrequestFilter
|
||||
from core.apps.evaluation.models import EvaluationrequestModel
|
||||
from core.apps.evaluation.serializers.request import (
|
||||
CreateEvaluationrequestSerializer,
|
||||
ListEvaluationrequestSerializer,
|
||||
RetrieveEvaluationrequestSerializer,
|
||||
ArchiveEvaluationrequestSerializer,
|
||||
)
|
||||
from core.apps.evaluation.choices.request import RequestStatus
|
||||
from rest_framework.generics import GenericAPIView
|
||||
from drf_spectacular.utils import OpenApiResponse
|
||||
|
||||
|
||||
# class RequestPagination(PageNumberPagination):
|
||||
@@ -170,4 +174,77 @@ class EvaluationStatusChange(APIView):
|
||||
'success': True,
|
||||
'status': evaluation.status,
|
||||
'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 import status
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.generics import GenericAPIView
|
||||
|
||||
from drf_spectacular.utils import (
|
||||
@@ -14,7 +14,7 @@ from ..serializers import TechPassportSerializer
|
||||
|
||||
class TechPassportAPIView(GenericAPIView):
|
||||
authentication_classes = []
|
||||
permission_classes = [AllowAny]
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@extend_schema(
|
||||
tags=["Tech Passport"],
|
||||
@@ -33,18 +33,27 @@ class TechPassportAPIView(GenericAPIView):
|
||||
def post(self, request, *args, **kwargs):
|
||||
serializer = TechPassportSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
data = serializer.validated_data
|
||||
|
||||
try:
|
||||
result = TechPassportService.get_auto_info(
|
||||
autonumber=data["autonumber"],
|
||||
tech_pass_number=data["tech_pass_number"],
|
||||
tech_pass_series=data["tech_pass_series"],
|
||||
)
|
||||
return Response(result, status=status.HTTP_200_OK)
|
||||
result = TechPassportService.get_auto_info(
|
||||
autonumber=data["autonumber"],
|
||||
tech_pass_number=data["tech_pass_number"],
|
||||
tech_pass_series=data["tech_pass_series"],
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
response_data = result["data"]
|
||||
status_code = result["status_code"]
|
||||
|
||||
# success bo‘lsa faqat data ichidagi data qaytariladi
|
||||
if status_code == 200:
|
||||
return Response(
|
||||
{"detail": str(e)},
|
||||
status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
response_data.get("data", {}),
|
||||
status=status.HTTP_200_OK
|
||||
)
|
||||
|
||||
# error bo‘lsa original response qaytariladi
|
||||
return Response(
|
||||
response_data,
|
||||
status=status_code
|
||||
)
|
||||
Reference in New Issue
Block a user