haikal/api/views.py
2025-06-22 13:25:54 +03:00

165 lines
5.4 KiB
Python

from django.core.paginator import Paginator
from django.http import JsonResponse
from rest_framework import permissions, status, viewsets
from inventory.utils import get_user_type
from . import models, serializers
from .services import get_car_data
from inventory import models as inventory_models
from rest_framework.views import APIView
from rest_framework.response import Response
from django.utils.translation import gettext as _
from inventory.services import decodevin
import logging
logger = logging.getLogger(__name__)
class LoginView(APIView):
permission_classes = [
permissions.AllowAny,
]
# def post(self, request, *args, **kwargs):
# username = request.data.get('username')
# password = request.data.get('password')
# if username is None or password is None:
# return Response({'error': 'Please provide both username and password.'}, status=status.HTTP_400_BAD_REQUEST)
# user = authenticate(username=username, password=password)
# if not user:
# return Response({'error': 'Invalid credentials.'}, status=status.HTTP_401_UNAUTHORIZED)
# token, created = Token.objects.get_or_create(user=user)
# return Response({'token': token.key, 'user_id': user.id, 'username': user.username}, status=status.HTTP_200_OK)
class CarVINViewSet(APIView):
queryset = models.CarVIN.objects.all().order_by("-created")
serializer_class = serializers.CarVINSerializer
def get(self, request):
vin = models.CarVIN.objects.all()
serializer = serializers.CarVINSerializer(vin, many=True)
return Response(serializer.data)
def post(self, request):
serializer = serializers.CarVINSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
for key, value in serializer.validated_data.items():
print(key, value)
get_car_data(value)
# get_from_cardatabase(value)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class CarMakeViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarMake.objects.filter(is_sa_import=True)
serializer_class = serializers.CarMakeSerializer
class CarModelViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarModel.objects.filter(id_car_make__is_sa_import=True)
serializer_class = serializers.CarModelSerializer
class CarSerieViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarSerie.objects.all()
serializer_class = serializers.CarSerieSerializer
class CarTrimViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarTrim.objects.all()
serializer_class = serializers.CarTrimSerializer
class CarEquipmentViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarEquipment.objects.all()
serializer_class = serializers.CarEquipmentSerializer
class CarSpecificationViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarSpecification.objects.all()
serializer_class = serializers.CarSpecificationSerializer
class CarSpecificationValueViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarSpecificationValue.objects.all()
serializer_class = serializers.CarSpecificationValueSerializer
class CarOptionViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarOption.objects.all()
serializer_class = serializers.CarOptionSerializer
class CarOptionValueViewSet(viewsets.ModelViewSet):
queryset = inventory_models.CarOptionValue.objects.all()
serializer_class = serializers.CarOptionValueSerializer
def car_list(request):
dealer = get_user_type(request)
page = request.GET.get("page", 1)
per_page = 10
cars = inventory_models.Car.objects.all().values(
"vin", "year", "id_car_make__name", "id_car_model__name", "status"
)
paginator = Paginator(cars, per_page)
page_obj = paginator.get_page(page)
return JsonResponse(
{
"data": list(page_obj), # Convert QuerySet to list
"page": page_obj.number, # Current page number
"per_page": per_page,
"total_pages": paginator.num_pages, # Total pages
"total_items": paginator.count, # Total records
}
)
class VinDecodeAPIView(APIView):
"""
API endpoint to decode a VIN number and return car make, model, and year.
GET Parameters:
- vin: The Vehicle Identification Number (VIN) to decode
Returns:
- JSON response with decoded data or error message
"""
permission_classes = [permissions.AllowAny]
def get(self, request, *args, **kwargs):
vin_no = request.GET.get("vin")
if not vin_no or len(vin_no.strip()) != 17:
return Response(
{"success": False, "error": _("Invalid VIN number provided")},
status=status.HTTP_400_BAD_REQUEST,
)
vin_no = vin_no.strip()
result = decodevin(vin_no)
if not result:
return Response(
{"success": False, "error": _("VIN not found in any source")},
status=status.HTTP_404_NOT_FOUND,
)
vin_data = {
"make": result.get("maker"),
"model": result.get("model_name"),
"modelYear": result.get("year_model"),
}
return Response({"success": True, "data": vin_data}, status=status.HTTP_200_OK)