From a2ffd67e755fa02c52b05a90b898ab7b6626f638 Mon Sep 17 00:00:00 2001 From: gitea Date: Tue, 11 Feb 2025 12:16:11 +0000 Subject: [PATCH] add filter in car list --- inventory/urls.py | 6 + inventory/views.py | 51 +++- scripts/run.py | 22 +- templates/inventory/car_list_view.html | 67 ++++- templates/sales/estimates/estimate_form.html | 2 +- templates/sales/sales_list.html | 242 +++++++++++++++++++ 6 files changed, 371 insertions(+), 19 deletions(-) create mode 100644 templates/sales/sales_list.html diff --git a/inventory/urls.py b/inventory/urls.py index f8ad51c2..33b34d14 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -251,6 +251,12 @@ urlpatterns = [ views.CarRegistrationCreateView.as_view(), name='add_registration'), +#sales list + path( + 'sales/list/', + views.sales_list_view, + name='sales_list', + ), # Sales URLs quotation_create # path( # "sales/quotations/create/", diff --git a/inventory/views.py b/inventory/views.py index 8fb665d3..c6c7cf92 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -645,17 +645,50 @@ class CarListView(LoginRequiredMixin, ListView): 'sold':cars.filter(status='sold').count(), 'transfer':cars.filter(status='transfer').count() } + context['make'] = models.CarMake.objects.all() + context['model'] = models.CarModel.objects.none() + context['year'] = models.Car.objects.none() + + make = self.request.GET.get('make') + model = self.request.GET.get('model') + + if make: + make_ = models.CarMake.objects.get(pk=int(make)) + context['model'] = make_.carmodel_set.all() + if make and model: + make_ = models.CarMake.objects.get(id_car_make=int(make)) + model_ = models.CarModel.objects.get(id_car_model=int(model)) + context['year'] = models.Car.objects.filter(id_car_make=make_,id_car_model=model_).values_list('year').distinct() + + return context def get_queryset(self): qs = super().get_queryset() status = self.request.GET.get('status') search = self.request.GET.get('search') - print(status) + make = self.request.GET.get('make',None) + model = self.request.GET.get('model',None) + year = self.request.GET.get('year',None) + car_status = self.request.GET.get('car_status',None) + if status: qs=qs.filter(status=status) if search: query = Q(vin__icontains=search)|Q(id_car_make__name__icontains=search)|Q(id_car_model__name__icontains=search)|Q(id_car_trim__name__icontains=search)|Q(vin=search) qs=qs.filter(query) + if any([make, model, year, car_status]): + query = Q() + if make: + query &= Q(id_car_make=int(make)) + if model: + query &= Q(id_car_model=model) + if year: + query &= Q(year=year) + if car_status: + query &= Q(status=car_status) + # else: + # query &= Q(status="available") + qs = qs.filter(query) return qs @login_required @@ -2313,6 +2346,13 @@ def account_delete(request, pk): return redirect("account_list") +# Sales list +def sales_list_view(request): + items = ItemModel.objects.all() + context = { + "items":items + } + return render(request, "sales/sales_list.html",context) # Estimates class EstimateListView(LoginRequiredMixin, ListView): @@ -2494,8 +2534,8 @@ def create_estimate(request): entity_slug=entity.slug, user_model=entity.admin ) form.fields["customer"].queryset = entity.get_customers().filter(active=True) - car_list = models.Car.objects.filter(dealer=dealer).exclude(status="reserved").annotate(color=F('colors__exterior__name')).values_list( - 'id_car_make__name', 'id_car_model__name','id_car_serie__name','id_car_trim__name','color','hash').distinct() + car_list = models.Car.objects.filter(dealer=dealer).exclude(status="reserved").annotate(color=F('colors__exterior__rgb'),color_name=F('colors__exterior__name')).values_list( + 'id_car_make__name', 'id_car_model__name','id_car_serie__name','id_car_trim__name','color','color_name','hash').distinct() context = { "form": form, "items": [ @@ -2505,7 +2545,8 @@ def create_estimate(request): 'serie':x[2], 'trim':x[3], 'color':x[4], - 'hash': x[5] + 'color_name':x[5], + 'hash': x[6] } for x in car_list ], @@ -4112,3 +4153,5 @@ class PnLAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): 'message': 'Unauthorized' }, status=401) + + diff --git a/scripts/run.py b/scripts/run.py index aeb1622e..8a642de8 100644 --- a/scripts/run.py +++ b/scripts/run.py @@ -72,10 +72,10 @@ def run(): # phone="123-456-7890", # address="123 Main St", # ) - dealer = Dealer.objects.get(user__email="ismail.mosa.ibrahim@gmail.com") - entity = dealer.entity + # dealer = Dealer.objects.get(user__email="ismail.mosa.ibrahim@gmail.com") + # entity = dealer.entity - car_list = Car.objects.filter(dealer=dealer).all() + # car_list = Car.objects.filter(dealer=dealer).all() # context = { # "items": [ # { @@ -88,9 +88,15 @@ def run(): # ], # } - for i in car_list: - hash_object = hashlib.sha256() - hash_object.update(f"{i.id_car_make.name}{i.id_car_model.name}".encode('utf-8')) - print(hash_object.hexdigest() , i.id_car_make.name, i.id_car_model.name) + # for i in car_list: + # hash_object = hashlib.sha256() + # hash_object.update(f"{i.id_car_make.name}{i.id_car_model.name}".encode('utf-8')) + # print(hash_object.hexdigest() , i.id_car_make.name, i.id_car_model.name) - \ No newline at end of file + + items = ItemModel.objects.all() + for item in items: + pass + # info = item.additional_info["car_info"] + # finance = item.additional_info["car_finance"] + # print({"vin":info["make"],"mode":info["model"],"year":info["year"],"trim":info["trim"],"mileage":info["mileage"],"cost_price":finance["cost_price"],"selling_price":finance["selling_price"]}) \ No newline at end of file diff --git a/templates/inventory/car_list_view.html b/templates/inventory/car_list_view.html index a6dea168..71b14b1e 100644 --- a/templates/inventory/car_list_view.html +++ b/templates/inventory/car_list_view.html @@ -38,6 +38,7 @@ +
@@ -50,7 +51,7 @@ hx-on::after-request="on_after_request()" /> - +
@@ -72,11 +73,48 @@ +
+ + + + + +
+
-
{% if page_obj.has_previous %} @@ -88,7 +126,7 @@ {% endif %}
- +
@@ -145,12 +183,12 @@ {% endfor %}
Make
-
+
-
{% if page_obj.has_previous %} @@ -163,6 +201,7 @@
+ {% endblock %} @@ -178,10 +217,26 @@ }) }) function on_before_request() { - document.querySelector('.table').classList.add('on-before-request') + document.querySelector('.table').classList.toggle('on-before-request') + document.querySelector('.model-select').classList.add('on-after-request') } function on_after_request() { document.querySelector('.table').classList.remove('on-before-request') + document.querySelector('.model-select').classList.remove('on-after-request') } + function toggle_filter(){ + document.querySelector('.filter').classList.toggle('d-none') + } + function filter_before_request(){ + document.querySelector('.model-select').setAttribute('disabled', true) + document.querySelector('.year').setAttribute('disabled', true) + document.querySelector('.car_status').setAttribute('disabled', true) + } + function filter_after_request(){ + document.querySelector('.model-select').removeAttribute('disabled') + document.querySelector('.year').removeAttribute('disabled') + document.querySelector('.car_status').removeAttribute('disabled') + } + {% endblock customJS %} \ No newline at end of file diff --git a/templates/sales/estimates/estimate_form.html b/templates/sales/estimates/estimate_form.html index 185ff353..c1df603d 100644 --- a/templates/sales/estimates/estimate_form.html +++ b/templates/sales/estimates/estimate_form.html @@ -18,7 +18,7 @@
diff --git a/templates/sales/sales_list.html b/templates/sales/sales_list.html new file mode 100644 index 00000000..71b14b1e --- /dev/null +++ b/templates/sales/sales_list.html @@ -0,0 +1,242 @@ +{% extends "base.html" %} +{% load i18n %} +{% load custom_filters %} + +{% block customCSS %} + +{% endblock customCSS %} + +{% block content %} +
+
+ +
+ + + + + +
+ +
+
+
+
+
+ {% if page_obj.has_previous %} + + {% endif %} +
    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
+ {% if page_obj.has_next %} + + {% endif %} +
+
+ + + + + + + + + + + + + + + + {% for car in cars %} + + + + + + + + + + + + {% endfor %} + +
MakeModelYearTrimVINReceiving DateSTATUS
{{car.id_car_make}} +

{{car.id_car_model}}

+
+

{{car.year}}

+
+

{{car.id_car_trim}}

+
+

{{car.vin}}

+
+

{{car.receiving_date}}

+
+ {% if car.status == "available" %} + {{car.status}} + {% elif car.status == "reserved" %} + {{car.status}} + {% elif car.status == "sold" %} + {{car.status}} + {% elif car.status == "transfer" %} + {{car.status}} + {% endif %} + +
+ + +
+
+ +
+ +
+ {% if page_obj.has_previous %} + + {% endif %} +
    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
+ {% if page_obj.has_next %} + + {% endif %} +
+
+
+
+
+{% endblock %} + +{% block customJS %} + +{% endblock customJS %} \ No newline at end of file