only show relevant filters on partner listing

This commit is contained in:
Tobias Brunner 2025-03-03 17:31:56 +01:00
parent b11fa2c21b
commit 66c5d1f8c2
No known key found for this signature in database
2 changed files with 59 additions and 41 deletions

View file

@ -4,35 +4,70 @@ from hub.services.models import ConsultingPartner, CloudProvider, Service
def partner_list(request):
partners = (
ConsultingPartner.objects.filter(disable_listing=False)
.order_by("name")
.prefetch_related("services", "cloud_providers")
)
# Get basic filter parameters
search_query = request.GET.get("search", "")
service_id = request.GET.get("service", "")
cloud_provider_id = request.GET.get("cloud_provider", "")
services = Service.objects.all().order_by("name")
# Start with all active partners
partners = ConsultingPartner.objects.filter(disable_listing=False).order_by("name")
# Handle cloud provider filter
if request.GET.get("cloud_provider"):
provider_id = request.GET.get("cloud_provider")
partners = partners.filter(cloud_providers__id=provider_id)
# Handle service filter
if request.GET.get("service"):
service_id = request.GET.get("service")
partners = partners.filter(services__id=service_id)
# Handle search
if request.GET.get("search"):
query = request.GET.get("search")
# Apply filters based on request parameters
if search_query:
partners = partners.filter(
Q(name__icontains=query) | Q(description__icontains=query)
Q(name__icontains=search_query) | Q(description__icontains=search_query)
)
if service_id:
partners = partners.filter(services__id=service_id)
if cloud_provider_id:
partners = partners.filter(cloud_providers__id=cloud_provider_id)
# Get available services from filtered partners
available_service_ids = partners.values_list("services__id", flat=True).distinct()
available_services = Service.objects.filter(
id__in=available_service_ids, disable_listing=False
).order_by("name")
# Get available cloud providers from filtered partners
available_cloud_provider_ids = partners.values_list(
"cloud_providers__id", flat=True
).distinct()
available_cloud_providers = CloudProvider.objects.filter(
id__in=available_cloud_provider_ids, disable_listing=False
).order_by("name")
# For the current selection, we need to make sure we include the selected items
# even if they don't match other filters
if service_id:
try:
selected_service_id = int(service_id)
if selected_service_id not in available_service_ids:
selected_service = Service.objects.get(id=selected_service_id)
available_services = list(available_services)
available_services.append(selected_service)
except (ValueError, Service.DoesNotExist):
pass
if cloud_provider_id:
try:
cp_id = int(cloud_provider_id)
if cp_id not in available_cloud_provider_ids:
selected_provider = CloudProvider.objects.get(id=cp_id)
available_cloud_providers = list(available_cloud_providers)
available_cloud_providers.append(selected_provider)
except (ValueError, CloudProvider.DoesNotExist):
pass
context = {
"partners": partners,
"services": services,
"cloud_providers": CloudProvider.objects.all(),
"partners": partners.prefetch_related("services", "cloud_providers"),
"services": Service.objects.filter(disable_listing=False).order_by("name"),
"cloud_providers": CloudProvider.objects.filter(disable_listing=False).order_by(
"name"
),
"available_services": available_services,
"available_cloud_providers": available_cloud_providers,
}
return render(request, "services/partner_list.html", context)