72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
from django.shortcuts import render, get_object_or_404
|
|
from django.db.models import Q
|
|
from django.db.models import Count
|
|
from hub.services.models import (
|
|
Service,
|
|
ServiceOffering,
|
|
CloudProvider,
|
|
)
|
|
|
|
|
|
def provider_list(request):
|
|
providers = (
|
|
CloudProvider.objects.filter(disable_listing=False)
|
|
.order_by("order")
|
|
.prefetch_related("offerings", "consulting_partners")
|
|
)
|
|
|
|
# Handle search
|
|
if request.GET.get("search"):
|
|
query = request.GET.get("search")
|
|
providers = providers.filter(
|
|
Q(name__icontains=query) | Q(description__icontains=query)
|
|
)
|
|
|
|
context = {
|
|
"providers": providers,
|
|
}
|
|
return render(request, "services/provider_list.html", context)
|
|
|
|
|
|
def provider_detail(request, slug):
|
|
provider = get_object_or_404(
|
|
CloudProvider.objects.prefetch_related(
|
|
"offerings",
|
|
"offerings__service",
|
|
"offerings__plans",
|
|
"consulting_partners",
|
|
),
|
|
slug=slug,
|
|
)
|
|
|
|
# Get all services offered by this provider through offerings
|
|
services = (
|
|
Service.objects.filter(
|
|
offerings__cloud_provider=provider, disable_listing=False
|
|
)
|
|
.distinct()
|
|
.prefetch_related("categories")
|
|
)
|
|
|
|
# Get the provider's offerings and sort them by service attributes and plan availability
|
|
# Exclude offerings with disabled services
|
|
ordered_offerings = (
|
|
ServiceOffering.objects.filter(
|
|
cloud_provider=provider, service__disable_listing=False
|
|
)
|
|
.select_related("service")
|
|
.annotate(has_plans=Count("plans"))
|
|
.order_by(
|
|
"-has_plans", # Offerings with plans first
|
|
"-service__is_featured", # Featured first (True before False)
|
|
"service__is_coming_soon", # Coming soon last (False before True)
|
|
"service__name", # Alphabetically within each group
|
|
)
|
|
)
|
|
|
|
context = {
|
|
"provider": provider,
|
|
"services": services,
|
|
"ordered_offerings": ordered_offerings,
|
|
}
|
|
return render(request, "services/provider_detail.html", context)
|