diff --git a/inventory/models.py b/inventory/models.py index 4ba4b9bd..504eb873 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -2203,7 +2203,7 @@ class Vendor(models.Model, LocalizedNameMixin): ) def get_absolute_url(self): - return reverse("vendor_detail", kwargs={"dealer_slug":self.dealer.slug,"pk": self.pk}) + return reverse("vendor_detail", kwargs={"dealer_slug":self.dealer.slug,"slug": self.slug}) def save(self, *args, **kwargs): if not self.slug: diff --git a/inventory/signals.py b/inventory/signals.py index 2692d058..b4945e2d 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 b950896b..2b564dca 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 @@ -2495,7 +2494,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() @@ -9323,6 +9322,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 %} -