only show relevant filters on partner listing
This commit is contained in:
parent
b11fa2c21b
commit
66c5d1f8c2
2 changed files with 59 additions and 41 deletions
|
@ -85,7 +85,7 @@
|
||||||
<div>
|
<div>
|
||||||
<select class="form-select" id="service" name="service" @change="submitForm()">
|
<select class="form-select" id="service" name="service" @change="submitForm()">
|
||||||
<option value="">All Services</option>
|
<option value="">All Services</option>
|
||||||
{% for service in services %}
|
{% for service in available_services %}
|
||||||
<option value="{{ service.id }}" {% if request.GET.service == service.id|stringformat:'i' %}selected{% endif %}>
|
<option value="{{ service.id }}" {% if request.GET.service == service.id|stringformat:'i' %}selected{% endif %}>
|
||||||
{{ service.name }}
|
{{ service.name }}
|
||||||
</option>
|
</option>
|
||||||
|
@ -94,23 +94,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Cloud Provider Filter -->
|
|
||||||
<div class="pt-24 mb-24">
|
|
||||||
<div class="d-flex justify-content-between align-items-center h-33 mb-5px" role="button">
|
|
||||||
<h3 class="sidebar-title mb-0">Cloud Provider</h3>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<select class="form-select" id="cloud_provider" name="cloud_provider" @change="submitForm()">
|
|
||||||
<option value="">All Providers</option>
|
|
||||||
{% for provider in cloud_providers %}
|
|
||||||
<option value="{{ provider.id }}" {% if request.GET.cloud_provider == provider.id|stringformat:'i' %}selected{% endif %}>
|
|
||||||
{{ provider.name }}
|
|
||||||
</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Filter Actions -->
|
<!-- Filter Actions -->
|
||||||
<div class="d-flex gap-2">
|
<div class="d-flex gap-2">
|
||||||
<a href="{% url 'services:partner_list' %}" class="btn btn-outline-secondary btn-sm">Clear</a>
|
<a href="{% url 'services:partner_list' %}" class="btn btn-outline-secondary btn-sm">Clear</a>
|
||||||
|
|
|
@ -4,35 +4,70 @@ from hub.services.models import ConsultingPartner, CloudProvider, Service
|
||||||
|
|
||||||
|
|
||||||
def partner_list(request):
|
def partner_list(request):
|
||||||
partners = (
|
# Get basic filter parameters
|
||||||
ConsultingPartner.objects.filter(disable_listing=False)
|
search_query = request.GET.get("search", "")
|
||||||
.order_by("name")
|
service_id = request.GET.get("service", "")
|
||||||
.prefetch_related("services", "cloud_providers")
|
cloud_provider_id = request.GET.get("cloud_provider", "")
|
||||||
|
|
||||||
|
# Start with all active partners
|
||||||
|
partners = ConsultingPartner.objects.filter(disable_listing=False).order_by("name")
|
||||||
|
|
||||||
|
# Apply filters based on request parameters
|
||||||
|
if search_query:
|
||||||
|
partners = partners.filter(
|
||||||
|
Q(name__icontains=search_query) | Q(description__icontains=search_query)
|
||||||
)
|
)
|
||||||
|
|
||||||
services = Service.objects.all().order_by("name")
|
if service_id:
|
||||||
|
|
||||||
# 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)
|
partners = partners.filter(services__id=service_id)
|
||||||
|
|
||||||
# Handle search
|
if cloud_provider_id:
|
||||||
if request.GET.get("search"):
|
partners = partners.filter(cloud_providers__id=cloud_provider_id)
|
||||||
query = request.GET.get("search")
|
|
||||||
partners = partners.filter(
|
# Get available services from filtered partners
|
||||||
Q(name__icontains=query) | Q(description__icontains=query)
|
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 = {
|
context = {
|
||||||
"partners": partners,
|
"partners": partners.prefetch_related("services", "cloud_providers"),
|
||||||
"services": services,
|
"services": Service.objects.filter(disable_listing=False).order_by("name"),
|
||||||
"cloud_providers": CloudProvider.objects.all(),
|
"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)
|
return render(request, "services/partner_list.html", context)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue