|
|
|
@ -1,27 +1,30 @@ |
|
|
|
from django.contrib import admin |
|
|
|
from django.contrib import admin |
|
|
|
from import_export import resources, fields, widgets |
|
|
|
from import_export import resources, fields, widgets |
|
|
|
from import_export.admin import ImportExportModelAdmin |
|
|
|
from import_export.admin import ImportExportModelAdmin |
|
|
|
from .models import Product, ProductCategory, ProductImage |
|
|
|
from .models import Product, ProductCategory, ProductImage, ProductAttribute, ProductAttributeValue, Manufacturer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
# |
|
|
|
# class CustomModelResource(resources.ModelResource): |
|
|
|
class CustomModelResource(resources.ModelResource): |
|
|
|
# def before_import_row(self, row, **kwargs): |
|
|
|
def before_import_row(self, row, **kwargs): |
|
|
|
# """ |
|
|
|
""" |
|
|
|
# Override to add additional logic. Does nothing by default. |
|
|
|
Override to add additional logic. Does nothing by default. |
|
|
|
# """ |
|
|
|
""" |
|
|
|
# try: |
|
|
|
try: |
|
|
|
# row['attributes'] = eval(row['attributes']) |
|
|
|
row['attributes'] = eval(row['attributes']) |
|
|
|
# except: |
|
|
|
except: |
|
|
|
# try: |
|
|
|
try: |
|
|
|
# row['discount_policy'] = eval(row['discount_policy']) |
|
|
|
row['discount_policy'] = eval(row['discount_policy']) |
|
|
|
# except: |
|
|
|
except: |
|
|
|
# pass |
|
|
|
pass |
|
|
|
# |
|
|
|
|
|
|
|
# class CustomManyToManyWidget(widgets.ManyToManyWidget): |
|
|
|
|
|
|
|
# def clean(self, value, row=None, *args, **kwargs): |
|
|
|
class CustomManyToManyWidget(widgets.ManyToManyWidget): |
|
|
|
# t1 = super(CustomManyToManyWidget, self).clean(value) |
|
|
|
def clean(self, value, row=None, *args, **kwargs): |
|
|
|
# return self.model.objects.get(name=t1) if t1 else None |
|
|
|
t1 = super(CustomManyToManyWidget, self).clean(value) |
|
|
|
|
|
|
|
return self.model.objects.get(name=t1) if t1 else None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
# |
|
|
|
# |
|
|
|
# |
|
|
|
# # class CustomForeignKeyWidget(widgets.ForeignKeyWidget): |
|
|
|
# # class CustomForeignKeyWidget(widgets.ForeignKeyWidget): |
|
|
|
@ -31,6 +34,8 @@ from .models import Product, ProductCategory, ProductImage |
|
|
|
class ProductImageInline(admin.TabularInline): |
|
|
|
class ProductImageInline(admin.TabularInline): |
|
|
|
model = ProductImage |
|
|
|
model = ProductImage |
|
|
|
extra = 0 |
|
|
|
extra = 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
# |
|
|
|
# # class ProductAttributeInline(admin.TabularInline): |
|
|
|
# # class ProductAttributeInline(admin.TabularInline): |
|
|
|
# # model = ProductAttribute |
|
|
|
# # model = ProductAttribute |
|
|
|
@ -38,12 +43,14 @@ class ProductImageInline(admin.TabularInline): |
|
|
|
# # verbose_name_plural = 'ProductAttribute' |
|
|
|
# # verbose_name_plural = 'ProductAttribute' |
|
|
|
# # suit_classes = 'suit-tab suit-tab-PA' |
|
|
|
# # suit_classes = 'suit-tab suit-tab-PA' |
|
|
|
# # |
|
|
|
# # |
|
|
|
# class AttributeChoiceValueInline(admin.TabularInline): |
|
|
|
class AttributeChoiceValueInline(admin.TabularInline): |
|
|
|
# model = ProductAttributeChoiceValue |
|
|
|
model = ProductAttributeValue |
|
|
|
# # prepopulated_fields = {'slug': ('name',)} |
|
|
|
# prepopulated_fields = {'slug': ('name',)} |
|
|
|
# extra = 1 |
|
|
|
extra = 1 |
|
|
|
# verbose_name_plural = 'AttributeChoiceValue' |
|
|
|
verbose_name_plural = 'AttributeChoiceValue' |
|
|
|
# suit_classes = 'suit-tab suit-tab-ACV' |
|
|
|
suit_classes = 'suit-tab suit-tab-ACV' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # |
|
|
|
# # |
|
|
|
# # class OfferInline(admin.TabularInline): |
|
|
|
# # class OfferInline(admin.TabularInline): |
|
|
|
# # model = Offer |
|
|
|
# # model = Offer |
|
|
|
@ -53,8 +60,9 @@ class ProductImageInline(admin.TabularInline): |
|
|
|
# |
|
|
|
# |
|
|
|
@admin.register(ProductCategory) |
|
|
|
@admin.register(ProductCategory) |
|
|
|
class ProductCategoryAdmin(admin.ModelAdmin): |
|
|
|
class ProductCategoryAdmin(admin.ModelAdmin): |
|
|
|
list_display = ('name','slug') |
|
|
|
list_display = ('name', 'slug') |
|
|
|
search_fields = ('name','slug') |
|
|
|
search_fields = ('name', 'slug') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
# |
|
|
|
# # class AttributeChoiceValueAdmin(admin.ModelAdmin): |
|
|
|
# # class AttributeChoiceValueAdmin(admin.ModelAdmin): |
|
|
|
@ -64,93 +72,102 @@ class ProductCategoryAdmin(admin.ModelAdmin): |
|
|
|
# # model = AttributeChoiceValue |
|
|
|
# # model = AttributeChoiceValue |
|
|
|
# # |
|
|
|
# # |
|
|
|
# # admin.site.register(AttributeChoiceValue, AttributeChoiceValueAdmin) |
|
|
|
# # 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 ProductAttributeAdmin(admin.ModelAdmin): |
|
|
|
|
|
|
|
# list_display = [field.name for field in ProductAttribute._meta.fields] |
|
|
|
|
|
|
|
# inlines = [AttributeChoiceValueInline] |
|
|
|
|
|
|
|
# # prepopulated_fields = {'slug': ('name',)} |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
# suit_form_tabs = (('general', 'General'), |
|
|
|
|
|
|
|
# ('ACV', 'AttributeValues'),) |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
# class Meta: |
|
|
|
|
|
|
|
# model = ProductAttribute |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
# admin.site.register(ProductAttribute, ProductAttributeAdmin) |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
# @admin.register(Manufacturer) |
|
|
|
|
|
|
|
# class ProducerAdmin(admin.ModelAdmin): |
|
|
|
|
|
|
|
# list_display = [field.name for field in Manufacturer._meta.fields] |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
# 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): |
|
|
|
class ProductResource(CustomModelResource): |
|
|
|
# if obj.id: |
|
|
|
# id = fields.Field(default=generate_Jid(prefix='J'), |
|
|
|
# return obj.str_choices() |
|
|
|
# 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) |
|
|
|
@admin.register(Product) |
|
|
|
class ProductAdmin(ImportExportModelAdmin): |
|
|
|
class ProductAdmin(ImportExportModelAdmin): |
|
|
|
list_display = ['id', 'name', 'category', 'manufacturer','status'] |
|
|
|
list_display = ['id', 'name', 'category', 'manufacturer', 'status'] |
|
|
|
list_filter = ['status', 'create_at', 'updated_at', 'category'] |
|
|
|
list_filter = ['status', 'create_at', 'updated_at', 'category'] |
|
|
|
search_fields = ['name', 'id'] |
|
|
|
search_fields = ['name', 'id'] |
|
|
|
|
|
|
|
|
|
|
|
# resource_class = ProductResource |
|
|
|
resource_class = ProductResource |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# class OfferResource(CustomModelResource): |
|
|
|
# class OfferResource(CustomModelResource): |
|
|
|
# name = fields.Field(column_name='name', attribute='name', |
|
|
|
# name = fields.Field(column_name='name', attribute='name', |
|
|
|
@ -185,14 +202,10 @@ class ProductAdmin(ImportExportModelAdmin): |
|
|
|
# list_display = ['id', 'name', 'products', 'price', 'is_active', 'attributes'] |
|
|
|
# list_display = ['id', 'name', 'products', 'price', 'is_active', 'attributes'] |
|
|
|
# resource_class = OfferResource |
|
|
|
# resource_class = OfferResource |
|
|
|
|
|
|
|
|
|
|
|
# @admin.register(ProductImage) |
|
|
|
@admin.register(ProductImage) |
|
|
|
# class ProductImageAdmin(admin.ModelAdmin): |
|
|
|
class ProductImageAdmin(admin.ModelAdmin): |
|
|
|
# list_display = [field.name for field in ProductImage._meta.fields] |
|
|
|
list_display = [field.name for field in ProductImage._meta.fields] |
|
|
|
# |
|
|
|
|
|
|
|
# class Meta: |
|
|
|
class Meta: |
|
|
|
# model = ProductImage |
|
|
|
model = ProductImage |
|
|
|
|
|
|
|
|
|
|
|
# # admin.site.register(ProductImage, ProductImageAdmin) |
|
|
|
|
|
|
|
# # admin.site.register(ProductCategory, ProductCategoryAdmin) |
|
|
|
|
|
|
|
# # admin.site.register(Product, ProductAdmin) |
|
|
|
|
|
|
|
# # admin.site.register(Offer, OfferAdmin) |
|
|
|
|
|
|
|
|