Files
ProdMan/stock/admin copy.py
ackFromRedmi 56dd6644e2
All checks were successful
Auto-Deploy-prodman / deploy (push) Successful in 6s
Добавил приложение склад и модели заготовок
2026-02-16 08:00:16 +03:00

101 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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')
}),
)