diff --git a/api/urls.py b/api/urls.py index e10dc1ae..d48e0173 100644 --- a/api/urls.py +++ b/api/urls.py @@ -20,4 +20,5 @@ urlpatterns = [ path('cars/vin/', views.CarVINViewSet.as_view(), name='car_vin'), path("cars/", views.car_list, name="car-list"), path('login/', views.LoginView.as_view(), name='login'), + path("decode-vin/", views.VinDecodeAPIView.as_view(), name="api-decode-vin"), ] diff --git a/api/views.py b/api/views.py index 3a57ec94..11a40d81 100644 --- a/api/views.py +++ b/api/views.py @@ -1,19 +1,20 @@ from django.core.paginator import Paginator -from django.db.models import Q from django.http import JsonResponse -from django.views.decorators.csrf import csrf_exempt from rest_framework import permissions, status, viewsets, generics -from rest_framework.views import APIView -from rest_framework.response import Response -from django.contrib.auth import authenticate -from django.shortcuts import render - from inventory.utils import get_user_type from . import models, serializers -from .services import get_car_data, get_from_cardatabase -# from rest_framework.authtoken.models import Token -from django.utils.decorators import method_decorator +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 rest_framework import status +from django.utils.translation import gettext as _ + +from inventory import models as inventory_models +from inventory.services import get_make, get_model, decodevin +import logging + +logger = logging.getLogger(__name__) class LoginView(APIView): @@ -123,4 +124,43 @@ def car_list(request): "per_page": per_page, "total_pages": paginator.num_pages, # Total pages "total_items": paginator.count # Total records - }) \ No newline at end of file + }) + + +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) \ No newline at end of file diff --git a/car_inventory/urls.py b/car_inventory/urls.py index d74d43e0..22598cfe 100644 --- a/car_inventory/urls.py +++ b/car_inventory/urls.py @@ -12,7 +12,7 @@ urlpatterns = [ # path('__debug__/', include(debug_toolbar.urls)), # path('silk/', include('silk.urls', namespace='silk')), path('api-auth/', include('rest_framework.urls')), - # path('api/', include('api.urls')), + path('api/', include('api.urls')), # path('dj-rest-auth/', include('dj_rest_auth.urls')), diff --git a/inventory/signals.py b/inventory/signals.py index c8225da2..404c6e06 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -666,7 +666,7 @@ def save_journal(car_finance,ledger,vendor): coa = entity.get_default_coa() journal = JournalEntryModel.objects.create( posted=False, - description=f"Finances of Car:{car_finance.car.vin} for Vendor:{car_finance.car.vendor.vendor_name}", + description=f"Finances of Car:{car_finance.car.vin} for Vendor:{car_finance.car.vendor.name}", ledger=ledger, locked=False, origin="Payment", @@ -675,7 +675,7 @@ def save_journal(car_finance,ledger,vendor): ledger.save() inventory_account = entity.get_default_coa_accounts().filter(role=roles.ASSET_CA_INVENTORY).first() - vendor_account = entity.get_default_coa_accounts().filter(name=vendor.vendor_name).first() + vendor_account = entity.get_default_coa_accounts().filter(name=vendor.name).first() if not vendor_account: last_account = entity.get_all_accounts().filter(role=roles.LIABILITY_CL_ACC_PAYABLE).order_by('-created').first() @@ -685,7 +685,7 @@ def save_journal(car_finance,ledger,vendor): code = f"{int(last_account.code)+1}" vendor_account = entity.create_account( - name=vendor.vendor_name, + name=vendor.name, code=code, role=roles.LIABILITY_CL_ACC_PAYABLE, coa_model=coa, diff --git a/templates/dealers/assign_car_makes.html b/templates/dealers/assign_car_makes.html index f500a556..4bf54304 100644 --- a/templates/dealers/assign_car_makes.html +++ b/templates/dealers/assign_car_makes.html @@ -76,16 +76,16 @@ class="car-make-image"> {% else %}
- {{ car_make.name|slice:":3" }} + {{ car_make.name }}
{% endif %} -
{{ car_make.name }}
+
{{ car_make.get_local_name }}
{% endfor %}
- +
{% endblock %} \ No newline at end of file diff --git a/templates/items/service/service_list.html b/templates/items/service/service_list.html index b42e0521..95b860bc 100644 --- a/templates/items/service/service_list.html +++ b/templates/items/service/service_list.html @@ -37,7 +37,7 @@ No {% endif %} - {{ service.item.cogs_account }} + {{ service.item.co }}