refactor all the things
This commit is contained in:
parent
8ed39690f1
commit
bb5cb708bd
36 changed files with 1563 additions and 931 deletions
|
@ -1,46 +1,19 @@
|
|||
from django.contrib import admin
|
||||
from django.utils.html import format_html
|
||||
from .models import (
|
||||
Category,
|
||||
CloudProvider,
|
||||
ConsultingPartner,
|
||||
Service,
|
||||
Category,
|
||||
Currency,
|
||||
ExternalLink,
|
||||
Plan,
|
||||
PlanPrice,
|
||||
ExternalLink,
|
||||
Service,
|
||||
ServiceOffering,
|
||||
Term,
|
||||
)
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
class ExternalLinkInline(admin.TabularInline):
|
||||
model = ExternalLink
|
||||
extra = 1
|
||||
fields = ("description", "url", "order")
|
||||
ordering = ("order", "description")
|
||||
|
||||
|
||||
@admin.register(Category)
|
||||
class CategoryAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "slug", "parent", "order")
|
||||
|
@ -50,73 +23,6 @@ class CategoryAdmin(admin.ModelAdmin):
|
|||
ordering = ("order", "name")
|
||||
|
||||
|
||||
@admin.register(CloudProvider)
|
||||
class CloudProviderAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "slug", "logo_preview")
|
||||
search_fields = ("name",)
|
||||
prepopulated_fields = {"slug": ("name",)}
|
||||
|
||||
def logo_preview(self, obj):
|
||||
if obj.logo:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 50px;"/>', obj.logo.url
|
||||
)
|
||||
return "No logo"
|
||||
|
||||
|
||||
@admin.register(Service)
|
||||
class ServiceAdmin(admin.ModelAdmin):
|
||||
list_display = (
|
||||
"name",
|
||||
"cloud_provider",
|
||||
"logo_preview",
|
||||
"category_list",
|
||||
"partner_list",
|
||||
)
|
||||
list_filter = (
|
||||
"cloud_provider",
|
||||
"categories",
|
||||
"consulting_partners",
|
||||
)
|
||||
filter_horizontal = ("categories", "consulting_partners")
|
||||
search_fields = ("name", "description", "slug")
|
||||
prepopulated_fields = {"slug": ("name",)}
|
||||
inlines = [PlanInline, ExternalLinkInline]
|
||||
|
||||
def logo_preview(self, obj):
|
||||
if obj.logo:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 50px;"/>', obj.logo.url
|
||||
)
|
||||
return "No logo"
|
||||
|
||||
def category_list(self, obj):
|
||||
return ", ".join([cat.name for cat in obj.categories.all()])
|
||||
|
||||
def partner_list(self, obj):
|
||||
return ", ".join([partner.name for partner in obj.consulting_partners.all()])
|
||||
|
||||
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):
|
||||
list_display = ("name", "website", "logo_preview")
|
||||
search_fields = ("name", "description")
|
||||
prepopulated_fields = {"slug": ("name",)}
|
||||
|
||||
def logo_preview(self, obj):
|
||||
if obj.logo:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 50px;"/>', obj.logo.url
|
||||
)
|
||||
return "No logo"
|
||||
|
||||
|
||||
@admin.register(Currency)
|
||||
class CurrencyAdmin(admin.ModelAdmin):
|
||||
list_display = ("code", "name", "symbol")
|
||||
|
@ -124,10 +30,139 @@ class CurrencyAdmin(admin.ModelAdmin):
|
|||
ordering = ("code",)
|
||||
|
||||
|
||||
@admin.register(Plan)
|
||||
class PlanAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "service", "is_default", "order")
|
||||
list_filter = ("service", "is_default")
|
||||
@admin.register(Term)
|
||||
class TermAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "order")
|
||||
ordering = ("order", "name")
|
||||
search_fields = ("name", "description")
|
||||
ordering = ("service", "order", "name")
|
||||
inlines = [PlanPriceInline]
|
||||
|
||||
|
||||
@admin.register(CloudProvider)
|
||||
class CloudProviderAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "slug", "logo_preview")
|
||||
search_fields = ("name", "description")
|
||||
prepopulated_fields = {"slug": ("name",)}
|
||||
|
||||
def logo_preview(self, obj):
|
||||
if obj.logo:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 50px;"/>', obj.logo.url
|
||||
)
|
||||
return "No logo"
|
||||
|
||||
logo_preview.short_description = "Logo"
|
||||
|
||||
|
||||
class ExternalLinkInline(admin.TabularInline):
|
||||
model = ExternalLink
|
||||
extra = 1
|
||||
fields = ("description", "url", "order")
|
||||
ordering = ("order", "description")
|
||||
|
||||
|
||||
@admin.register(Service)
|
||||
class ServiceAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "logo_preview", "category_list", "partner_list")
|
||||
list_filter = ("categories",)
|
||||
search_fields = ("name", "description", "slug")
|
||||
prepopulated_fields = {"slug": ("name",)}
|
||||
filter_horizontal = ("categories",)
|
||||
inlines = [ExternalLinkInline]
|
||||
|
||||
def logo_preview(self, obj):
|
||||
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):
|
||||
return ", ".join([cat.name for cat in obj.categories.all()])
|
||||
|
||||
category_list.short_description = "Categories"
|
||||
|
||||
def partner_list(self, obj):
|
||||
return ", ".join([partner.name for partner in obj.consulting_partners.all()])
|
||||
|
||||
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",)
|
||||
|
||||
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"
|
||||
|
||||
|
||||
@admin.register(ServiceOffering)
|
||||
class ServiceOfferingAdmin(admin.ModelAdmin):
|
||||
list_display = ("service", "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",)}
|
||||
|
||||
|
||||
@admin.register(ConsultingPartner)
|
||||
class ConsultingPartnerAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "website", "logo_preview")
|
||||
search_fields = ("name", "description")
|
||||
prepopulated_fields = {"slug": ("name",)}
|
||||
filter_horizontal = ("services", "cloud_providers")
|
||||
|
||||
def logo_preview(self, obj):
|
||||
if obj.logo:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 50px;"/>', obj.logo.url
|
||||
)
|
||||
return "No logo"
|
||||
|
||||
logo_preview.short_description = "Logo"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue