from django.contrib import admin from django.forms import ALL_FIELDS from django.utils.translation import ugettext_lazy as _ 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']) except: try: 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 # class AttributeValueInline(admin.TabularInline): # model = ProductAttributeValue # form = ProductAttributeValueAdminForm # extra = 1 # verbose_name_plural = _('Значение аттрибута') # can_delete = True @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(ProductAttribute) # class ProductAttributeAdmin(ImportExportModelAdmin, SafeModelAdmin): # inlines = [ # # AttributeValueInline # ] # list_display = ('name', 'slug') # search_fields = ('name', 'slug') @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): # id = fields.Field(default=generate_Jid(prefix='J'), # readonly=True, # widget=widgets.CharWidget(), # ) 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