Добавил приложение склад и модели заготовок
All checks were successful
Auto-Deploy-prodman / deploy (push) Successful in 6s
All checks were successful
Auto-Deploy-prodman / deploy (push) Successful in 6s
This commit is contained in:
101
stock/admin copy.py
Normal file
101
stock/admin copy.py
Normal file
@@ -0,0 +1,101 @@
|
||||
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')
|
||||
}),
|
||||
)
|
||||
Reference in New Issue
Block a user