You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.7 KiB
110 lines
3.7 KiB
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
|
|
|