Compare commits

..

No commits in common. "faa07a8b4d2c783056efccb3d5a84577bd406ae2" and "f2c867b52106889fd13466828d4831d8732117d6" have entirely different histories.

4 changed files with 75 additions and 113 deletions

View file

@ -142,7 +142,7 @@
{% endif %} {% endif %}
<!-- Plans --> <!-- Plans -->
<div class="pt-24" id="plans" style="scroll-margin-top: 30px;"> <div class="pt-24" id="plans" style="scroll-margin-top: 100px;">
<h3 class="fs-24 fw-semibold lh-1 mb-12">Available Plans</h3> <h3 class="fs-24 fw-semibold lh-1 mb-12">Available Plans</h3>
<div class="row"> <div class="row">
{% for plan in offering.plans.all %} {% for plan in offering.plans.all %}
@ -169,7 +169,7 @@
</div> </div>
</div> </div>
{% empty %} {% empty %}
<div class="col-12" id="interest" style="scroll-margin-top: 30px;"> <div class="col-12">
<div class="alert alert-info"> <div class="alert alert-info">
<p>No plans available yet.</p> <p>No plans available yet.</p>
<h4 class="mb-3">I'm interested in this offering</h4> <h4 class="mb-3">I'm interested in this offering</h4>

View file

@ -157,11 +157,6 @@
</a> </a>
</div> </div>
{% endif %} {% endif %}
{% if not offering.plans.all %}
<div>
<a class="btn btn-secondary btn-sm" href="">Coming Soon</a>
</div>
{% endif %}
</div> </div>
{% endif %} {% endif %}
<div class="card__content d-flex flex-column flex-grow-1"> <div class="card__content d-flex flex-column flex-grow-1">

View file

@ -155,19 +155,9 @@
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
{% if service.logo %} {% if service.logo %}
<div class="card__image flex-shrink-0"> <div class="card__image flex-shrink-0">
{% if request.GET.cloud_provider %} <a href="{{ service.get_absolute_url }}">
{% for offering in service.offerings.all %} <img src="{{ service.logo.url }}" alt="{{ service.name }} logo" class="img-fluid">
{% if offering.cloud_provider.id|stringformat:'i' == request.GET.cloud_provider %} </a>
<a href="{% url 'services:offering_detail' offering.cloud_provider.slug service.slug %}">
<img src="{{ service.logo.url }}" alt="{{ service.name }} logo" class="img-fluid">
</a>
{% endif %}
{% endfor %}
{% else %}
<a href="{{ service.get_absolute_url }}">
<img src="{{ service.logo.url }}" alt="{{ service.name }} logo" class="img-fluid">
</a>
{% endif %}
</div> </div>
{% endif %} {% endif %}
{% if service.is_featured %} {% if service.is_featured %}
@ -183,17 +173,7 @@
{% endif %} {% endif %}
<div class="card__content d-flex flex-column flex-grow-1"> <div class="card__content d-flex flex-column flex-grow-1">
<div class="card__header"> <div class="card__header">
<h3 class="card__title"> <h3 class="card__title"><a href="{{ service.get_absolute_url }}" class="text-decoration-none {% if service.is_coming_soon %}text-black-50{% endif %}">{{ service.name }}</a></h3>
{% if request.GET.cloud_provider %}
{% for offering in service.offerings.all %}
{% if offering.cloud_provider.id|stringformat:'i' == request.GET.cloud_provider %}
<a href="{% url 'services:offering_detail' offering.cloud_provider.slug service.slug %}" class="text-decoration-none {% if service.is_coming_soon %}text-black-50{% endif %}">{{ service.name }}</a>
{% endif %}
{% endfor %}
{% else %}
<a href="{{ service.get_absolute_url }}" class="text-decoration-none {% if service.is_coming_soon %}text-black-50{% endif %}">{{ service.name }}</a>
{% endif %}
</h3>
<p class="card__subtitle"> <p class="card__subtitle">
{% for category in service.categories.all %} {% for category in service.categories.all %}
<span>{{ category.full_path }}</span> <span>{{ category.full_path }}</span>

View file

@ -17,8 +17,7 @@ def service_list(request):
# Start with all active services # Start with all active services
# Filter out services with disable_listing=True # Filter out services with disable_listing=True
all_services = Service.objects.filter(disable_listing=False) services = Service.objects.filter(disable_listing=False)
services = all_services
# Apply filters based on request parameters # Apply filters based on request parameters
if search_query: if search_query:
@ -43,98 +42,86 @@ def service_list(request):
"name", # Alphabetically within each group "name", # Alphabetically within each group
) )
# Create base querysets for each filter type that apply all OTHER current filters # Get all available categories from filtered services
# This way, each filter shows options that would return results if selected available_category_ids = services.values_list(
"categories__id", flat=True
# For category filter options, apply all other filters except category
category_filter_base = all_services
if search_query:
category_filter_base = category_filter_base.filter(
Q(name__icontains=search_query) | Q(description__icontains=search_query)
)
if consulting_partner_id:
category_filter_base = category_filter_base.filter(
consulting_partners__id=consulting_partner_id
)
if cloud_provider_id:
category_filter_base = category_filter_base.filter(
offerings__cloud_provider__id=cloud_provider_id
)
# For consulting partner filter options, apply all other filters except consulting_partner
cp_filter_base = all_services
if search_query:
cp_filter_base = cp_filter_base.filter(
Q(name__icontains=search_query) | Q(description__icontains=search_query)
)
if category_id:
cp_filter_base = cp_filter_base.filter(categories__id=category_id)
if cloud_provider_id:
cp_filter_base = cp_filter_base.filter(
offerings__cloud_provider__id=cloud_provider_id
)
# For cloud provider filter options, apply all other filters except cloud_provider
cloud_filter_base = all_services
if search_query:
cloud_filter_base = cloud_filter_base.filter(
Q(name__icontains=search_query) | Q(description__icontains=search_query)
)
if category_id:
cloud_filter_base = cloud_filter_base.filter(categories__id=category_id)
if consulting_partner_id:
cloud_filter_base = cloud_filter_base.filter(
consulting_partners__id=consulting_partner_id
)
# Get available categories that would return results if selected
available_parent_categories = Category.objects.filter(
parent=None,
id__in=category_filter_base.values_list(
"categories__parent__id", flat=True
).distinct(),
).distinct()
# Add categories that are direct matches (not children)
direct_categories = Category.objects.filter(
parent=None,
id__in=category_filter_base.values_list("categories__id", flat=True).distinct(),
).distinct()
available_parent_categories = (
available_parent_categories | direct_categories
).distinct() ).distinct()
available_categories = Category.objects.filter(
id__in=available_category_ids, parent=None
)
# For each parent category, get available children # For each parent category, get available children
for parent_category in available_parent_categories: for category in available_categories:
parent_category.available_children = Category.objects.filter( child_ids = (
parent=parent_category, services.filter(categories__parent=category)
id__in=category_filter_base.values_list( .values_list("categories__id", flat=True)
"categories__id", flat=True .distinct()
).distinct(), )
).distinct() category.available_children = Category.objects.filter(id__in=child_ids)
# Get available consulting partners and cloud providers that would return results if selected # Get available consulting partners from filtered services
# Excluding partners with disable_listing=True
available_consulting_partner_ids = services.values_list(
"consulting_partners__id", flat=True
).distinct()
available_consulting_partners = ConsultingPartner.objects.filter( available_consulting_partners = ConsultingPartner.objects.filter(
disable_listing=False, id__in=available_consulting_partner_ids, disable_listing=False
id__in=cp_filter_base.values_list( )
"consulting_partners__id", flat=True
).distinct(),
).distinct()
available_cloud_providers = CloudProvider.objects.filter( # Get available cloud providers from filtered services via offerings
disable_listing=False, # Excluding providers with disable_listing=True
id__in=cloud_filter_base.values_list( available_cloud_provider_ids = services.values_list(
"offerings__cloud_provider__id", flat=True "offerings__cloud_provider__id", flat=True
).distinct(),
).distinct() ).distinct()
available_cloud_providers = CloudProvider.objects.filter(
id__in=available_cloud_provider_ids, disable_listing=False
)
# For the current selection, we need to make sure we include the selected items
# even if they don't match other filters
if category_id:
try:
selected_category = Category.objects.get(id=category_id)
if selected_category.parent:
parent_category = selected_category.parent
if parent_category not in available_categories:
available_categories = list(available_categories)
available_categories.append(parent_category)
parent_category.available_children = [selected_category]
elif selected_category not in available_categories:
available_categories = list(available_categories)
available_categories.append(selected_category)
except Category.DoesNotExist:
pass
if consulting_partner_id:
try:
cp_id = int(consulting_partner_id)
if cp_id not in available_consulting_partner_ids:
selected_partner = ConsultingPartner.objects.get(id=cp_id)
available_consulting_partners = list(available_consulting_partners)
available_consulting_partners.append(selected_partner)
except (ValueError, ConsultingPartner.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 = {
"services": services, "services": services,
"available_categories": available_parent_categories, "categories": Category.objects.filter(parent=None),
"consulting_partners": ConsultingPartner.objects.filter(disable_listing=False),
"cloud_providers": CloudProvider.objects.filter(disable_listing=False),
"available_categories": available_categories,
"available_consulting_partners": available_consulting_partners, "available_consulting_partners": available_consulting_partners,
"available_cloud_providers": available_cloud_providers, "available_cloud_providers": available_cloud_providers,
"search_query": search_query,
} }
return render(request, "services/service_list.html", context) return render(request, "services/service_list.html", context)