from django.contrib import admin from django.utils.html import format_html from .models import ( CloudProvider, 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") list_filter = ("parent",) search_fields = ("name", "description") prepopulated_fields = {"slug": ("name",)} 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( '', 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] def logo_preview(self, obj): if obj.logo: return format_html( '', 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( '', 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]