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.
 
 
 
 

138 lines
4.5 KiB

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