filtering in price list
This commit is contained in:
parent
57fd001246
commit
7989d4e553
2 changed files with 152 additions and 2 deletions
|
@ -13,6 +13,84 @@
|
|||
<div class="col-12">
|
||||
<h1 class="mb-4">Complete Price List - All Service Variants</h1>
|
||||
|
||||
<!-- Filter Form -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Filters</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="get" class="row g-3" id="filter-form">
|
||||
<div class="col-md-3">
|
||||
<label for="cloud_provider" class="form-label">Cloud Provider</label>
|
||||
<select name="cloud_provider" id="cloud_provider" class="form-select filter-select">
|
||||
<option value="">All Providers</option>
|
||||
{% for provider in all_cloud_providers %}
|
||||
<option value="{{ provider }}" {% if provider == filter_cloud_provider %}selected{% endif %}>
|
||||
{{ provider }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label for="service" class="form-label">Service</label>
|
||||
<select name="service" id="service" class="form-select filter-select">
|
||||
<option value="">All Services</option>
|
||||
{% for service in all_services %}
|
||||
<option value="{{ service }}" {% if service == filter_service %}selected{% endif %}>
|
||||
{{ service }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label for="compute_plan_group" class="form-label">Compute Plan Group</label>
|
||||
<select name="compute_plan_group" id="compute_plan_group" class="form-select filter-select">
|
||||
<option value="">All Groups</option>
|
||||
{% for group in all_compute_plan_groups %}
|
||||
<option value="{{ group }}" {% if group == filter_compute_plan_group %}selected{% endif %}>
|
||||
{{ group }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label for="service_level" class="form-label">Service Level</label>
|
||||
<select name="service_level" id="service_level" class="form-select filter-select">
|
||||
<option value="">All Service Levels</option>
|
||||
{% for level in all_service_levels %}
|
||||
<option value="{{ level }}" {% if level == filter_service_level %}selected{% endif %}>
|
||||
{{ level }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="discount_details" value="true" id="discount_details" {% if show_discount_details %}checked{% endif %}>
|
||||
<label class="form-check-label" for="discount_details">
|
||||
Show discount details
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<button type="submit" class="btn btn-primary">Apply Filters</button>
|
||||
<a href="{% url 'services:pricelist' %}" class="btn btn-secondary">Clear Filters</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Active Filters Display -->
|
||||
{% if filter_cloud_provider or filter_service or filter_compute_plan_group or filter_service_level %}
|
||||
<div class="alert alert-info">
|
||||
<strong>Active Filters:</strong>
|
||||
{% if filter_cloud_provider %}<span class="badge me-1">Cloud Provider: {{ filter_cloud_provider }}</span>{% endif %}
|
||||
{% if filter_service %}<span class="badge me-1">Service: {{ filter_service }}</span>{% endif %}
|
||||
{% if filter_compute_plan_group %}<span class="badge me-1">Group: {{ filter_compute_plan_group }}</span>{% endif %}
|
||||
{% if filter_service_level %}<span class="badge me-1">Service Level: {{ filter_service_level }}</span>{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pricing_data_by_group_and_service_level %}
|
||||
{% for group_name, service_levels in pricing_data_by_group_and_service_level.items %}
|
||||
<div class="mb-5 border rounded p-3">
|
||||
|
@ -135,7 +213,7 @@
|
|||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
<h4>No pricing data available</h4>
|
||||
<p>Please ensure you have active compute plans with prices and VSHNAppCat price configurations.</p>
|
||||
<p>{% if filter_cloud_provider or filter_service or filter_compute_plan_group or filter_service_level %}No data matches the selected filters. Try adjusting your filter criteria.{% else %}Please ensure you have active compute plans with prices and VSHNAppCat price configurations.{% endif %}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
@ -144,6 +222,23 @@
|
|||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Auto-submit form when filter dropdowns change
|
||||
const filterForm = document.getElementById('filter-form');
|
||||
const filterSelects = document.querySelectorAll('.filter-select');
|
||||
const discountCheckbox = document.getElementById('discount_details');
|
||||
|
||||
// Add change event listeners to all filter dropdowns
|
||||
filterSelects.forEach(function(select) {
|
||||
select.addEventListener('change', function() {
|
||||
filterForm.submit();
|
||||
});
|
||||
});
|
||||
|
||||
// Add change event listener to discount details checkbox
|
||||
discountCheckbox.addEventListener('change', function() {
|
||||
filterForm.submit();
|
||||
});
|
||||
|
||||
// Chart data for each service level
|
||||
{% for group_name, service_levels in pricing_data_by_group_and_service_level.items %}
|
||||
{% for service_level, pricing_data in service_levels.items %}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue