complete rework of offerings

This commit is contained in:
Tobias Brunner 2025-02-28 14:13:51 +01:00
parent 84e25c82d1
commit 20f27bd6b5
No known key found for this signature in database
16 changed files with 313 additions and 294 deletions

View file

@ -4,17 +4,23 @@ from .models import (
Category,
CloudProvider,
ConsultingPartner,
Currency,
ExternalLink,
ExternalLinkOffering,
Lead,
Plan,
PlanPrice,
ReusableText,
Service,
ServiceOffering,
Term,
Lead,
)
@admin.register(ReusableText)
class ReusableTextAdmin(admin.ModelAdmin):
list_display = ("name",)
search_fields = ("name", "text")
ordering = ("name",)
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ("name", "slug", "parent", "order")
@ -24,20 +30,6 @@ class CategoryAdmin(admin.ModelAdmin):
ordering = ("order", "name")
@admin.register(Currency)
class CurrencyAdmin(admin.ModelAdmin):
list_display = ("code", "name", "symbol")
search_fields = ("code", "name")
ordering = ("code",)
@admin.register(Term)
class TermAdmin(admin.ModelAdmin):
list_display = ("name", "order")
ordering = ("order", "name")
search_fields = ("name", "description")
@admin.register(CloudProvider)
class CloudProviderAdmin(admin.ModelAdmin):
list_display = ("name", "slug", "logo_preview")
@ -90,66 +82,25 @@ class ServiceAdmin(admin.ModelAdmin):
partner_list.short_description = "Consulting Partners"
@admin.register(PlanPrice)
class PlanPriceAdmin(admin.ModelAdmin):
model = PlanPrice
class PlanInline(admin.StackedInline):
model = Plan
extra = 1
fieldsets = (
(None, {"fields": ("name", "description", "is_default", "features", "order")}),
(
"Pricing",
{
"fields": ("get_prices",),
},
),
)
readonly_fields = ("get_prices",)
fieldsets = ((None, {"fields": ("name", "description", "plan_description")}),)
def get_prices(self, obj):
if not obj:
return "Save the plan first to add prices"
html = ['<table class="price-table">']
html.append(
"<tr><th>Currency</th><th>Term</th><th>Price</th><th>Actions</th></tr>"
)
for price in obj.prices.all():
html.append(
f"""
<tr>
<td>{price.currency}</td>
<td>{price.term}</td>
<td>{price.price}</td>
<td>
<a href="/admin/services/planprice/{price.id}/change/" class="button" target="_blank">Edit</a>
</td>
</tr>
"""
)
html.append("</table>")
html.append(
f'<a href="/admin/services/planprice/add/?plan={obj.id}" class="button" target="_blank">Add Price</a>'
)
return format_html("".join(html))
get_prices.short_description = "Plan Prices"
class ExternalLinkOfferingInline(admin.TabularInline):
model = ExternalLinkOffering
extra = 1
fields = ("description", "url", "order")
ordering = ("order", "description")
@admin.register(ServiceOffering)
class ServiceOfferingAdmin(admin.ModelAdmin):
list_display = ("service", "cloud_provider", "status")
list_display = ("service", "slug", "cloud_provider")
list_filter = ("service", "cloud_provider")
search_fields = ("service__name", "cloud_provider__name", "description")
inlines = [PlanInline]
class Media:
css = {"all": ("admin/css/service_offering.css",)}
inlines = [ExternalLinkOfferingInline, PlanInline]
@admin.register(ConsultingPartner)