from django.contrib import admin from import_export import resources, fields, widgets from import_export.admin import ImportExportModelAdmin from .models import Product, ProductCategory, ProductImage, ProductAttribute, ProductAttributeValue, 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 CustomForeignKeyWidget(widgets.ForeignKeyWidget): # # def clean(self, value, row=None, *args, **kwargs): # # return self.model.objects.get_or_create(name=value)[0] # class ProductImageInline(admin.TabularInline): model = ProductImage extra = 0 # # # class ProductAttributeInline(admin.TabularInline): # # model = ProductAttribute # # extra = 1 # # verbose_name_plural = 'ProductAttribute' # # suit_classes = 'suit-tab suit-tab-PA' # # class AttributeChoiceValueInline(admin.TabularInline): model = ProductAttributeValue # prepopulated_fields = {'slug': ('name',)} extra = 1 verbose_name_plural = 'AttributeChoiceValue' suit_classes = 'suit-tab suit-tab-ACV' # # # # class OfferInline(admin.TabularInline): # # model = Offer # # extra = 1 # # verbose_name_plural = 'Offers' # # suit_classes = 'suit-tab suit-tab-offers' # @admin.register(ProductCategory) class ProductCategoryAdmin(admin.ModelAdmin): list_display = ('name', 'slug') search_fields = ('name', 'slug') # # # class AttributeChoiceValueAdmin(admin.ModelAdmin): # # list_display = [field.name for field in ProductCategory._meta.fields] # # # # class Meta: # # model = AttributeChoiceValue # # # # admin.site.register(AttributeChoiceValue, AttributeChoiceValueAdmin) @admin.register(ProductAttribute) class ProductAttributeAdmin(admin.ModelAdmin): list_display = ('slug','name') search_fields = ('slug','name') inlines = [AttributeChoiceValueInline] # prepopulated_fields = {'slug': ('name',)} suit_form_tabs = (('general', 'General'), ('ACV', 'AttributeValues'),) class Meta: model = ProductAttribute @admin.register(Manufacturer) class ManufacturerAdmin(admin.ModelAdmin): list_display = ('slug', 'name') search_fields = ('slug', 'name'), 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(), ) # price = fields.Field(column_name='price', attribute='price', # default=0, # widget=widgets.DecimalWidget(), # ) description = fields.Field(column_name='description', attribute='description', default=None, widget=widgets.CharWidget(), ) # producer = fields.Field(column_name='producer', attribute='producer', # default=None, # widget=widgets.CharWidget(), # ) category = fields.Field(column_name='category', attribute='category', default=None, widget=widgets.ForeignKeyWidget(ProductCategory, field='name'), ) producer = fields.Field(column_name='producer', attribute='producer', default=None, widget=widgets.ForeignKeyWidget(Manufacturer, field='name'), ) attributes = fields.Field(column_name='attributes', attribute='attributes', default=None, widget=CustomManyToManyWidget(ProductAttribute, field="name"), ) is_active = fields.Field(column_name='is_active', attribute='is_active', default=1, widget=widgets.BooleanWidget()) discount_policy = fields.Field(column_name='discount_policy', attribute='discount_policy', default={}, widget=widgets.CharWidget()) # delete = fields.Field(column_name='delete', attribute='delete', # default=0, # widget=widgets.BooleanWidget()) # def for_delete(self, row, instance): # return self.fields['delete'].clean(row) class Meta: model = Product fields = ('id', 'name', 'description', 'producer', 'category', 'is_active', 'attributes', 'discount_policy') export_order = ( 'id', 'name', 'producer', 'is_active', 'category', 'attributes', 'description', 'discount_policy') # import_id_fields = ('name',) def dehydrate_str_choices(self, obj): if obj.id: return obj.str_choices() # @admin.register(Product) class ProductAdmin(ImportExportModelAdmin): list_display = ['id', 'name', 'category', 'manufacturer', 'status'] list_filter = ['status', 'create_at', 'updated_at', 'category'] search_fields = ['name', 'id'] resource_class = ProductResource # class OfferResource(CustomModelResource): # name = fields.Field(column_name='name', attribute='name', # default=None, # widget=widgets.CharWidget(), # ) # # price = fields.Field(column_name='price', attribute='price', # default=0, # widget=widgets.DecimalWidget(), # ) # # products = fields.Field(column_name='products', attribute='products', # widget=widgets.ForeignKeyWidget(Product, field='name'), # ) # # is_active = fields.Field(column_name='is_active', attribute='is_active', # default=1, # widget=widgets.BooleanWidget()) # # attributes = fields.Field(column_name='attributes', attribute='attributes', # default={}, # widget=widgets.CharWidget()) # # class Meta: # model = Offer # fields = ('name', 'products', 'price', 'is_active', 'attributes') # export_order = ('name', 'products', 'attributes', 'is_active', 'price') # import_id_fields = ('name',) # class OfferAdmin(ImportExportModelAdmin): # list_display = ['id', 'name', 'products', 'price', 'is_active', 'attributes'] # resource_class = OfferResource @admin.register(ProductImage) class ProductImageAdmin(admin.ModelAdmin): list_display = [field.name for field in ProductImage._meta.fields] class Meta: model = ProductImage