website/hub/services/admin/services.py
Tobias Brunner 61cabd1b1e
Some checks failed
Django Tests / test (push) Failing after 1m3s
Django Tests / test (pull_request) Failing after 1m3s
implement plan pricing
2025-06-20 17:40:38 +02:00

124 lines
3.2 KiB
Python

"""
Admin classes for services and service offerings
"""
from django.contrib import admin
from django.utils.html import format_html
from ..models import Service, ServiceOffering, ExternalLink, ExternalLinkOffering, Plan, PlanPrice
class ExternalLinkInline(admin.TabularInline):
"""Inline admin for ExternalLink model"""
model = ExternalLink
extra = 1
fields = ("description", "url", "order")
ordering = ("order", "description")
class ExternalLinkOfferingInline(admin.TabularInline):
"""Inline admin for ExternalLinkOffering model"""
model = ExternalLinkOffering
extra = 1
fields = ("description", "url", "order")
ordering = ("order", "description")
class PlanInline(admin.StackedInline):
"""Inline admin for Plan model"""
model = Plan
extra = 1
fieldsets = (
(None, {"fields": ("name", "description", "plan_description")}),
)
class OfferingInline(admin.StackedInline):
"""Inline admin for ServiceOffering model"""
model = ServiceOffering
extra = 1
fieldsets = (
(
None,
{
"fields": (
"description",
"service",
"cloud_provider",
"offer_description",
)
},
),
)
show_change_link = True
class PlanPriceInline(admin.TabularInline):
model = PlanPrice
extra = 1
class PlanAdmin(admin.ModelAdmin):
inlines = [PlanPriceInline]
list_display = ("name", "offering")
search_fields = ("name",)
list_filter = ("offering",)
@admin.register(Service)
class ServiceAdmin(admin.ModelAdmin):
"""Admin configuration for Service model"""
list_display = (
"name",
"logo_preview",
"category_list",
"is_featured",
"is_coming_soon",
"disable_listing",
)
list_filter = ("categories",)
search_fields = ("name", "description", "slug")
prepopulated_fields = {"slug": ("name",)}
filter_horizontal = ("categories",)
inlines = [ExternalLinkInline, OfferingInline]
def logo_preview(self, obj):
"""Display logo preview in admin list view"""
if obj.logo:
return format_html(
'<img src="{}" style="max-height: 50px;"/>', obj.logo.url
)
return "No logo"
logo_preview.short_description = "Logo"
def category_list(self, obj):
"""Display categories as comma-separated list"""
return ", ".join([cat.name for cat in obj.categories.all()])
category_list.short_description = "Categories"
def partner_list(self, obj):
"""Display consulting partners as comma-separated list"""
return ", ".join([partner.name for partner in obj.consulting_partners.all()])
partner_list.short_description = "Consulting Partners"
@admin.register(ServiceOffering)
class ServiceOfferingAdmin(admin.ModelAdmin):
"""Admin configuration for ServiceOffering model"""
list_display = ("service", "cloud_provider")
list_filter = ("service", "cloud_provider")
search_fields = ("service__name", "cloud_provider__name", "description")
inlines = [ExternalLinkOfferingInline, PlanInline]
admin.site.register(Plan, PlanAdmin)
admin.site.register(PlanPrice)