from django.contrib import admin from django.template.context import Context from django.template.loader import get_template from django.utils.translation import ugettext_lazy as _ from filer.models import ThumbnailOption from cms.admin.placeholderadmin import PlaceholderAdminMixin, FrontendEditableAdminMixin from shop.admin.defaults import customer from shop.admin.defaults.order import OrderAdmin from shop.models.defaults.order import Order from shop.admin.order import PrintInvoiceAdminMixin from shop.admin.delivery import DeliveryOrderAdminMixin from adminsortable2.admin import SortableAdminMixin, PolymorphicSortableAdminMixin from shop.admin.product import CMSPageAsCategoryMixin, UnitPriceMixin, ProductImageInline, InvalidateProductCacheMixin, SearchProductIndexMixin, CMSPageFilter from polymorphic.admin import (PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter) from weirdlittleempire.models import Product, Commodity, SmartPhoneVariant, SmartPhoneModel, OperatingSystem from weirdlittleempire.models import Manufacturer, SmartCard admin.site.site_header = "Weird Little Empire Administration" admin.site.unregister(ThumbnailOption) @admin.register(Order) class OrderAdmin(PrintInvoiceAdminMixin, DeliveryOrderAdminMixin, OrderAdmin): pass admin.site.register(Manufacturer, admin.ModelAdmin) __all__ = ['customer'] @admin.register(Commodity) class CommodityAdmin(InvalidateProductCacheMixin, SearchProductIndexMixin, SortableAdminMixin, FrontendEditableAdminMixin, PlaceholderAdminMixin, CMSPageAsCategoryMixin, PolymorphicChildModelAdmin): """ Since our Commodity model inherits from polymorphic Product, we have to redefine its admin class. """ base_model = Product fields = [ ('product_name', 'slug'), ('product_code', 'unit_price'), 'quantity', 'active', 'caption', 'manufacturer', ] filter_horizontal = ['cms_pages'] inlines = [ProductImageInline] prepopulated_fields = {'slug': ['product_name']} @admin.register(SmartCard) class SmartCardAdmin(InvalidateProductCacheMixin, SearchProductIndexMixin, SortableAdminMixin, FrontendEditableAdminMixin, CMSPageAsCategoryMixin, PlaceholderAdminMixin, PolymorphicChildModelAdmin): base_model = Product fieldsets = ( (None, { 'fields': [ ('product_name', 'slug'), ('product_code', 'unit_price'), 'quantity', 'active', 'caption', 'description', ], }), (_("Properties"), { 'fields': ['manufacturer', 'storage', 'card_type', 'speed'], }), ) filter_horizontal = ['cms_pages'] inlines = [ProductImageInline] prepopulated_fields = {'slug': ['product_name']} admin.site.register(OperatingSystem, admin.ModelAdmin) class SmartPhoneInline(admin.TabularInline): model = SmartPhoneVariant extra = 0 @admin.register(SmartPhoneModel) class SmartPhoneAdmin(InvalidateProductCacheMixin, SearchProductIndexMixin, SortableAdminMixin, FrontendEditableAdminMixin, CMSPageAsCategoryMixin, PlaceholderAdminMixin, PolymorphicChildModelAdmin): base_model = Product fieldsets = [ (None, { 'fields': [ ('product_name', 'slug'), 'active', 'caption', 'description', ], }), (_("Properties"), { 'fields': ['manufacturer', 'battery_type', 'battery_capacity', 'ram_storage', 'wifi_connectivity', 'bluetooth', 'gps', 'operating_system', ('width', 'height', 'weight',), 'screen_size'], }), ] filter_horizontal = ['cms_pages'] inlines = [ProductImageInline, SmartPhoneInline] prepopulated_fields = {'slug': ['product_name']} def render_text_index(self, instance): template = get_template( 'search/indexes/weirdlittleempire/commodity_text.txt') return template.render(Context({'object': instance})) render_text_index.short_description = _("Text Index") @admin.register(Product) class ProductAdmin(PolymorphicSortableAdminMixin, PolymorphicParentModelAdmin): base_model = Product child_models = [SmartPhoneModel, SmartCard, Commodity] list_display = ['product_name', 'get_price', 'product_type', 'active'] list_display_links = ['product_name'] search_fields = ['product_name'] list_filter = [PolymorphicChildModelFilter, CMSPageFilter] list_per_page = 250 list_max_show_all = 1000 def get_price(self, obj): return str(obj.get_real_instance().get_price(None)) get_price.short_description = _("Price starting at")