diff --git a/inventory/signals.py b/inventory/signals.py index 42ba6859..cfa64cc6 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -937,7 +937,7 @@ def po_fullfilled_notification(sender, instance, created, **kwargs): @receiver(post_save, sender=models.Vendor) def vendor_created_notification(sender, instance, created, **kwargs): if created: - recipients = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Inventory").first().group.user_set.excludeall() + recipients = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Inventory").first().group.user_set.all() for recipient in recipients: models.Notification.objects.create( diff --git a/inventory/views.py b/inventory/views.py index 6bfe13af..bc209dc1 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 @@ -2496,7 +2495,7 @@ class VendorCreateView( ) else: messages.error(self.request, _("Vendor with this email already exists")) - return redirect("vendor_create") + return redirect("vendor_create",dealer_slug=self.kwargs["dealer_slug"]) dealer = get_user_type(self.request) form.instance.dealer = dealer form.instance.save() @@ -8851,8 +8850,7 @@ def payment_callback(request,dealer_slug): return render(request, "payment_failed.html", {"message": message}) -def sse_stream(request): - print("hi") +def sse_stream(request): def event_stream(): last_id = request.GET.get("last_id", 0) while True: @@ -9386,6 +9384,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 %} -