diff --git a/inventory/models.py b/inventory/models.py index 765f5754..53dee7df 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -381,7 +381,17 @@ class CarEquipment(models.Model, LocalizedNameMixin): def save(self, *args, **kwargs): if not self.slug: - self.slug = slugify(self.name) + base_slug = slugify(self.name) + self.slug = base_slug + counter = 1 + + while ( + self.__class__.objects.filter(slug=self.slug) + .exclude(pk=self.pk) + .exists() + ): + self.slug = f"{base_slug}-{counter}" + counter += 1 super().save(*args, **kwargs) def __str__(self): @@ -1232,6 +1242,9 @@ class Dealer(models.Model, LocalizedNameMixin): return None @property + def customers(self): + return models.Customer.objects.filter(dealer=self) + @property def user_quota(self): try: quota_dict = get_user_quota(self.user) @@ -2294,7 +2307,7 @@ class Opportunity(models.Model): opportinity_for = self.organization.name if not self.slug: - base_slug = slugify(f"opportunity for {opportinity_for}") + base_slug = slugify(f"opportinity {opportinity_for}") self.slug = base_slug counter = 1 diff --git a/inventory/urls.py b/inventory/urls.py index 2fae0256..cca5ab0a 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -46,7 +46,7 @@ urlpatterns = [ name="manager_dashboard", ), path("dashboards/sales/", views.SalesDashboard.as_view(), name="sales_dashboard"), - path("test/", views.TestView.as_view(), name="test"), + path("cars/inventory/table/", views.CarListViewTable.as_view(), name="car_table"), path("export/format/", TableExport.export, name="export"), # Dealer URLs diff --git a/inventory/views.py b/inventory/views.py index f4bd58c9..212dcad3 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -106,10 +106,10 @@ from django_ledger.forms.bank_account import ( BankAccountUpdateForm, ) from django_ledger.views.bill import ( - # BillModelCreateView, - # BillModelDetailView, - # BillModelUpdateView, - # BaseBillActionView as BaseBillActionViewBase, + BillModelCreateView, + BillModelDetailView, + BillModelUpdateView, + BaseBillActionView as BaseBillActionViewBase, BillModelModelBaseView, ) from django_ledger.forms.bill import ( @@ -277,11 +277,6 @@ def switch_language(request): logger.warning(f"Invalid language code: {language}") return redirect("/") - -def testview(request): - return HttpResponse("test") - - def dealer_signup(request): from django_q.tasks import async_task """ @@ -356,7 +351,6 @@ def dealer_signup(request): "account/signup-wizard.html", ) - class HomeView(LoginRequiredMixin, TemplateView): """ HomeView class responsible for rendering the home page. @@ -393,6 +387,7 @@ class TestView(TemplateView): template_name = "inventory/cars_list_api.html" + class ManagerDashboard(LoginRequiredMixin, TemplateView): """ ManagerDashboard class is a view handling the dashboard for a manager. @@ -513,7 +508,7 @@ class SalesDashboard(LoginRequiredMixin, TemplateView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) dealer = self.request.dealer - staff = self.request.staff + staff = getattr(self.request, "staff", None) total_cars = models.Car.objects.filter(dealer=dealer).count() total_reservations = models.CarReservation.objects.filter( reserved_by=self.request.user, reserved_until__gte=timezone.now() @@ -715,6 +710,17 @@ class AjaxHandlerView(LoginRequiredMixin, View): if result := decodevin(vin_no): manufacturer_name, model_name, year_model = result.values() car_make = get_make(manufacturer_name) + if not car_make: + logger.info( + f"VIN decoded using {decoding_method}: Make={manufacturer_name}, Model={model_name}, Year={year_model}" + ) + return JsonResponse( + { + "success": False, + "error": _("Manufacturer not found in the database"), + }, + status=404, + ) car_model = get_model(model_name, car_make) logger.info(