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('📄 PDF', 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('📄') if isinstance(obj, ProfileMaterial): return format_html('🏗️') 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"{obj.length} × {obj.width}") return format_html(f"L = {obj.length}") display_dimensions.short_description = "Размеры (мм)" def colored_status(self, obj): if obj.is_scrap: return format_html('ОБРЕЗОК') return format_html('ЦЕЛЫЙ') colored_status.short_description = "Статус" fieldsets = ( (None, { 'fields': ('material', 'quantity') }), ('Габариты (мм)', { 'fields': (('length', 'width'),) }), ('Учет и хранение', { 'fields': ('is_scrap', 'order_reference', 'location') }), )