from django.db.models import Q from django.db.models.functions import TruncDate from apps.product.models import Quota class QuotaSearch: def __init__(self, query: str = None, start_date: str = None, end_date: str = None): self.query = (query or '').strip() self.start_date = start_date self.end_date = end_date def search(self): """ multi term search & filter by date range """ queryset = QuotaDistribution.objects.all() # noqa if self.start_date or self.end_date: queryset = queryset.annotate(date_only=TruncDate('create_date')) if self.start_date: queryset = queryset.filter(date_only__gte=self.start_date) if self.end_date: queryset = queryset.filter(date_only__lte=self.end_date) # convert string to list of words if self.query: keywords = [word.strip() for word in self.query.split(',') if word.strip()] if keywords: combined_q = Q() for keyword in keywords: combined_q |= Q(registerer_organization__name__icontains=keyword) combined_q |= Q(quota_id__icontains=keyword) combined_q |= Q(product__name__icontains=keyword) combined_q |= Q(sale_type__icontains=keyword) combined_q |= Q(sale_unit__unit__icontains=keyword) combined_q |= Q(group__icontains=keyword) queryset = queryset.filter(combined_q) return queryset.distinct()