diff --git a/inventory/forms.py b/inventory/forms.py index 31328ab2..84278207 100644 --- a/inventory/forms.py +++ b/inventory/forms.py @@ -1273,6 +1273,17 @@ class OpportunityForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + print(kwargs) + dealer = kwargs.pop('dealer', None) + print(dealer) + + # Apply filtering if a dealer is provided + if dealer: + # Assuming Car model has an 'entity' ForeignKey and Dealer has an 'entity' attribute + self.fields['car'].queryset = Car.objects.filter(entity=dealer.entity) + + # Assuming Lead model has an 'entity' ForeignKey and Dealer has an 'entity' attribute + self.fields['lead'].queryset = Lead.objects.filter(entity=dealer.entity) # Add a visible number input to display the current value self.fields["probability"].widget.attrs["class"] = ( "d-none" # Hide the default input diff --git a/inventory/views.py b/inventory/views.py index fe5dd7b3..b3db18dc 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -8,7 +8,6 @@ import logging import tempfile import numpy as np from time import sleep - # from rich import print from random import randint from decimal import Decimal @@ -9324,6 +9323,74 @@ class PurchaseOrderListView(LoginRequiredMixin, PermissionRequiredMixin, ListVie dealer = get_user_type(self.request) entity = dealer.entity return self.model.objects.filter(entity=entity) + + def get_queryset(self): + dealer = get_user_type(self.request) + entity = dealer.entity + queryset = self.model.objects.filter(entity=entity) + + query = self.request.GET.get('q') # This is generic: looks for 'q' from GET + + if query: + # Start with an empty Q object for the search filters + search_filters = Q() + + # 1. Try to parse the query as a date + parsed_date = None + date_formats = [ + '%Y-%m-%d', # 2023-10-26 + '%m/%d/%Y', # 10/26/2023 + '%d-%m-%Y', # 26-10-2023 + '%B %d, %Y', # October 26, 2023 + '%b %d, %Y', # Oct 26, 2023 + '%Y/%m/%d', # 2023/10/26 + '%Y-%m', # 2023-10 (for year-month search) + '%Y', + '%b %d', + '%B %d' # 2023 (for year search) + ] + + for fmt in date_formats: + try: + # For '%Y-%m' and '%Y', we only care about year/month, not exact day + if fmt == '%Y-%m': + parsed_date = datetime.strptime(query, fmt) + search_filters |= Q(created__year=parsed_date.year, created__month=parsed_date.month) + break + elif fmt == '%Y': + parsed_date = datetime.strptime(query, fmt) + search_filters |= Q(created__year=parsed_date.year) + break + else: + parsed_date = datetime.strptime(query, fmt).date() + search_filters |= Q(created__date=parsed_date) # Matches exact date part of datetime field + break # Found a match, no need to try other formats + except ValueError: + continue # Try next format + + # 2. Add text-based search filters (always apply these) + # Combine them with OR operator + text_filters = ( + Q(po_number__icontains=query) | + Q(po_title__icontains=query) | + Q(po_status__icontains=query) | + Q(created__icontains=query) + + ) + + # If a date was successfully parsed, combine with text filters + if parsed_date: + # Use a combined Q object. This means it will search for + # (date_match OR po_number_match OR po_title_match) + queryset = queryset.filter(search_filters | text_filters).distinct() + else: + # If no date was parsed, only apply text filters + queryset = queryset.filter(text_filters).distinct() + + return queryset + + + def get_context_data(self, **kwargs): dealer = get_user_type(self.request) diff --git a/static/images/logos/users/pexels-marieke-schonfeld-1309710-2514035.jpg b/static/images/logos/users/pexels-marieke-schonfeld-1309710-2514035.jpg new file mode 100644 index 00000000..9c8f2f26 Binary files /dev/null and b/static/images/logos/users/pexels-marieke-schonfeld-1309710-2514035.jpg differ diff --git a/templates/crm/leads/lead_list.html b/templates/crm/leads/lead_list.html index 26debbd8..ec7c4c58 100644 --- a/templates/crm/leads/lead_list.html +++ b/templates/crm/leads/lead_list.html @@ -3,7 +3,7 @@ {% block title %}{{ _('Leads')|capfirst }}{% endblock title %} {% block content %} -