add addons to services

This commit is contained in:
Tobias Brunner 2025-06-19 16:19:59 +02:00
parent b96b186875
commit 22e527bcd9
No known key found for this signature in database
8 changed files with 1039 additions and 4 deletions

View file

@ -25,6 +25,9 @@ from ..models import (
VSHNAppCatBaseFee,
VSHNAppCatPrice,
VSHNAppCatUnitRate,
VSHNAppCatAddon,
VSHNAppCatAddonBaseFee,
VSHNAppCatAddonUnitRate,
ProgressiveDiscountModel,
DiscountTier,
ExternalPricePlans,
@ -297,6 +300,15 @@ class VSHNAppCatUnitRateInline(admin.TabularInline):
fields = ("currency", "service_level", "amount")
class VSHNAppCatAddonInline(admin.TabularInline):
"""Inline admin for VSHNAppCatAddon model within the VSHNAppCatPrice admin"""
model = VSHNAppCatAddon
extra = 1
fields = ("name", "addon_type", "mandatory", "active")
show_change_link = True
class DiscountTierInline(admin.TabularInline):
"""Inline admin for DiscountTier model"""
@ -330,7 +342,7 @@ class VSHNAppCatPriceAdmin(admin.ModelAdmin):
)
list_filter = ("variable_unit", "service", "discount_model")
search_fields = ("service__name",)
inlines = [VSHNAppCatBaseFeeInline, VSHNAppCatUnitRateInline]
inlines = [VSHNAppCatBaseFeeInline, VSHNAppCatUnitRateInline, VSHNAppCatAddonInline]
def admin_display_base_fees(self, obj):
"""Display base fees in admin list view"""
@ -542,3 +554,84 @@ class ExternalPricePlansAdmin(ImportExportModelAdmin):
return f"{count} plan{'s' if count != 1 else ''}"
display_compare_to_count.short_description = "Compare To"
class VSHNAppCatAddonBaseFeeInline(admin.TabularInline):
"""Inline admin for VSHNAppCatAddonBaseFee model"""
model = VSHNAppCatAddonBaseFee
extra = 1
fields = ("currency", "amount")
class VSHNAppCatAddonUnitRateInline(admin.TabularInline):
"""Inline admin for VSHNAppCatAddonUnitRate model"""
model = VSHNAppCatAddonUnitRate
extra = 1
fields = ("currency", "service_level", "amount")
class VSHNAppCatAddonInline(admin.TabularInline):
"""Inline admin for VSHNAppCatAddon model within the VSHNAppCatPrice admin"""
model = VSHNAppCatAddon
extra = 1
fields = ("name", "addon_type", "mandatory", "active", "order")
show_change_link = True
@admin.register(VSHNAppCatAddon)
class VSHNAppCatAddonAdmin(admin.ModelAdmin):
"""Admin configuration for VSHNAppCatAddon model"""
list_display = (
"name",
"vshn_appcat_price_config",
"addon_type",
"mandatory",
"active",
"display_pricing",
"order",
)
list_filter = (
"addon_type",
"mandatory",
"active",
"vshn_appcat_price_config__service",
)
search_fields = (
"name",
"description",
"commercial_description",
"vshn_appcat_price_config__service__name",
)
ordering = ("vshn_appcat_price_config__service__name", "order", "name")
# Different inlines based on addon type
inlines = [VSHNAppCatAddonBaseFeeInline, VSHNAppCatAddonUnitRateInline]
def display_pricing(self, obj):
"""Display pricing information based on addon type"""
if obj.addon_type == "BF": # Base Fee
fees = obj.base_fees.all()
if not fees:
return "No base fees set"
return format_html(
"<br>".join([f"{fee.amount} {fee.currency}" for fee in fees])
)
elif obj.addon_type == "UR": # Unit Rate
rates = obj.unit_rates.all()
if not rates:
return "No unit rates set"
return format_html(
"<br>".join(
[
f"{rate.amount} {rate.currency} ({rate.get_service_level_display()})"
for rate in rates
]
)
)
return "Unknown addon type"
display_pricing.short_description = "Pricing"