from django.contrib import admin from import_export import resources, fields, widgets from import_export.admin import ImportExportModelAdmin from jet.admin import CompactInline from rangefilter.filter import DateRangeFilter, DateTimeRangeFilter from cart.admin import ProductOfferInlineAdmin from core.admin import SafeModelAdmin from .forms import ProductAdminForm from .models import ( Product, ProductCategory, ProductImage, Manufacturer ) class CustomModelResource(resources.ModelResource): def before_import_row(self, row, **kwargs): """ Override to add additional logic. Does nothing by default. """ try: row['attributes'] = eval(row['attributes']) row['discount_policy'] = eval(row['discount_policy']) except: pass class CustomManyToManyWidget(widgets.ManyToManyWidget): def clean(self, value, row=None, *args, **kwargs): t1 = super(CustomManyToManyWidget, self).clean(value) return self.model.objects.get(name=t1) if t1 else None class ProductImageInline(admin.TabularInline): model = ProductImage extra = 0 @admin.register(ProductCategory) class ProductCategoryAdmin(SafeModelAdmin): list_display = ('name', 'slug', 'parent', 'status') search_fields = ('name', 'slug') list_filter = ('status', ('create_at', DateRangeFilter), ('updated_at', DateTimeRangeFilter)) @admin.register(Manufacturer) class ManufacturerAdmin(ImportExportModelAdmin, SafeModelAdmin): list_display = ('name', 'slug', 'status') search_fields = ('name', 'slug',) list_filter = ('status',) class Meta: model = Manufacturer class ProductResource(CustomModelResource): name = fields.Field(column_name='name', attribute='name', default=None, widget=widgets.CharWidget(), ) description = fields.Field(column_name='description', attribute='description', default=None, widget=widgets.CharWidget(), ) category = fields.Field(column_name='category', attribute='parent', default=None, widget=widgets.ForeignKeyWidget(ProductCategory, field='name')) producer = fields.Field(column_name='producer', attribute='producer', default=None, widget=widgets.ForeignKeyWidget(Manufacturer, field='name')) discount_policy = fields.Field(column_name='discount_policy', attribute='discount_policy', default={}, widget=widgets.CharWidget()) class Meta: model = Product fields = ('id', 'name', 'description', 'producer', 'parent', 'is_active', 'attributes', 'discount_policy') export_order = ( 'id', 'name', 'producer', 'is_active', 'parent', 'attributes', 'description', 'discount_policy') # import_id_fields = ('name',) def dehydrate_str_choices(self, obj): if obj.id: return obj.str_choices() class ProductImageInlineAdmin(CompactInline): model = ProductImage exclude = ('filename',) extra = 1 show_change_link = True can_delete = True @admin.register(Product) class ProductAdmin(ImportExportModelAdmin, SafeModelAdmin): inlines = ( ProductImageInlineAdmin, ProductOfferInlineAdmin, ) list_display = ('name', 'parent', 'manufacturer', 'status') list_filter = ('status', 'create_at', 'updated_at', 'parent') search_fields = ('name', 'id',) readonly_fields = ('slug',) resource_class = ProductResource form = ProductAdminForm