Поменял структуру моделей
Some checks failed
Deploy MES Core / deploy (push) Failing after 1s

This commit is contained in:
2026-03-29 16:04:02 +03:00
parent 641abfff5e
commit 191d06d7d3
11 changed files with 194 additions and 77 deletions

View File

@@ -1,6 +1,6 @@
import os
from django.contrib import admin
from .models import Company, EmployeeProfile, Machine, Deal, Material, Item
from .models import Company, EmployeeProfile, Machine, Deal, Material, ProductionTask, Item
# --- Настройка отображения Компаний ---
@admin.register(Company)
@@ -20,52 +20,41 @@ class DealAdmin(admin.ModelAdmin):
class MaterialAdmin(admin.ModelAdmin):
search_fields = ('name',)
# --- ГЛАВНАЯ МАГИЯ: Сменные задания ---
# --- Задания на производство (База) ---
@admin.register(ProductionTask)
class ProductionTaskAdmin(admin.ModelAdmin):
list_display = ('drawing_name', 'deal', 'material', 'quantity_ordered', 'created_at')
search_fields = ('drawing_name', 'deal__number')
list_filter = ('deal', 'material', 'is_bend')
# --- Сменные задания (Выполнение) ---
@admin.register(Item)
class ItemAdmin(admin.ModelAdmin):
# Что видим в общем списке
list_display = ('date', 'machine', 'deal', 'drawing_name', 'quantity_plan', 'quantity_fact', 'status', 'is_synced_1c')
# Что видим в общем списке (используем task__ для доступа к полям базы)
list_display = ('date', 'machine', 'get_deal', 'get_drawing', 'quantity_plan', 'quantity_fact', 'status', 'is_synced_1c')
# Фильтры справа
list_filter = ('date', 'machine', 'status', 'is_synced_1c', 'deal')
# Поиск по номеру сделки и названию детали
search_fields = ('drawing_name', 'deal__number')
list_filter = ('date', 'machine', 'status', 'is_synced_1c', 'task__deal')
# Поиск по номеру сделки и названию детали через связь task
search_fields = ('task__drawing_name', 'task__deal__number')
# Группируем поля в форме редактирования для удобства
# Группируем поля в форме редактирования
fieldsets = (
('Основная информация', {
'fields': ('date', 'machine', 'deal', 'status')
('Связь с заданием', {
'fields': ('task', 'date', 'machine')
}),
('Чертеж и параметры', {
'fields': ('drawing_file', 'drawing_name', 'size_value', 'extra_drawing', 'material', 'quantity_plan', 'is_bend')
('Исполнение', {
'fields': ('quantity_plan', 'quantity_fact', 'status', 'is_synced_1c')
}),
('Исполнение (Оператор)', {
'fields': ('operator', 'quantity_fact', 'material_taken', 'usable_waste', 'scrap_weight', 'is_synced_1c')
('Отходы и материалы', {
'fields': ('material_taken', 'usable_waste', 'scrap_weight')
}),
)
def save_model(self, request, obj, form, change):
"""
Переопределяем сохранение, чтобы автоматизировать заполнение полей.
"""
# 1. Если имя детали "Б/ч" или пустое, а файл загружен — берем имя из файла
if (obj.drawing_name == "Б/ч" or not obj.drawing_name) and obj.drawing_file:
filename = os.path.basename(obj.drawing_file.name)
obj.drawing_name = os.path.splitext(filename)[0] # Отрезаем .dxf или .step
# 2. Логика запоминания последней сделки (через сессию браузера)
if obj.deal:
request.session['last_deal_id'] = obj.deal.id
super().save_model(request, obj, form, change)
def get_changeform_initial_data(self, request):
"""
Подставляем последнюю выбранную сделку в новую форму.
"""
initial = super().get_changeform_initial_data(request)
if 'last_deal_id' in request.session:
initial['deal'] = request.session['last_deal_id']
return initial
def get_deal(self, obj): return obj.task.deal
get_deal.short_description = 'Сделка'
def get_drawing(self, obj): return obj.task.drawing_name
get_drawing.short_description = 'Деталь'
# Регистрация станков просто списком
admin.site.register(Machine)