2025-01-30 09:49:27 +01:00
|
|
|
from django.shortcuts import render, get_object_or_404
|
|
|
|
from django.db.models import Q
|
2025-02-25 13:43:28 +01:00
|
|
|
from hub.services.models import ConsultingPartner, CloudProvider, Service
|
2025-01-30 09:49:27 +01:00
|
|
|
|
|
|
|
|
|
|
|
def partner_list(request):
|
2025-03-03 17:31:56 +01:00
|
|
|
# Get basic filter parameters
|
|
|
|
search_query = request.GET.get("search", "")
|
|
|
|
service_id = request.GET.get("service", "")
|
|
|
|
cloud_provider_id = request.GET.get("cloud_provider", "")
|
2025-01-30 09:49:27 +01:00
|
|
|
|
2025-03-03 17:31:56 +01:00
|
|
|
# Start with all active partners
|
|
|
|
partners = ConsultingPartner.objects.filter(disable_listing=False).order_by("name")
|
2025-02-25 13:43:28 +01:00
|
|
|
|
2025-03-03 17:31:56 +01:00
|
|
|
# Apply filters based on request parameters
|
|
|
|
if search_query:
|
|
|
|
partners = partners.filter(
|
|
|
|
Q(name__icontains=search_query) | Q(description__icontains=search_query)
|
|
|
|
)
|
2025-01-30 09:49:27 +01:00
|
|
|
|
2025-03-03 17:31:56 +01:00
|
|
|
if service_id:
|
2025-02-25 13:43:28 +01:00
|
|
|
partners = partners.filter(services__id=service_id)
|
|
|
|
|
2025-03-03 17:31:56 +01:00
|
|
|
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
|
2025-01-30 09:49:27 +01:00
|
|
|
|
|
|
|
context = {
|
2025-03-03 17:31:56 +01:00
|
|
|
"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,
|
2025-01-30 09:49:27 +01:00
|
|
|
}
|
|
|
|
return render(request, "services/partner_list.html", context)
|
|
|
|
|
|
|
|
|
|
|
|
def partner_detail(request, slug):
|
|
|
|
partner = get_object_or_404(
|
|
|
|
ConsultingPartner.objects.prefetch_related(
|
|
|
|
"services",
|
|
|
|
"services__categories",
|
|
|
|
"services__offerings",
|
|
|
|
"services__offerings__cloud_provider",
|
|
|
|
"cloud_providers",
|
|
|
|
),
|
|
|
|
slug=slug,
|
|
|
|
)
|
|
|
|
|
|
|
|
context = {
|
|
|
|
"partner": partner,
|
|
|
|
"services": partner.services.all(),
|
|
|
|
}
|
|
|
|
return render(request, "services/partner_detail.html", context)
|