introduce service plans

This commit is contained in:
Tobias Brunner 2025-01-28 10:41:39 +01:00
parent f69f7fb755
commit 70f4a02db9
No known key found for this signature in database
11 changed files with 362 additions and 20 deletions

View file

@ -5,9 +5,34 @@ from .models import (
ConsultingPartner,
Service,
Category,
Currency,
Plan,
PlanPrice,
)
class PlanPriceInline(admin.TabularInline):
model = PlanPrice
extra = 1
min_num = 1
verbose_name = "Price"
verbose_name_plural = "Prices"
class PlanInline(admin.StackedInline):
model = Plan
extra = 1
show_change_link = True
fields = ("name", "description", "is_default", "features", "order")
classes = ("collapse",)
inlines = [PlanPriceInline]
def get_formset(self, request, obj=None, **kwargs):
formset = super().get_formset(request, obj, **kwargs)
formset.request = request
return formset
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ("name", "slug", "parent", "order")
@ -36,7 +61,6 @@ class ServiceAdmin(admin.ModelAdmin):
list_display = (
"name",
"cloud_provider",
"price",
"logo_preview",
"category_list",
"partner_list",
@ -49,6 +73,7 @@ class ServiceAdmin(admin.ModelAdmin):
filter_horizontal = ("categories", "consulting_partners")
search_fields = ("name", "description", "slug")
prepopulated_fields = {"slug": ("name",)}
inlines = [PlanInline]
def logo_preview(self, obj):
if obj.logo:
@ -66,6 +91,9 @@ class ServiceAdmin(admin.ModelAdmin):
partner_list.short_description = "Consulting Partners"
category_list.short_description = "Categories"
class Media:
css = {"all": ("admin/css/hide_inline_header.css",)}
@admin.register(ConsultingPartner)
class ConsultingPartnerAdmin(admin.ModelAdmin):
@ -79,3 +107,19 @@ class ConsultingPartnerAdmin(admin.ModelAdmin):
'<img src="{}" style="max-height: 50px;"/>', obj.logo.url
)
return "No logo"
@admin.register(Currency)
class CurrencyAdmin(admin.ModelAdmin):
list_display = ("code", "name", "symbol")
search_fields = ("code", "name")
ordering = ("code",)
@admin.register(Plan)
class PlanAdmin(admin.ModelAdmin):
list_display = ("name", "service", "is_default", "order")
list_filter = ("service", "is_default")
search_fields = ("name", "description")
ordering = ("service", "order", "name")
inlines = [PlanPriceInline]