diff --git a/shiftflow/admin.py b/shiftflow/admin.py index b3a99f5..7ab2fb3 100644 --- a/shiftflow/admin.py +++ b/shiftflow/admin.py @@ -1,12 +1,71 @@ +import os from django.contrib import admin -from .models import Machine, Item +from .models import Company, Machine, Deal, Material, Item -@admin.register(Machine) -class MachineAdmin(admin.ModelAdmin): - list_display = ('name',) +# --- Настройка отображения Компаний --- +@admin.register(Company) +class CompanyAdmin(admin.ModelAdmin): + list_display = ('name', 'description') + search_fields = ('name',) +# --- Настройка отображения Сделок --- +@admin.register(Deal) +class DealAdmin(admin.ModelAdmin): + list_display = ('number', 'company', 'created_at') + search_fields = ('number', 'company__name') + list_filter = ('company',) + +# --- Настройка отображения Материалов --- +@admin.register(Material) +class MaterialAdmin(admin.ModelAdmin): + search_fields = ('name',) + +# --- ГЛАВНАЯ МАГИЯ: Сменные задания --- @admin.register(Item) class ItemAdmin(admin.ModelAdmin): - list_display = ('date', 'machine', 'deal', 'drawing_name', 'quantity_plan', 'quantity_fact', 'status') - list_filter = ('date', 'machine', 'status') - search_fields = ('deal', 'drawing_name') \ No newline at end of file + # Что видим в общем списке + list_display = ('date', 'machine', 'deal', 'drawing_name', 'quantity_plan', 'quantity_fact', 'status', 'is_synced_1c') + # Фильтры справа + list_filter = ('date', 'machine', 'status', 'is_synced_1c', 'deal') + # Поиск по номеру сделки и названию детали + search_fields = ('drawing_name', 'deal__number') + + # Группируем поля в форме редактирования для удобства + fieldsets = ( + ('Основная информация', { + 'fields': ('date', 'machine', 'deal', 'status') + }), + ('Чертеж и параметры', { + 'fields': ('drawing_file', 'drawing_name', 'size_value', 'extra_drawing', 'material', 'quantity_plan', 'is_bend') + }), + ('Исполнение (Оператор)', { + 'fields': ('operator', 'quantity_fact', 'material_taken', 'usable_waste', 'scrap_weight', 'is_synced_1c') + }), + ) + + 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 + +# Регистрация станков просто списком +admin.site.register(Machine) \ No newline at end of file