filtering in price list

This commit is contained in:
Tobias Brunner 2025-05-26 15:36:20 +02:00
parent 57fd001246
commit 7989d4e553
No known key found for this signature in database
2 changed files with 152 additions and 2 deletions

View file

@ -14,8 +14,12 @@ def natural_sort_key(name):
@staff_member_required
def pricelist(request):
"""Generate comprehensive price list grouped by compute plan groups and service levels"""
# Check if discount details should be shown
# Get filter parameters from request
show_discount_details = request.GET.get("discount_details", "").lower() == "true"
filter_cloud_provider = request.GET.get("cloud_provider", "")
filter_service = request.GET.get("service", "")
filter_compute_plan_group = request.GET.get("compute_plan_group", "")
filter_service_level = request.GET.get("service_level", "")
# Fetch all active compute plans with related data
compute_plans = (
@ -25,6 +29,15 @@ def pricelist(request):
.order_by("group__order", "group__name", "cloud_provider__name")
)
# Apply compute plan filters
if filter_cloud_provider:
compute_plans = compute_plans.filter(cloud_provider__name=filter_cloud_provider)
if filter_compute_plan_group:
if filter_compute_plan_group == "No Group":
compute_plans = compute_plans.filter(group__isnull=True)
else:
compute_plans = compute_plans.filter(group__name=filter_compute_plan_group)
# Apply natural sorting for compute plan names
compute_plans = sorted(
compute_plans,
@ -44,6 +57,10 @@ def pricelist(request):
.order_by("service__name")
)
# Apply service filter
if filter_service:
appcat_prices = appcat_prices.filter(service__name=filter_service)
pricing_data_by_group_and_service_level = defaultdict(lambda: defaultdict(list))
processed_combinations = set()
@ -68,6 +85,15 @@ def pricelist(request):
"service_level", flat=True
).distinct()
# Apply service level filter
if filter_service_level:
service_levels = [
sl
for sl in service_levels
if dict(VSHNAppCatPrice.ServiceLevel.choices)[sl]
== filter_service_level
]
for service_level in service_levels:
unit_rate_currencies = set(
appcat_price.unit_rates.filter(
@ -228,8 +254,37 @@ def pricelist(request):
for sl_key, plans_list in service_levels_dict.items()
}
# Get filter options for dropdowns
all_cloud_providers = (
ComputePlan.objects.filter(active=True)
.values_list("cloud_provider__name", flat=True)
.distinct()
.order_by("cloud_provider__name")
)
all_services = (
VSHNAppCatPrice.objects.values_list("service__name", flat=True)
.distinct()
.order_by("service__name")
)
all_compute_plan_groups = list(
ComputePlan.objects.filter(active=True, group__isnull=False)
.values_list("group__name", flat=True)
.distinct()
.order_by("group__name")
)
all_compute_plan_groups.append("No Group") # Add option for plans without groups
all_service_levels = [choice[1] for choice in VSHNAppCatPrice.ServiceLevel.choices]
context = {
"pricing_data_by_group_and_service_level": final_context_data,
"show_discount_details": show_discount_details,
"filter_cloud_provider": filter_cloud_provider,
"filter_service": filter_service,
"filter_compute_plan_group": filter_compute_plan_group,
"filter_service_level": filter_service_level,
"all_cloud_providers": all_cloud_providers,
"all_services": all_services,
"all_compute_plan_groups": all_compute_plan_groups,
"all_service_levels": all_service_levels,
}
return render(request, "services/pricelist.html", context)