All checks were successful
Auto-Deploy-prodman / deploy (push) Successful in 6s
101 lines
3.6 KiB
Python
101 lines
3.6 KiB
Python
from django.contrib import admin
|
||
from django.utils.html import format_html
|
||
from polymorphic.admin import (
|
||
PolymorphicChildModelAdmin,
|
||
PolymorphicParentModelAdmin,
|
||
PolymorphicChildModelFilter
|
||
)
|
||
from .models import Gost, MaterialGrade, BaseMaterial, SheetMaterial, ProfileMaterial, StockItem
|
||
|
||
@admin.register(Gost)
|
||
class GostAdmin(admin.ModelAdmin):
|
||
list_display = ('name', 'description', 'get_pdf_link')
|
||
search_fields = ('name',)
|
||
|
||
def get_pdf_link(self, obj):
|
||
if obj.pdf_file:
|
||
return format_html('<a href="{}" target="_blank">📄 PDF</a>', obj.pdf_file.url)
|
||
return "—"
|
||
get_pdf_link.short_description = "Файл"
|
||
|
||
@admin.register(MaterialGrade)
|
||
class MaterialGradeAdmin(admin.ModelAdmin):
|
||
list_display = ('name', 'gost', 'density')
|
||
search_fields = ('name', 'gost__name')
|
||
|
||
class BaseChildAdmin(PolymorphicChildModelAdmin):
|
||
base_model = BaseMaterial
|
||
|
||
@admin.register(SheetMaterial)
|
||
class SheetMaterialAdmin(BaseChildAdmin):
|
||
list_display = ('title', 'thickness', 'grade', 'gost')
|
||
|
||
@admin.register(ProfileMaterial)
|
||
class ProfileMaterialAdmin(BaseChildAdmin):
|
||
list_display = ('title', 'profile_type', 'weight_per_meter', 'grade', 'gost')
|
||
|
||
@admin.register(BaseMaterial)
|
||
class BaseMaterialParentAdmin(PolymorphicParentModelAdmin):
|
||
base_model = BaseMaterial
|
||
child_models = (SheetMaterial, ProfileMaterial)
|
||
list_display = ('get_icon', 'title', 'grade', 'gost', 'get_specs')
|
||
list_filter = (PolymorphicChildModelFilter, 'grade', 'gost')
|
||
search_fields = ('title',)
|
||
|
||
def get_icon(self, obj):
|
||
if isinstance(obj, SheetMaterial):
|
||
return format_html('<span title="Лист" style="font-size: 1.2rem;">📄</span>')
|
||
if isinstance(obj, ProfileMaterial):
|
||
return format_html('<span title="Профиль" style="font-size: 1.2rem;">🏗️</span>')
|
||
return "❓"
|
||
get_icon.short_description = ""
|
||
|
||
def get_specs(self, obj):
|
||
real_obj = obj.get_real_instance()
|
||
if isinstance(real_obj, SheetMaterial):
|
||
return f"t = {real_obj.thickness} мм"
|
||
if isinstance(real_obj, ProfileMaterial):
|
||
return f"{real_obj.weight_per_meter} кг/м"
|
||
return "-"
|
||
get_specs.short_description = "Характеристики"
|
||
|
||
@admin.register(StockItem)
|
||
class StockItemAdmin(admin.ModelAdmin):
|
||
list_display = (
|
||
'get_material_name',
|
||
'display_dimensions',
|
||
'quantity',
|
||
'colored_status',
|
||
'order_reference',
|
||
'location'
|
||
)
|
||
list_filter = ('is_scrap', 'material__grade', 'material')
|
||
search_fields = ('order_reference', 'material__title', 'location')
|
||
|
||
def get_material_name(self, obj):
|
||
return obj.material.title
|
||
get_material_name.short_description = "Заготовка"
|
||
|
||
def display_dimensions(self, obj):
|
||
if obj.width:
|
||
return format_html(f"<b>{obj.length} × {obj.width}</b>")
|
||
return format_html(f"L = <b>{obj.length}</b>")
|
||
display_dimensions.short_description = "Размеры (мм)"
|
||
|
||
def colored_status(self, obj):
|
||
if obj.is_scrap:
|
||
return format_html('<b style="color: #ca8a04;">ОБРЕЗОК</b>')
|
||
return format_html('<b style="color: #16a34a;">ЦЕЛЫЙ</b>')
|
||
colored_status.short_description = "Статус"
|
||
|
||
fieldsets = (
|
||
(None, {
|
||
'fields': ('material', 'quantity')
|
||
}),
|
||
('Габариты (мм)', {
|
||
'fields': (('length', 'width'),)
|
||
}),
|
||
('Учет и хранение', {
|
||
'fields': ('is_scrap', 'order_reference', 'location')
|
||
}),
|
||
) |