From 2dfbb5fa9abbfab7216231855b39fd693e1caf77 Mon Sep 17 00:00:00 2001 From: gitea Date: Tue, 10 Dec 2024 10:13:10 +0000 Subject: [PATCH] add search to select fields, redirect logged in user to landingpage if they are authenticated --- .vscode/launch.json | 20 + car_inventory/settings.py | 8 +- inventory/admin.py | 23 +- .../management/commands/seed_customer.py | 37 ++ inventory/models.py | 185 ++++--- inventory/services.py | 3 +- inventory/urls.py | 5 +- inventory/views.py | 520 ++++++++++-------- requirements.txt | 3 +- static/images/logos/users/MainAfter.jpg | Bin 0 -> 86771 bytes templates/base.html | 15 +- templates/inventory/car_form.html | 5 +- templates/inventory/car_inventory.html | 3 +- templates/inventory/color_palette.html | 2 +- 14 files changed, 506 insertions(+), 323 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 inventory/management/commands/seed_customer.py create mode 100644 static/images/logos/users/MainAfter.jpg diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..998f9ee1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Django", + "type": "debugpy", + "request": "launch", + "args": [ + "runserver", + "0.0.0.0:8888" + ], + "django": true, + "autoStartBrowser": false, + "program": "${workspaceFolder}/manage.py" + } + ] +} \ No newline at end of file diff --git a/car_inventory/settings.py b/car_inventory/settings.py index 4ab05d7e..87d03ebd 100644 --- a/car_inventory/settings.py +++ b/car_inventory/settings.py @@ -26,7 +26,7 @@ SECRET_KEY = 'django-insecure-gc9bh4*3=b6hihdnaom0edjsbxh$5t)aap@e8p&340r7)*)qb8 # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['10.10.1.109', 'localhost', '127.0.0.1', '192.168.1.135', '172.20.10.4'] +ALLOWED_HOSTS = ['10.10.1.109','10.10.1.120', 'localhost', '127.0.0.1', '192.168.1.135', '172.20.10.4'] # Application definition @@ -110,9 +110,9 @@ WSGI_APPLICATION = 'car_inventory.wsgi.application' DATABASES = { "default": { "ENGINE": "django_prometheus.db.backends.postgresql", - "NAME": "secondhaikal", - "USER": "f95166", - "PASSWORD": "Kfsh&rc9788", + "NAME": "haikal", + "USER": "haikal", + "PASSWORD": "haikal", "HOST": "localhost", "PORT": 5432, } diff --git a/inventory/admin.py b/inventory/admin.py index 71b57989..a6f01e1e 100644 --- a/inventory/admin.py +++ b/inventory/admin.py @@ -12,7 +12,6 @@ admin.site.register(models.CarRegistration) admin.site.register(models.CustomCard) admin.site.register(models.CarSpecificationValue) - @admin.register(models.CarMake) class CarMakeAdmin(admin.ModelAdmin): list_display = ('name', 'arabic_name', 'is_sa_import') @@ -51,18 +50,18 @@ class CarSeriesAdmin(admin.ModelAdmin): verbose_name = "Car Series" -@admin.register(models.CarTrim) -class CarTrimAdmin(admin.ModelAdmin): - list_display = ('name', - 'id_car_serie__name', - 'id_car_serie__id_car_model__name', - 'id_car_serie__id_car_model__id_car_make__name') - search_fields = ('name', 'arabic_name', 'id_car_serie__id_car_model__name') - list_filter = ('id_car_serie__id_car_model__id_car_make__is_sa_import', - 'id_car_serie__id_car_model__id_car_make__name') +# @admin.register(models.CarTrim) +# class CarTrimAdmin(admin.ModelAdmin): +# list_display = ('name', +# 'id_car_serie__name', +# 'id_car_serie__id_car_model__name', +# 'id_car_serie__id_car_model__id_car_make__name') +# search_fields = ('name', 'arabic_name', 'id_car_serie__id_car_model__name') +# list_filter = ('id_car_serie__id_car_model__id_car_make__is_sa_import', +# 'id_car_serie__id_car_model__id_car_make__name') - class Meta: - verbose_name = "Car Trim" +# class Meta: +# verbose_name = "Car Trim" @admin.register(models.CarSpecification) diff --git a/inventory/management/commands/seed_customer.py b/inventory/management/commands/seed_customer.py new file mode 100644 index 00000000..4ef2518b --- /dev/null +++ b/inventory/management/commands/seed_customer.py @@ -0,0 +1,37 @@ +from django.core.management.base import BaseCommand +from faker import Faker +from inventory.models import Customer, Dealer + +class Command(BaseCommand): + help = 'Seed the Customer model with 20 records' + + def handle(self, *args, **kwargs): + fake = Faker() + dealers = Dealer.objects.all() + + if not dealers.exists(): + self.stdout.write(self.style.ERROR('No dealers found. Please create dealers first.')) + return + + for _ in range(20): + dealer = fake.random_element(elements=dealers) + first_name = fake.first_name() + middle_name = fake.first_name() if fake.boolean() else '' + last_name = fake.last_name() + email = fake.unique.email() + national_id = fake.unique.bothify(text='##########') + phone_number = fake.unique.phone_number() + address = fake.address() + + Customer.objects.create( + dealer=dealer, + first_name=first_name, + middle_name=middle_name, + last_name=last_name, + email=email, + national_id=national_id, + phone_number=phone_number, + address=address + ) + + self.stdout.write(self.style.SUCCESS('Successfully seeded 20 customers.')) \ No newline at end of file diff --git a/inventory/models.py b/inventory/models.py index 8b30724c..5469e2de 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -14,7 +14,6 @@ from django_ledger.models import ( UnitOfMeasureModel, CustomerModel, ItemModelQuerySet, - ) from phonenumber_field.modelfields import PhoneNumberField from django.contrib.contenttypes.models import ContentType @@ -27,7 +26,7 @@ class CarMake(models.Model, LocalizedNameMixin): id_car_make = models.AutoField(primary_key=True) name = models.CharField(max_length=255) arabic_name = models.CharField(max_length=255) - logo = models.ImageField(_('logo'), upload_to='car_make', blank=True, null=True) + logo = models.ImageField(_("logo"), upload_to="car_make", blank=True, null=True) is_sa_import = models.BooleanField(default=False) def __str__(self): @@ -39,7 +38,7 @@ class CarMake(models.Model, LocalizedNameMixin): class CarModel(models.Model, LocalizedNameMixin): id_car_model = models.AutoField(primary_key=True) - id_car_make = models.ForeignKey(CarMake, models.DO_NOTHING, db_column='id_car_make') + id_car_make = models.ForeignKey(CarMake, models.DO_NOTHING, db_column="id_car_make") name = models.CharField(max_length=255) arabic_name = models.CharField(max_length=255) @@ -52,7 +51,9 @@ class CarModel(models.Model, LocalizedNameMixin): class CarSerie(models.Model, LocalizedNameMixin): id_car_serie = models.AutoField(primary_key=True) - id_car_model = models.ForeignKey(CarModel, models.DO_NOTHING, db_column='id_car_model') + id_car_model = models.ForeignKey( + CarModel, models.DO_NOTHING, db_column="id_car_model" + ) name = models.CharField(max_length=255) arabic_name = models.CharField(max_length=255) @@ -65,7 +66,9 @@ class CarSerie(models.Model, LocalizedNameMixin): class CarTrim(models.Model, LocalizedNameMixin): id_car_trim = models.AutoField(primary_key=True) - id_car_serie = models.ForeignKey(CarSerie, models.DO_NOTHING, db_column='id_car_serie') + id_car_serie = models.ForeignKey( + CarSerie, models.DO_NOTHING, db_column="id_car_serie" + ) name = models.CharField(max_length=255) arabic_name = models.CharField(max_length=255) start_production_year = models.IntegerField(blank=True, null=True) @@ -82,7 +85,9 @@ class CarSpecification(models.Model, LocalizedNameMixin): id_car_specification = models.AutoField(primary_key=True) name = models.CharField(max_length=255) arabic_name = models.CharField(max_length=255) - id_parent = models.ForeignKey('self', models.DO_NOTHING, db_column='id_parent', blank=True, null=True) + id_parent = models.ForeignKey( + "self", models.DO_NOTHING, db_column="id_parent", blank=True, null=True + ) def __str__(self): return self.name @@ -93,8 +98,10 @@ class CarSpecification(models.Model, LocalizedNameMixin): class CarSpecificationValue(models.Model): id_car_specification_value = models.AutoField(primary_key=True) - id_car_trim = models.ForeignKey(CarTrim, models.DO_NOTHING, db_column='id_car_trim') - id_car_specification = models.ForeignKey(CarSpecification, models.DO_NOTHING, db_column='id_car_specification') + id_car_trim = models.ForeignKey(CarTrim, models.DO_NOTHING, db_column="id_car_trim") + id_car_specification = models.ForeignKey( + CarSpecification, models.DO_NOTHING, db_column="id_car_specification" + ) value = models.CharField(max_length=500) unit = models.CharField(max_length=255, blank=True, null=True) @@ -107,24 +114,21 @@ class CarSpecificationValue(models.Model): # Car Model class CarStatusChoices(models.TextChoices): - AVAILABLE = 'available', _('Available') - SOLD = 'sold', _('Sold') - HOLD = 'hold', _('Hold') - DAMAGED = 'damaged', _('Damaged') + AVAILABLE = "available", _("Available") + SOLD = "sold", _("Sold") + HOLD = "hold", _("Hold") + DAMAGED = "damaged", _("Damaged") class CarStockTypeChoices(models.TextChoices): - NEW = 'new', _('New') - USED = 'used', _('Used') + NEW = "new", _("New") + USED = "used", _("Used") class Car(models.Model): vin = models.CharField(max_length=17, unique=True, verbose_name=_("VIN")) dealer = models.ForeignKey( - "Dealer", - models.DO_NOTHING, - related_name='cars', - verbose_name=_("Dealer") + "Dealer", models.DO_NOTHING, related_name="cars", verbose_name=_("Dealer") ) vendor = models.ForeignKey( @@ -132,53 +136,53 @@ class Car(models.Model): models.DO_NOTHING, null=True, blank=True, - related_name='cars', - verbose_name=_("Vendor") + related_name="cars", + verbose_name=_("Vendor"), ) id_car_make = models.ForeignKey( CarMake, models.DO_NOTHING, - db_column='id_car_make', + db_column="id_car_make", null=True, blank=True, - verbose_name=_("Make") + verbose_name=_("Make"), ) id_car_model = models.ForeignKey( CarModel, models.DO_NOTHING, - db_column='id_car_model', + db_column="id_car_model", null=True, blank=True, - verbose_name=_("Model") + verbose_name=_("Model"), ) year = models.IntegerField(verbose_name=_("Year")) id_car_serie = models.ForeignKey( CarSerie, models.DO_NOTHING, - db_column='id_car_serie', + db_column="id_car_serie", null=True, blank=True, - verbose_name=_("Series") + verbose_name=_("Series"), ) id_car_trim = models.ForeignKey( CarTrim, models.DO_NOTHING, - db_column='id_car_trim', + db_column="id_car_trim", null=True, blank=True, - verbose_name=_("Trim") + verbose_name=_("Trim"), ) status = models.CharField( max_length=10, choices=CarStatusChoices.choices, default=CarStatusChoices.AVAILABLE, - verbose_name=_("Status") + verbose_name=_("Status"), ) stock_type = models.CharField( max_length=10, choices=CarStockTypeChoices.choices, default=CarStockTypeChoices.NEW, - verbose_name=_("Stock Type") + verbose_name=_("Stock Type"), ) remarks = models.TextField(blank=True, null=True, verbose_name=_("Remarks")) mileage = models.IntegerField(blank=True, null=True, verbose_name=_("Mileage")) @@ -201,21 +205,23 @@ class Car(models.Model): @property def selling_price(self): finance = self.finances.first() - return finance.selling_price if finance else Decimal('0.00') + return finance.selling_price if finance else Decimal("0.00") @property def vat_amount(self): finance = self.finances.first() - return finance.vat_amount if finance else Decimal('0.00') + return finance.vat_amount if finance else Decimal("0.00") @property def total(self): finance = self.finances.first() - return finance.total if finance else Decimal('0.00') + return finance.total if finance else Decimal("0.00") class CarReservation(models.Model): - car = models.ForeignKey('Car', on_delete=models.CASCADE, related_name='reservations') + car = models.ForeignKey( + "Car", on_delete=models.CASCADE, related_name="reservations" + ) reserved_by = models.ForeignKey(User, on_delete=models.CASCADE) reserved_at = models.DateTimeField(auto_now_add=True) reserved_until = models.DateTimeField() @@ -224,19 +230,31 @@ class CarReservation(models.Model): return self.reserved_until > now() class Meta: - unique_together = ('car', 'reserved_until') - ordering = ['-reserved_at'] + unique_together = ("car", "reserved_until") + ordering = ["-reserved_at"] # Car Finance Model class CarFinance(models.Model): - car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name='finances') - cost_price = models.DecimalField(max_digits=14, decimal_places=2, verbose_name=_("Cost Price")) - profit_margin = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=_("Profit Margin")) - selling_price = models.DecimalField(max_digits=14, decimal_places=2, verbose_name=_("Selling Price"), editable=False) - vat_rate = models.DecimalField(max_digits=10, decimal_places=2, default=0.15, verbose_name=_("VAT Rate")) - vat_amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name=_("VAT Amount"), editable=False) - total = models.DecimalField(max_digits=14, decimal_places=2, verbose_name=_("Total Amount"), editable=False) + car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name="finances") + cost_price = models.DecimalField( + max_digits=14, decimal_places=2, verbose_name=_("Cost Price") + ) + profit_margin = models.DecimalField( + max_digits=10, decimal_places=2, verbose_name=_("Profit Margin") + ) + selling_price = models.DecimalField( + max_digits=14, decimal_places=2, verbose_name=_("Selling Price"), editable=False + ) + vat_rate = models.DecimalField( + max_digits=10, decimal_places=2, default=0.15, verbose_name=_("VAT Rate") + ) + vat_amount = models.DecimalField( + max_digits=12, decimal_places=2, verbose_name=_("VAT Amount"), editable=False + ) + total = models.DecimalField( + max_digits=14, decimal_places=2, verbose_name=_("Total Amount"), editable=False + ) class Meta: verbose_name = _("Car Financial Details") @@ -249,16 +267,18 @@ class CarFinance(models.Model): super().save(*args, **kwargs) def __str__(self): - return f"Car Financial Details for {self.car}: Selling Price {self.selling_price}" + return ( + f"Car Financial Details for {self.car}: Selling Price {self.selling_price}" + ) # Colors Model class CarColors(models.Model): class ColorType(models.TextChoices): - EXTERIOR = 'exterior', _("Exterior") - INTERIOR = 'interior', _("Interior") + EXTERIOR = "exterior", _("Exterior") + INTERIOR = "interior", _("Interior") - car = models.ForeignKey('Car', on_delete=models.CASCADE, related_name='colors') + car = models.ForeignKey("Car", on_delete=models.CASCADE, related_name="colors") name = models.CharField(max_length=255, verbose_name=_("Name")) arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) rgb = models.CharField(max_length=24, blank=True, null=True, verbose_name=_("RGB")) @@ -266,7 +286,7 @@ class CarColors(models.Model): max_length=10, choices=ColorType.choices, default=ColorType.EXTERIOR, - verbose_name=_("Color Type") + verbose_name=_("Color Type"), ) class Meta: @@ -279,7 +299,12 @@ class CarColors(models.Model): # Custom Card Model class CustomCard(models.Model): - car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name='custom_cards', verbose_name=_("Car")) + car = models.ForeignKey( + Car, + on_delete=models.CASCADE, + related_name="custom_cards", + verbose_name=_("Car"), + ) custom_number = models.CharField(max_length=255, verbose_name=_("Custom Number")) custom_date = models.DateField(verbose_name=_("Custom Date")) @@ -293,7 +318,12 @@ class CustomCard(models.Model): # Car Registration Model class CarRegistration(models.Model): - car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name='registrations', verbose_name=_("Car")) + car = models.ForeignKey( + Car, + on_delete=models.CASCADE, + related_name="registrations", + verbose_name=_("Car"), + ) plate_number = models.IntegerField(verbose_name=_("Plate Number")) text1 = models.CharField(max_length=1, verbose_name=_("Text 1")) text2 = models.CharField(max_length=1, verbose_name=_("Text 2")) @@ -319,14 +349,20 @@ class TimestampedModel(models.Model): # Dealer Model class Dealer(models.Model, LocalizedNameMixin): - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='dealer') - crn = models.CharField(max_length=10, verbose_name=_("Commercial Registration Number")) + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="dealer") + crn = models.CharField( + max_length=10, verbose_name=_("Commercial Registration Number") + ) vrn = models.CharField(max_length=15, verbose_name=_("VAT Registration Number")) arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) name = models.CharField(max_length=255, verbose_name=_("English Name")) - phone_number = PhoneNumberField(region='SA', verbose_name=_("Phone Number")) - address = models.CharField(max_length=200, blank=True, null=True, verbose_name=_("Address")) - logo = models.ImageField(upload_to="logos/users", blank=True, null=True, verbose_name=_("Logo")) + phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + address = models.CharField( + max_length=200, blank=True, null=True, verbose_name=_("Address") + ) + logo = models.ImageField( + upload_to="logos/users", blank=True, null=True, verbose_name=_("Logo") + ) class Meta: verbose_name = _("Dealer") @@ -338,14 +374,20 @@ class Dealer(models.Model, LocalizedNameMixin): # Vendor Model class Vendor(models.Model, LocalizedNameMixin): - dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, related_name='vendors') - crn = models.CharField(max_length=10, unique=True, verbose_name=_("Commercial Registration Number")) - vrn = models.CharField(max_length=15, unique=True, verbose_name=_("VAT Registration Number")) + dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, related_name="vendors") + crn = models.CharField( + max_length=10, unique=True, verbose_name=_("Commercial Registration Number") + ) + vrn = models.CharField( + max_length=15, unique=True, verbose_name=_("VAT Registration Number") + ) arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) name = models.CharField(max_length=255, verbose_name=_("English Name")) contact_person = models.CharField(max_length=100, verbose_name=_("Contact Person")) - phone_number = PhoneNumberField(region='SA', verbose_name=_("Phone Number")) - address = models.CharField(max_length=200, blank=True, null=True, verbose_name=_("Address")) + phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + address = models.CharField( + max_length=200, blank=True, null=True, verbose_name=_("Address") + ) class Meta: verbose_name = _("Vendor") @@ -357,14 +399,24 @@ class Vendor(models.Model, LocalizedNameMixin): # Customer Model class Customer(models.Model): - dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, related_name='customers') + dealer = models.ForeignKey( + Dealer, on_delete=models.CASCADE, related_name="customers" + ) first_name = models.CharField(max_length=50, verbose_name=_("First Name")) - middle_name = models.CharField(max_length=50, blank=True, null=True, verbose_name=_("Middle Name")) + middle_name = models.CharField( + max_length=50, blank=True, null=True, verbose_name=_("Middle Name") + ) last_name = models.CharField(max_length=50, verbose_name=_("Last Name")) email = models.EmailField(unique=True, verbose_name=_("Email")) - national_id = models.CharField(max_length=10, unique=True, verbose_name=_("National ID")) - phone_number = PhoneNumberField(region='SA', unique=True, verbose_name=_("Phone Number")) - address = models.CharField(max_length=200, blank=True, null=True, verbose_name=_("Address")) + national_id = models.CharField( + max_length=10, unique=True, verbose_name=_("National ID") + ) + phone_number = PhoneNumberField( + region="SA", unique=True, verbose_name=_("Phone Number") + ) + address = models.CharField( + max_length=200, blank=True, null=True, verbose_name=_("Address") + ) created = models.DateTimeField(auto_now_add=True, verbose_name=_("Created")) class Meta: @@ -372,10 +424,9 @@ class Customer(models.Model): verbose_name_plural = _("Customers") def __str__(self): - middle = f" {self.middle_name}" if self.middle_name else '' + middle = f" {self.middle_name}" if self.middle_name else "" return f"{self.first_name}{middle} {self.last_name}" - # Create Entity @receiver(post_save, sender=Dealer) def create_ledger_entity(sender, instance, created, **kwargs): diff --git a/inventory/services.py b/inventory/services.py index 86835747..c476558a 100644 --- a/inventory/services.py +++ b/inventory/services.py @@ -25,7 +25,6 @@ def decode_vin_pyvin(vin): print(data) return data - # vehicle-info # c2729afb # 6d397471920412d672af1b8a02ca52ea @@ -131,7 +130,7 @@ def fetch_colors(car_data): make = car_data['make'] model = car_data['model'] - url = "https://carapi.app/api/exterior-colors?year={}&make={}&model={}".format(year, make, model) + url = "https://carapi.app/api/exterior-colors?year={}&make={}&model={}".format(year, make, model) params = { 'limit': '1000', 'sort': 'name', diff --git a/inventory/urls.py b/inventory/urls.py index 28a3f3dd..ccde353e 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -62,7 +62,4 @@ urlpatterns = [ path('cars/reserve//', views.reserve_car_view, name='reserve_car'), path('reservations//', views.manage_reservation, name='reservations'), path('cars//add-custom-card/', views.CustomCardCreateView.as_view(), name='add_custom_card'), - -] - - +] \ No newline at end of file diff --git a/inventory/views.py b/inventory/views.py index 016c3bb0..faa94f9b 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -15,7 +15,7 @@ from django.views.generic import ( CreateView, UpdateView, DeleteView, - TemplateView + TemplateView, ) from django.utils import timezone, translation from django.conf import settings @@ -34,17 +34,24 @@ logging.basicConfig(level=logging.INFO) def switch_language(request): - language = request.GET.get('language', 'en') - referer = request.META.get('HTTP_REFERER', '/') + language = request.GET.get("language", "en") + referer = request.META.get("HTTP_REFERER", "/") parsed_url = urlparse(referer) - path_parts = parsed_url.path.split('/') + path_parts = parsed_url.path.split("/") if path_parts[1] in dict(settings.LANGUAGES): path_parts.pop(1) - new_path = '/'.join(path_parts) + new_path = "/".join(path_parts) new_url = urlunparse( - (parsed_url.scheme, parsed_url.netloc, new_path, parsed_url.params, parsed_url.query, parsed_url.fragment) + ( + parsed_url.scheme, + parsed_url.netloc, + new_path, + parsed_url.params, + parsed_url.query, + parsed_url.fragment, + ) ) if language in dict(settings.LANGUAGES): @@ -53,89 +60,96 @@ def switch_language(request): response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language) translation.activate(language) request.session[settings.LANGUAGE_COOKIE_NAME] = language - logger.debug(f"Language switched to: {language}, Session: {request.session[settings.LANGUAGE_COOKIE_NAME]}") + logger.debug( + f"Language switched to: {language}, Session: {request.session[settings.LANGUAGE_COOKIE_NAME]}" + ) return response else: logger.warning(f"Invalid language code: {language}") - return redirect('/') + return redirect("/") class HomeView(LoginRequiredMixin, TemplateView): - template_name = 'index.html' + template_name = "index.html" def dispatch(self, request, *args, **kwargs): - if not hasattr(request.user, 'dealer') or not request.user.is_authenticated: - messages.error(request, _('You are not associated with any dealer.')) - return redirect('welcome') + if not hasattr(request.user, "dealer") or not request.user.is_authenticated: + messages.error(request, _("You are not associated with any dealer.")) + return redirect("welcome") return super().dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) total_cars = models.Car.objects.count() - total_reservations = models.CarReservation.objects.filter(reserved_until__gte=timezone.now()).count() + total_reservations = models.CarReservation.objects.filter( + reserved_until__gte=timezone.now() + ).count() stats = models.CarFinance.objects.aggregate( - total_cost_price=Sum('cost_price'), - total_selling_price=Sum('selling_price'), + total_cost_price=Sum("cost_price"), + total_selling_price=Sum("selling_price"), ) - total_cost_price = stats['total_cost_price'] or 0 - total_selling_price = stats['total_selling_price'] or 0 + total_cost_price = stats["total_cost_price"] or 0 + total_selling_price = stats["total_selling_price"] or 0 total_profit = total_selling_price - total_cost_price - context['total_cars'] = total_cars - context['total_reservations'] = total_reservations - context['total_cost_price'] = total_cost_price - context['total_selling_price'] = total_selling_price - context['total_profit'] = total_profit + context["total_cars"] = total_cars + context["total_reservations"] = total_reservations + context["total_cost_price"] = total_cost_price + context["total_selling_price"] = total_selling_price + context["total_profit"] = total_profit return context class WelcomeView(TemplateView): template_name = "welcome.html" + + def dispatch(self, request, *args, **kwargs): + if hasattr(request.user, "dealer") and request.user.is_authenticated: + return redirect("landing_page") + return super().dispatch(request, *args, **kwargs) class CarCreateView(LoginRequiredMixin, CreateView): model = models.Car form_class = forms.CarForm - template_name = 'inventory/car_form.html' - success_url = reverse_lazy('inventory_stats') + template_name = "inventory/car_form.html" + success_url = reverse_lazy("inventory_stats") def form_valid(self, form): form.instance.dealer = self.request.user.dealer form.save() - messages.success(self.request, 'Car saved successfully.') + messages.success(self.request, "Car saved successfully.") return super().form_valid(form) class AjaxHandlerView(LoginRequiredMixin, View): def get(self, request, *args, **kwargs): - action = request.GET.get('action') + action = request.GET.get("action") handlers = { - 'decode_vin': self.decode_vin, - 'get_models': self.get_models, - 'get_series': self.get_series, - 'get_trims': self.get_trims, - 'get_specifications': self.get_specifications, + "decode_vin": self.decode_vin, + "get_models": self.get_models, + "get_series": self.get_series, + "get_trims": self.get_trims, + "get_specifications": self.get_specifications, } handler = handlers.get(action) if handler: return handler(request) else: - return JsonResponse({'error': 'Invalid action'}, status=400) + return JsonResponse({"error": "Invalid action"}, status=400) def decode_vin(self, request): - vin_no = request.GET.get('vin_no') + vin_no = request.GET.get("vin_no") if not vin_no or len(vin_no.strip()) != 17: - return JsonResponse({'success': False, 'error': 'Invalid VIN number provided.'}, status=400) + return JsonResponse( + {"success": False, "error": "Invalid VIN number provided."}, status=400 + ) vin_no = vin_no.strip() vin_data = {} - decoding_method = '' + decoding_method = "" - decoding_methods = [ - ('PYVIN', decode_vin_pyvin), - ('VIN', VIN), - ('ELM', elm) - ] + decoding_methods = [("PYVIN", decode_vin_pyvin), ("VIN", VIN), ("ELM", elm)] manufacturer_name = model_name_before = model_name = year_model = None @@ -143,25 +157,33 @@ class AjaxHandlerView(LoginRequiredMixin, View): try: vin_info = decode_function(vin_no) if vin_info: - if method_name == 'PYVIN': + if method_name == "PYVIN": manufacturer_name = vin_info.Make.strip() model_name_before = vin_info.Model.strip() year_model = vin_info.ModelYear if not manufacturer_name or not year_model: - raise ValueError('PYVIN returned incomplete data.') - elif method_name == 'VIN': + raise ValueError("PYVIN returned incomplete data.") + elif method_name == "VIN": manufacturer_name = vin_info.make.strip() model_name_before = vin_info.model.strip() year_model = vin_info.model_year - if not manufacturer_name or not model_name_before or not year_model: - raise ValueError('VIN returned incomplete data.') - elif method_name == 'ELM': - elm_data = vin_info.get('data', {}) - manufacturer_name = elm_data.get('maker', '').strip() - model_name_before = elm_data.get('model', '').strip() - year_model = elm_data.get('modelYear', '').strip() - if not manufacturer_name or not model_name_before or not year_model: - raise ValueError('ELM returned incomplete data.') + if ( + not manufacturer_name + or not model_name_before + or not year_model + ): + raise ValueError("VIN returned incomplete data.") + elif method_name == "ELM": + elm_data = vin_info.get("data", {}) + manufacturer_name = elm_data.get("maker", "").strip() + model_name_before = elm_data.get("model", "").strip() + year_model = elm_data.get("modelYear", "").strip() + if ( + not manufacturer_name + or not model_name_before + or not year_model + ): + raise ValueError("ELM returned incomplete data.") model_name = normalize_name(model_name_before) decoding_method = method_name print(f"decoded by {method_name}") @@ -169,75 +191,101 @@ class AjaxHandlerView(LoginRequiredMixin, View): else: logger.warning(f"{method_name} returned no data for {vin_no}.") except Exception as e: - logger.warning(f"VIN decoding with {method_name} failed for {vin_no}: {e}") + logger.warning( + f"VIN decoding with {method_name} failed for {vin_no}: {e}" + ) if not manufacturer_name or not model_name or not year_model: - return JsonResponse({'success': False, 'error': 'VIN not found in all sources.'}, status=404) + return JsonResponse( + {"success": False, "error": "VIN not found in all sources."}, status=404 + ) logger.info( f"VIN decoded using {decoding_method}: Make={manufacturer_name}, Model={model_name}, Year={year_model}" ) - car_make = models.CarMake.objects.filter(name__icontains=manufacturer_name).first() + car_make = models.CarMake.objects.filter( + name__icontains=manufacturer_name + ).first() if not car_make: - return JsonResponse({'success': False, 'error': 'Manufacturer not found in the database.'}, status=404) - vin_data['make_id'] = car_make.id_car_make - vin_data['name'] = car_make.name - vin_data['arabic_name'] = car_make.arabic_name + return JsonResponse( + {"success": False, "error": "Manufacturer not found in the database."}, + status=404, + ) + vin_data["make_id"] = car_make.id_car_make + vin_data["name"] = car_make.name + vin_data["arabic_name"] = car_make.arabic_name - car_model = models.CarModel.objects.filter(id_car_make=car_make.id_car_make, name__icontains=model_name).first() + car_model = models.CarModel.objects.filter( + id_car_make=car_make.id_car_make, name__icontains=model_name + ).first() if not car_model: - return JsonResponse({'success': False, 'error': 'Model not found for the given manufacturer.'}, status=404) + return JsonResponse( + { + "success": False, + "error": "Model not found for the given manufacturer.", + }, + status=404, + ) - vin_data['model_id'] = car_model.id_car_model - vin_data['year'] = year_model - return JsonResponse({'success': True, 'data': vin_data}) + vin_data["model_id"] = car_model.id_car_model + vin_data["year"] = year_model + return JsonResponse({"success": True, "data": vin_data}) def get_models(self, request): - make_id = request.GET.get('make_id') - car_models = models.CarModel.objects.filter(id_car_make=make_id).values('id_car_model', 'name', 'arabic_name') + make_id = request.GET.get("make_id") + car_models = models.CarModel.objects.filter(id_car_make=make_id).values( + "id_car_model", "name", "arabic_name" + ) return JsonResponse(list(car_models), safe=False) def get_series(self, request): - model_id = request.GET.get('model_id') + model_id = request.GET.get("model_id") series = models.CarSerie.objects.filter( id_car_model=model_id, - ).values('id_car_serie', 'name', 'arabic_name') + ).values("id_car_serie", "name", "arabic_name") return JsonResponse(list(series), safe=False) def get_trims(self, request): - serie_id = request.GET.get('serie_id') - trims = models.CarTrim.objects.filter( - id_car_serie=serie_id - ).values('id_car_trim', 'name', 'arabic_name') + serie_id = request.GET.get("serie_id") + trims = models.CarTrim.objects.filter(id_car_serie=serie_id).values( + "id_car_trim", "name", "arabic_name" + ) return JsonResponse(list(trims), safe=False) def get_specifications(self, request): - trim_id = request.GET.get('trim_id') - car_spec_values = models.CarSpecificationValue.objects.filter(id_car_trim=trim_id) + trim_id = request.GET.get("trim_id") + car_spec_values = models.CarSpecificationValue.objects.filter( + id_car_trim=trim_id + ) lang = translation.get_language() specs_by_parent = {} for value in car_spec_values: specification = value.id_car_specification parent = specification.id_parent parent_id = parent.id_car_specification if parent else 0 - if lang == 'ar': + if lang == "ar": parent_name = parent.arabic_name if parent else "Root" else: parent_name = parent.name if parent else "Root" if parent_id not in specs_by_parent: - specs_by_parent[parent_id] = {'parent_name': parent_name, 'specifications': []} + specs_by_parent[parent_id] = { + "parent_name": parent_name, + "specifications": [], + } spec_data = { - 'specification_id': specification.id_car_specification, - 's_name': specification.arabic_name if lang == 'ar' else specification.name, - 's_value': value.value, - 's_unit': value.unit if value.unit else "", - 'trim_name': value.id_car_trim.name + "specification_id": specification.id_car_specification, + "s_name": specification.arabic_name + if lang == "ar" + else specification.name, + "s_value": value.value, + "s_unit": value.unit if value.unit else "", + "trim_name": value.id_car_trim.name, } - specs_by_parent[parent_id]['specifications'].append(spec_data) + specs_by_parent[parent_id]["specifications"].append(spec_data) serialized_specs = [ - {'parent_name': v['parent_name'], 'specifications': v['specifications']} + {"parent_name": v["parent_name"], "specifications": v["specifications"]} for v in specs_by_parent.values() ] return JsonResponse(serialized_specs, safe=False) @@ -245,22 +293,23 @@ class AjaxHandlerView(LoginRequiredMixin, View): class CarInventory(LoginRequiredMixin, ListView): model = models.Car - home_label = _('inventory') - template_name = 'inventory/car_inventory.html' - context_object_name = 'cars' + home_label = _("inventory") + template_name = "inventory/car_inventory.html" + context_object_name = "cars" paginate_by = 10 - ordering = ['receiving_date'] + ordering = ["receiving_date"] def get_queryset(self, *args, **kwargs): - query = self.request.GET.get('q') - make_id = self.kwargs['make_id'] - model_id = self.kwargs['model_id'] - trim_id = self.kwargs['trim_id'] + query = self.request.GET.get("q") + make_id = self.kwargs["make_id"] + model_id = self.kwargs["model_id"] + trim_id = self.kwargs["trim_id"] cars = models.Car.objects.filter( dealer__user=self.request.user, id_car_make=make_id, id_car_model=model_id, - id_car_trim=trim_id,).order_by('receiving_date') + id_car_trim=trim_id, + ).order_by("receiving_date") if query: cars = cars.filter(Q(vin__icontains=query)) @@ -268,10 +317,10 @@ class CarInventory(LoginRequiredMixin, ListView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['query'] = self.request.GET.get('q', '') - context['make_id'] = self.kwargs['make_id'] - context['model_id'] = self.kwargs['model_id'] - context['trim_id'] = self.kwargs['trim_id'] + context["query"] = self.request.GET.get("q", "") + context["make_id"] = self.kwargs["make_id"] + context["model_id"] = self.kwargs["model_id"] + context["trim_id"] = self.kwargs["trim_id"] return context @@ -282,11 +331,11 @@ def inventory_stats_view(request): # Annotate total cars by make, model, and trim cars = ( models.Car.objects.filter(dealer=dealer) - .select_related('id_car_make', 'id_car_model', 'id_car_trim') + .select_related("id_car_make", "id_car_model", "id_car_trim") .annotate( - make_total=Count('id_car_make'), - model_total=Count('id_car_model'), - trim_total=Count('id_car_trim') + make_total=Count("id_car_make"), + model_total=Count("id_car_model"), + trim_total=Count("id_car_trim"), ) ) @@ -295,123 +344,128 @@ def inventory_stats_view(request): for car in cars: # Make Level make = car.id_car_make + if make.id_car_make not in inventory: inventory[make.id_car_make] = { - 'make_id': make.id_car_make, - 'make_name': make.get_local_name(), - 'total_cars': 0, - 'models': {} + "make_id": make.id_car_make, + "make_name": make.get_local_name(), + "total_cars": 0, + "models": {}, } - inventory[make.id_car_make]['total_cars'] += 1 + inventory[make.id_car_make]["total_cars"] += 1 # Model Level model = car.id_car_model - if model and model.id_car_model not in inventory[make.id_car_make]['models']: - inventory[make.id_car_make]['models'][model.id_car_model] = { - 'model_id': model.id_car_model, - 'model_name': model.get_local_name(), - 'total_cars': 0, - 'trims': {} + if model and model.id_car_model not in inventory[make.id_car_make]["models"]: + inventory[make.id_car_make]["models"][model.id_car_model] = { + "model_id": model.id_car_model, + "model_name": model.get_local_name(), + "total_cars": 0, + "trims": {}, } - inventory[make.id_car_make]['models'][model.id_car_model]['total_cars'] += 1 + inventory[make.id_car_make]["models"][model.id_car_model]["total_cars"] += 1 # Trim Level trim = car.id_car_trim - if trim and trim.id_car_trim not in inventory[make.id_car_make]['models'][model.id_car_model]['trims']: - inventory[make.id_car_make]['models'][model.id_car_model]['trims'][trim.id_car_trim] = { - 'trim_id': trim.id_car_trim, - 'trim_name': trim.name, - 'total_cars': 0 - } - inventory[make.id_car_make]['models'][model.id_car_model]['trims'][trim.id_car_trim]['total_cars'] += 1 + if ( + trim + and trim.id_car_trim + not in inventory[make.id_car_make]["models"][model.id_car_model]["trims"] + ): + inventory[make.id_car_make]["models"][model.id_car_model]["trims"][ + trim.id_car_trim + ] = {"trim_id": trim.id_car_trim, "trim_name": trim.name, "total_cars": 0} + inventory[make.id_car_make]["models"][model.id_car_model]["trims"][ + trim.id_car_trim + ]["total_cars"] += 1 # Convert to a list for easier template rendering result = { - 'total_cars': cars.count(), - 'makes': [ + "total_cars": cars.count(), + "makes": [ { - 'make_id': make_data['make_id'], - 'make_name': make_data['make_name'], - 'total_cars': make_data['total_cars'], - 'models': [ + "make_id": make_data["make_id"], + "make_name": make_data["make_name"], + "total_cars": make_data["total_cars"], + "models": [ { - 'model_id': model_data['model_id'], - 'model_name': model_data['model_name'], - 'total_cars': model_data['total_cars'], - 'trims': list(model_data['trims'].values()) + "model_id": model_data["model_id"], + "model_name": model_data["model_name"], + "total_cars": model_data["total_cars"], + "trims": list(model_data["trims"].values()), } - for model_data in make_data['models'].values() - ] + for model_data in make_data["models"].values() + ], } for make_data in inventory.values() - ] + ], } - return render(request, 'inventory/inventory_stats.html', {'inventory': result}) + return render(request, "inventory/inventory_stats.html", {"inventory": result}) class CarDetailView(LoginRequiredMixin, DetailView): model = models.Car - template_name = 'inventory/car_detail.html' - context_object_name = 'car' + template_name = "inventory/car_detail.html" + context_object_name = "car" class CarFinanceCreateView(LoginRequiredMixin, CreateView): model = models.CarFinance form_class = forms.CarFinanceForm - template_name = 'inventory/car_finance_form.html' + template_name = "inventory/car_finance_form.html" def dispatch(self, request, *args, **kwargs): - self.car = get_object_or_404(models.Car, pk=self.kwargs['car_pk']) + self.car = get_object_or_404(models.Car, pk=self.kwargs["car_pk"]) return super().dispatch(request, *args, **kwargs) def form_valid(self, form): form.instance.car = self.car - messages.success(self.request, _('Car finance details saved successfully.')) + messages.success(self.request, _("Car finance details saved successfully.")) return super().form_valid(form) def get_success_url(self): - return reverse('car_detail', kwargs={'pk': self.car.pk}) + return reverse("car_detail", kwargs={"pk": self.car.pk}) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['car'] = self.car + context["car"] = self.car return context class CarFinanceUpdateView(LoginRequiredMixin, UpdateView): model = models.CarFinance form_class = forms.CarFinanceForm - template_name = 'inventory/car_finance_form.html' + template_name = "inventory/car_finance_form.html" def form_valid(self, form): - messages.success(self.request, _('Car finance updated successfully.')) + messages.success(self.request, _("Car finance updated successfully.")) return super().form_valid(form) def get_success_url(self): - return reverse('car_detail', kwargs={'pk': self.object.car.pk}) + return reverse("car_detail", kwargs={"pk": self.object.car.pk}) class CarUpdateView(LoginRequiredMixin, UpdateView): model = models.Car form_class = forms.CarUpdateForm - template_name = 'inventory/car_edit.html' + template_name = "inventory/car_edit.html" def form_valid(self, form): - messages.success(self.request, _('Car updated successfully.')) + messages.success(self.request, _("Car updated successfully.")) return super().form_valid(form) def get_success_url(self): - return reverse('car_detail', kwargs={'pk': self.object.pk}) + return reverse("car_detail", kwargs={"pk": self.object.pk}) class CarDeleteView(LoginRequiredMixin, DeleteView): model = models.Car - template_name = 'inventory/car_confirm_delete.html' - success_url = reverse_lazy('inventory_stats') + template_name = "inventory/car_confirm_delete.html" + success_url = reverse_lazy("inventory_stats") def delete(self, request, *args, **kwargs): - messages.success(request, _('Car deleted successfully.')) + messages.success(request, _("Car deleted successfully.")) return super().delete(request, *args, **kwargs) @@ -421,26 +475,26 @@ class CustomCardCreateView(LoginRequiredMixin, CreateView): template_name = "inventory/add_custom_card.html" def form_valid(self, form): - car = get_object_or_404(models.Car, pk=self.kwargs['car_pk']) + car = get_object_or_404(models.Car, pk=self.kwargs["car_pk"]) form.instance.car = car return super().form_valid(form) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['car'] = get_object_or_404(models.Car, pk=self.kwargs['car_pk']) + context["car"] = get_object_or_404(models.Car, pk=self.kwargs["car_pk"]) return context def get_success_url(self): messages.success(self.request, _("Custom Card added successfully.")) - return reverse_lazy('car_detail', kwargs={'pk': self.kwargs['car_pk']}) + return reverse_lazy("car_detail", kwargs={"pk": self.kwargs["car_pk"]}) class CarColorCreateView(LoginRequiredMixin, CreateView): model = models.CarColors - template_name = 'inventory/color_palette.html' + template_name = "inventory/color_palette.html" def dispatch(self, request, *args, **kwargs): - self.car = get_object_or_404(models.Car, pk=self.kwargs['car_pk']) + self.car = get_object_or_404(models.Car, pk=self.kwargs["car_pk"]) self.available_colors = self.fetch_available_colors() return super().dispatch(request, *args, **kwargs) @@ -448,41 +502,45 @@ class CarColorCreateView(LoginRequiredMixin, CreateView): class ColorPickerForm(ModelForm): color = ChoiceField( choices=self.get_color_choices(), - widget=RadioSelect(attrs={'class': 'color-picker'}), + widget=RadioSelect(attrs={"class": "color-picker"}), label=_("Select a Color"), ) color_type = ChoiceField( choices=models.CarColors.ColorType.choices, - widget=RadioSelect(attrs={'class': 'color-type-picker'}), + widget=RadioSelect(attrs={"class": "color-type-picker"}), label=_("Select Color Type"), ) class Meta: model = models.CarColors - fields = ['color', 'color_type'] + fields = ["color", "color_type"] return ColorPickerForm def fetch_available_colors(self): car_data = { - 'make': self.car.id_car_make.name, - 'model': self.car.id_car_model.name, - 'year': str(self.car.year), + "make": self.car.id_car_make.name, + "model": self.car.id_car_model.name, + "year": str(self.car.year), } return fetch_colors(car_data) or [] def get_color_choices(self): - return [(color['rgb'], color['name']) for color in self.available_colors] + return [(color["rgb"], color["name"]) for color in self.available_colors] def form_valid(self, form): - selected_rgb = form.cleaned_data['color'] + selected_rgb = form.cleaned_data["color"] selected_name = next( - (color['name'] for color in self.available_colors if color['rgb'] == selected_rgb), - None + ( + color["name"] + for color in self.available_colors + if color["rgb"] == selected_rgb + ), + None, ) if not selected_name: - messages.error(self.request, _('Invalid color selection.')) + messages.error(self.request, _("Invalid color selection.")) return self.form_invalid(form) # Assign the car and selected color details @@ -490,26 +548,26 @@ class CarColorCreateView(LoginRequiredMixin, CreateView): form.instance.rgb = selected_rgb form.instance.name = selected_name form.instance.arabic_name = translate(selected_name) - form.instance.color_type = form.cleaned_data['color_type'] + form.instance.color_type = form.cleaned_data["color_type"] - messages.success(self.request, _('Color added successfully.')) + messages.success(self.request, _("Color added successfully.")) return super().form_valid(form) def get_success_url(self): - return reverse('car_detail', kwargs={'pk': self.car.pk}) + return reverse("car_detail", kwargs={"pk": self.car.pk}) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['car'] = self.car + context["car"] = self.car return context class CarColorUpdateView(LoginRequiredMixin, UpdateView): model = forms.CarColors - template_name = 'inventory/color_palette.html' + template_name = "inventory/color_palette.html" def dispatch(self, request, *args, **kwargs): - self.car = get_object_or_404(models.Car, pk=self.kwargs['car_pk']) + self.car = get_object_or_404(models.Car, pk=self.kwargs["car_pk"]) self.available_colors = self.fetch_available_colors() return super().dispatch(request, *args, **kwargs) @@ -517,50 +575,55 @@ class CarColorUpdateView(LoginRequiredMixin, UpdateView): class ColorPickerForm(ModelForm): color = ChoiceField( choices=self.get_color_choices(), - widget=RadioSelect(attrs={'class': 'color-picker'}), + widget=RadioSelect(attrs={"class": "color-picker"}), label=_("Select a Color"), ) class Meta: model = forms.CarColors - fields = ['color'] + fields = ["color"] + return ColorPickerForm def fetch_available_colors(self): car_data = { - 'make': self.car.id_car_make.name, - 'model': self.car.id_car_model.name, - 'year': str(self.car.year), + "make": self.car.id_car_make.name, + "model": self.car.id_car_model.name, + "year": str(self.car.year), } return fetch_colors(car_data) or [] def get_color_choices(self): - return [(color['rgb'], color['name']) for color in self.available_colors] + return [(color["rgb"], color["name"]) for color in self.available_colors] def form_valid(self, form): - selected_rgb = form.cleaned_data['color'] + selected_rgb = form.cleaned_data["color"] selected_name = next( - (color['name'] for color in self.available_colors if color['rgb'] == selected_rgb), - None + ( + color["name"] + for color in self.available_colors + if color["rgb"] == selected_rgb + ), + None, ) if not selected_name: - messages.error(self.request, _('Invalid color selection.')) + messages.error(self.request, _("Invalid color selection.")) return self.form_invalid(form) form.instance.rgb = selected_rgb form.instance.name = selected_name form.instance.arabic_name = translate(selected_name) - messages.success(self.request, _('Exterior color updated successfully.')) + messages.success(self.request, _("Exterior color updated successfully.")) return super().form_valid(form) def get_success_url(self): - return reverse('car_detail', kwargs={'pk': self.car.pk}) + return reverse("car_detail", kwargs={"pk": self.car.pk}) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['car'] = self.car + context["car"] = self.car return context @@ -570,26 +633,28 @@ def reserve_car_view(request, car_id): car = get_object_or_404(models.Car, pk=car_id) if car.is_reserved(): messages.error(request, _("This car is already reserved.")) - return redirect('car_detail', pk=car.pk) + return redirect("car_detail", pk=car.pk) try: reserved_until = timezone.now() + timezone.timedelta(hours=24) models.CarReservation.objects.create( - car=car, - reserved_by=request.user, - reserved_until=reserved_until + car=car, reserved_by=request.user, reserved_until=reserved_until ) messages.success(request, _("Car reserved successfully.")) except Exception as e: messages.error(request, f"Error reserving car: {e}") - return redirect('car_detail', pk=car.pk) - return JsonResponse({"success": False, "message": "Invalid request method."}, status=400) + return redirect("car_detail", pk=car.pk) + return JsonResponse( + {"success": False, "message": "Invalid request method."}, status=400 + ) @login_required def manage_reservation(request, reservation_id): - reservation = get_object_or_404(models.CarReservation, pk=reservation_id, reserved_by=request.user) + reservation = get_object_or_404( + models.CarReservation, pk=reservation_id, reserved_by=request.user + ) if request.method == "POST": action = request.POST.get("action") @@ -597,105 +662,109 @@ def manage_reservation(request, reservation_id): reservation.reserved_until = timezone.now() + timezone.timedelta(hours=24) reservation.save() messages.success(request, _("Reservation renewed successfully.")) - return redirect('car_detail', pk=reservation.car.pk) + return redirect("car_detail", pk=reservation.car.pk) elif action == "cancel": reservation.delete() messages.success(request, _("Reservation canceled successfully.")) - return redirect('car_detail', pk=reservation.car.pk) + return redirect("car_detail", pk=reservation.car.pk) else: - return JsonResponse({"success": False, "message": _("Invalid action.")}, status=400) + return JsonResponse( + {"success": False, "message": _("Invalid action.")}, status=400 + ) - return JsonResponse({"success": False, "message": _("Invalid request method.")}, status=400) + return JsonResponse( + {"success": False, "message": _("Invalid request method.")}, status=400 + ) class DealerListView(LoginRequiredMixin, ListView): model = models.Dealer - template_name = 'dealer_list.html' - context_object_name = 'dealers' + template_name = "dealer_list.html" + context_object_name = "dealers" class DealerDetailView(LoginRequiredMixin, DetailView): model = models.Dealer - template_name = 'dealers/dealer_detail.html' - context_object_name = 'dealer' + template_name = "dealers/dealer_detail.html" + context_object_name = "dealer" class DealerCreateView(LoginRequiredMixin, CreateView): model = models.Dealer form_class = forms.DealerForm - template_name = 'dealer_form.html' - success_url = reverse_lazy('dealer_list') + template_name = "dealer_form.html" + success_url = reverse_lazy("dealer_list") def form_valid(self, form): - messages.success(self.request, _('Dealer created successfully.')) + messages.success(self.request, _("Dealer created successfully.")) return super().form_valid(form) class DealerUpdateView(LoginRequiredMixin, UpdateView): model = models.Dealer form_class = forms.DealerForm - template_name = 'dealers/dealer_form.html' - success_url = reverse_lazy('dealer_detail') + template_name = "dealers/dealer_form.html" + success_url = reverse_lazy("dealer_detail") def form_valid(self, form): - messages.success(self.request, _('Dealer updated successfully.')) + messages.success(self.request, _("Dealer updated successfully.")) return super().form_valid(form) class DealerDeleteView(LoginRequiredMixin, DeleteView): model = models.Dealer - template_name = 'dealer_confirm_delete.html' - success_url = reverse_lazy('dealer_list') + template_name = "dealer_confirm_delete.html" + success_url = reverse_lazy("dealer_list") def delete(self, request, *args, **kwargs): - messages.success(request, _('Dealer deleted successfully.')) + messages.success(request, _("Dealer deleted successfully.")) return super().delete(request, *args, **kwargs) class CustomerListView(LoginRequiredMixin, ListView): model = models.Customer - home_label = _('customers') - context_object_name = 'customers' + home_label = _("customers") + context_object_name = "customers" paginate_by = 10 template_name = "customers/customer_list.html" def get_queryset(self): - query = self.request.GET.get('q') + query = self.request.GET.get("q") customers = models.Customer.objects.filter(dealer__user=self.request.user) if query: customers = customers.filter( - Q(national_id__icontains=query) | - Q(first_name__icontains=query) | - Q(last_name__icontains=query) + Q(national_id__icontains=query) + | Q(first_name__icontains=query) + | Q(last_name__icontains=query) ) return customers def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['query'] = self.request.GET.get('q', '') + context["query"] = self.request.GET.get("q", "") return context class CustomerDetailView(LoginRequiredMixin, DetailView): model = models.Customer - template_name = 'customers/view_customer.html' - context_object_name = 'customer' + template_name = "customers/view_customer.html" + context_object_name = "customer" class CustomerCreateView(LoginRequiredMixin, CreateView): model = models.Customer form_class = forms.CustomerForm - template_name = 'customers/customer_form.html' - success_url = reverse_lazy('customer_list') + template_name = "customers/customer_form.html" + success_url = reverse_lazy("customer_list") def form_valid(self, form): if form.is_valid(): form.instance.dealer = self.request.user.dealer form.save() - messages.success(self.request, _('Customer created successfully.')) + messages.success(self.request, _("Customer created successfully.")) return super().form_valid(form) else: return form.errors @@ -704,14 +773,14 @@ class CustomerCreateView(LoginRequiredMixin, CreateView): class CustomerUpdateView(LoginRequiredMixin, UpdateView): model = models.Customer form_class = forms.CustomerForm - template_name = 'customers/customer_form.html' - success_url = reverse_lazy('customer_list') + template_name = "customers/customer_form.html" + success_url = reverse_lazy("customer_list") def form_valid(self, form): if form.is_valid(): form.instance.dealer = self.request.user.dealer form.save() - messages.success(self.request, _('Customer updated successfully.')) + messages.success(self.request, _("Customer updated successfully.")) return super().form_valid(form) else: return form.errors @@ -721,6 +790,7 @@ class CustomerUpdateView(LoginRequiredMixin, UpdateView): def delete_customer(request, pk): customer = get_object_or_404(models.Customer, pk=pk) customer.delete() +<<<<<<< HEAD messages.success(request, _('Customer deleted successfully.')) return redirect('customer_list') @@ -778,3 +848,7 @@ def delete_vendor(request, pk): +======= + messages.success(request, _("Customer deleted successfully.")) + return redirect("customer_list") +>>>>>>> c96865f (add search to select fields, redirect logged in user to landingpage if they are authenticated) diff --git a/requirements.txt b/requirements.txt index 098b8973..878ed7a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ dill==0.3.9 distro==1.9.0 dj-rest-auth==7.0.0 dj-shop-cart==7.1.1 -Django==5.1.4 +Django django-allauth==65.3.0 django-autoslug==1.9.9 django-bootstrap5==24.3 @@ -74,7 +74,6 @@ platformdirs==4.3.6 prometheus_client==0.21.1 psycopg==3.2.3 psycopg-binary==3.2.3 -psycopg-c==3.2.3 py-moneyed==3.0 pycodestyle==2.12.1 pycparser==2.22 diff --git a/static/images/logos/users/MainAfter.jpg b/static/images/logos/users/MainAfter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..632e369fa39c002c0eb0f96dac18b22be08cf418 GIT binary patch literal 86771 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

dk)cy{#ze8@1Fs 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�p# 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 + + + - + + +