from django.contrib import admin
from django.utils.html import format_html
from adminsortable2.admin import SortableAdminMixin
from import_export.admin import ImportExportModelAdmin
from import_export import resources
from import_export.fields import Field
from import_export.widgets import ForeignKeyWidget
from .models import (
Category,
CloudProvider,
ComputePlan,
ConsultingPartner,
ExternalLink,
ExternalLinkOffering,
Lead,
Plan,
ReusableText,
Service,
ServiceOffering,
WebsiteFaq,
)
class PlanInline(admin.StackedInline):
model = Plan
extra = 1
fieldsets = (
(None, {"fields": ("name", "description", "pricing", "plan_description")}),
)
class ExternalLinkOfferingInline(admin.TabularInline):
model = ExternalLinkOffering
extra = 1
fields = ("description", "url", "order")
ordering = ("order", "description")
class OfferingInline(admin.StackedInline):
model = ServiceOffering
extra = 1
fieldsets = (
(
None,
{
"fields": (
"description",
"service",
"cloud_provider",
"offer_description",
)
},
),
)
show_change_link = True
@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")
list_filter = ("parent",)
search_fields = ("name", "description")
prepopulated_fields = {"slug": ("name",)}
ordering = ("order", "name")
class ComputePlansInline(SortableAdminMixin, admin.ModelAdmin):
model = ComputePlan
extra = 1
fieldsets = ((None, {"fields": ("name", "vcpus", "ram", "price_chf")}),)
@admin.register(CloudProvider)
class CloudProviderAdmin(SortableAdminMixin, admin.ModelAdmin):
list_display = (
"name",
"slug",
"logo_preview",
"disable_listing",
"is_featured",
"order",
)
search_fields = ("name", "description")
prepopulated_fields = {"slug": ("name",)}
inlines = [OfferingInline]
ordering = ("order",)
def logo_preview(self, obj):
if obj.logo:
return format_html(
'
', 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",
"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):
if obj.logo:
return format_html(
'
', 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(ServiceOffering)
class ServiceOfferingAdmin(admin.ModelAdmin):
list_display = ("service", "cloud_provider")
list_filter = ("service", "cloud_provider")
search_fields = ("service__name", "cloud_provider__name", "description")
inlines = [ExternalLinkOfferingInline, PlanInline]
@admin.register(ConsultingPartner)
class ConsultingPartnerAdmin(SortableAdminMixin, admin.ModelAdmin):
list_display = (
"name",
"website",
"logo_preview",
"disable_listing",
"is_featured",
"order",
)
search_fields = ("name", "description")
prepopulated_fields = {"slug": ("name",)}
filter_horizontal = ("services", "cloud_providers")
ordering = ("order",)
def logo_preview(self, obj):
if obj.logo:
return format_html(
'
', obj.logo.url
)
return "No logo"
logo_preview.short_description = "Logo"
@admin.register(Lead)
class LeadAdmin(admin.ModelAdmin):
list_display = ("name", "company", "created_at", "odoo_lead_id")
search_fields = ("name", "company")
@admin.register(WebsiteFaq)
class WebsiteFaqAdmin(SortableAdminMixin, admin.ModelAdmin):
list_display = ("question", "order")
search_fields = ("question", "answer")
ordering = ("order",)
class ComputePlanResource(resources.ModelResource):
cloud_provider = Field(
column_name="cloud_provider",
attribute="cloud_provider",
widget=ForeignKeyWidget(CloudProvider, "name"),
)
class Meta:
model = ComputePlan
skip_unchanged = True
report_skipped = False
import_id_fields = ["name"]
fields = (
"name",
"vcpus",
"ram",
"cpu_mem_ratio",
"price_chf",
"cloud_provider",
)
@admin.register(ComputePlan)
class ComputePlansAdmin(ImportExportModelAdmin):
resource_class = ComputePlanResource
list_display = ("name", "cloud_provider", "vcpus", "ram", "price_chf", "active")
search_fields = ("name", "cloud_provider__name") # Search by cloud_provider name
ordering = ("name",)