From b752b4ed9b41ad151e5b8af270eecd9600e98d3d Mon Sep 17 00:00:00 2001 From: ismail Date: Thu, 7 Aug 2025 17:28:49 +0300 Subject: [PATCH 1/3] add unique slug to opportunity --- inventory/models.py | 36 +++++++++++++++++++++++++++++++++--- inventory/urls.py | 2 +- inventory/views.py | 20 +++++++++++++------- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/inventory/models.py b/inventory/models.py index ccf65f78..57a48f02 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): @@ -1208,7 +1218,17 @@ class Dealer(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) @property @@ -2284,7 +2304,17 @@ class Opportunity(models.Model): opportinity_for = self.organization.name if not self.slug: - self.slug = slugify(f"opportunity {opportinity_for}") + 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) class Meta: 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 27b48dd6..00bf55ba 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -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. @@ -512,7 +507,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() @@ -714,6 +709,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( From 2868a4ebac5939668dce508b8a630f4bec6193f7 Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Sun, 10 Aug 2025 19:07:13 +0300 Subject: [PATCH 2/3] update --- inventory/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/inventory/views.py b/inventory/views.py index 00bf55ba..ddf41dd1 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 ( From d43a1190925f2ac435e5fd832c8adabbbfad7d47 Mon Sep 17 00:00:00 2001 From: ismail Date: Mon, 11 Aug 2025 12:14:56 +0300 Subject: [PATCH 3/3] small changes --- inventory/models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/inventory/models.py b/inventory/models.py index 57a48f02..5fb590b5 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -1242,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) @@ -2304,7 +2307,7 @@ class Opportunity(models.Model): opportinity_for = self.organization.name if not self.slug: - base_slug = slugify(self.name) + base_slug = slugify(f"opportinity {opportinity_for}") self.slug = base_slug counter = 1