diff --git a/asset/filters.py b/asset/filters.py index 0991b711f..1a89bcea1 100644 --- a/asset/filters.py +++ b/asset/filters.py @@ -6,6 +6,7 @@ import uuid import django_filters from django import forms +from django.db.models import Q from django_filters import FilterSet from base.methods import reload_queryset @@ -239,18 +240,9 @@ class AssetCategoryFilter(CustomFilterSet): Custom filter set for AssetCategory instances. """ - search = django_filters.CharFilter(method="serach_method") + search = django_filters.CharFilter(method="search_method") class Meta: - """ - Specifies the model and fields to be used for filtering AssetCategory instances. - - Attributes: - model (class): The model class AssetCategory to be filtered. - fields (str): A special value "__all__" to include all fields - of the model in the filter. - """ - model = AssetCategory fields = "__all__" @@ -259,22 +251,33 @@ class AssetCategoryFilter(CustomFilterSet): for visible in self.form.visible_fields(): visible.field.widget.attrs["id"] = str(uuid.uuid4()) - def serach_method(self, queryset, _, value): + def search_method(self, queryset, name, value): """ - Search method + Search method to filter by asset category name or related asset name. """ - return ( - queryset.filter(asset_category_name__icontains=value) - | queryset.filter(asset__asset_name__icontains=value) + if not value: + return queryset # Return unfiltered queryset if no search term is provided + + return queryset.filter( + Q(asset_category_name__icontains=value) + | Q(asset__asset_name__icontains=value) ).distinct() def filter_queryset(self, queryset): + """ + Filters queryset and applies AssetFilter if necessary. + """ # Get the base filtered queryset queryset = super().filter_queryset(queryset) - assets = AssetFilter(data=self.data).qs - return ( - queryset.filter(asset__pk__in=assets.values_list("pk", flat=True)) - ).distinct() + + # Filter by assets if asset data is present in the GET request + if self.data and "asset__pk" in self.data: + assets = AssetFilter(data=self.data).qs + queryset = queryset.filter( + asset__pk__in=assets.values_list("pk", flat=True) + ) + + return queryset.distinct() class AssetRequestReGroup: diff --git a/asset/views.py b/asset/views.py index bdfdbe6bf..346007342 100644 --- a/asset/views.py +++ b/asset/views.py @@ -439,23 +439,33 @@ def delete_asset_category(request, cat_id): def filter_pagination_asset_category(request): """ - This view is used for pagination + This view is used for pagination and filtering asset categories """ - search = request.GET.get("search") - if search is None: - search = "" + search = request.GET.get("search", "") previous_data = request.GET.urlencode() - asset_category_filtered = AssetCategoryFilter( - request.GET, - ) - asset_category_queryset = asset_category_filtered.qs - asset_category_paginator = Paginator(asset_category_filtered.qs, get_pagination()) + asset_category_queryset = AssetCategory.objects.all() + + if request.GET: + asset_category_filtered = AssetCategoryFilter( + request.GET, queryset=asset_category_queryset + ) + asset_category_queryset = ( + asset_category_filtered.qs + ) # Filter the queryset based on the GET params + asset_category_filtered_form = asset_category_filtered.form # Show filter form + else: + asset_category_filtered_form = None + + # Pagination + asset_category_paginator = Paginator(asset_category_queryset, get_pagination()) page_number = request.GET.get("page") asset_categories = asset_category_paginator.get_page(page_number) + data_dict = parse_qs(previous_data) get_key_instances(AssetCategory, data_dict) + asset_creation_form = AssetForm() if data_dict.get("type"): del data_dict["type"] @@ -465,7 +475,7 @@ def filter_pagination_asset_category(request): "asset_creation_form": asset_creation_form, "asset_category_form": asset_category_form, "asset_categories": asset_categories, - "asset_category_filter_form": asset_category_filtered.form, + "asset_category_filter_form": asset_category_filtered_form, "asset_filter_form": asset_filter_form.form, "pg": previous_data, "filter_dict": data_dict,