Добавлена отладочная страница для суперюзеров (Inventory Debug)
Реализация:
- Создан view debug_inventory_page (только для суперюзеров)
- URL: /inventory/debug/
- Компактный дизайн с минимальными отступами и маленьким шрифтом (10-11px)
Функционал:
1. Показывает полную картину инвентаризации на одной странице:
- Заказы (Order) - номер, статус, покупатель, is_returned
- Остатки (Stock) - доступно, зарезервировано, свободно
- Партии (StockBatch) - количество, активность, дата поступления
- Резервы (Reservation) - статус (reserved/converted_to_sale/released), заказ, даты
- Продажи (Sale) - количество, цены, заказ
- Списания (SaleBatchAllocation) - откуда списано, сколько
2. Фильтры:
- По товару (dropdown с названием и SKU)
- По номеру заказа (текстовое поле)
- По складу (dropdown)
- Кнопка 'Применить' и 'Сбросить'
3. UI:
- Цветовая индикация статусов резервов
- Бейджи для ключевых данных
- Компактные таблицы Bootstrap
- Неактивные партии выделены красным
- Ограничение в 100 записей на таблицу для производительности
4. Навигация:
- Ссылка 🔧 Debug в navbar (видна только суперюзерам)
- Красный цвет для видимости
Юзкейс:
Суперюзер принимает товар на склад → оформляет заказ → меняет статусы →
переходит на /inventory/debug/ → видит полную картину всех изменений
Файлы:
- inventory/views/debug_views.py - новый view
- inventory/templates/inventory/debug_page.html - шаблон
- inventory/urls.py - добавлен роут
- templates/navbar.html - добавлена ссылка для суперюзеров
This commit is contained in:
106
myproject/inventory/views/debug_views.py
Normal file
106
myproject/inventory/views/debug_views.py
Normal file
@@ -0,0 +1,106 @@
|
||||
"""
|
||||
Отладочные view для суперюзеров.
|
||||
Для мониторинга работы системы инвентаризации.
|
||||
"""
|
||||
from django.contrib.auth.decorators import login_required, user_passes_test
|
||||
from django.shortcuts import render
|
||||
from django.db.models import Q, Sum, Count
|
||||
from inventory.models import StockBatch, Stock, Reservation, Sale, SaleBatchAllocation
|
||||
from orders.models import Order
|
||||
from products.models import Product
|
||||
from inventory.models import Warehouse
|
||||
|
||||
|
||||
def is_superuser(user):
|
||||
"""Проверка что пользователь - суперюзер."""
|
||||
return user.is_superuser
|
||||
|
||||
|
||||
@login_required
|
||||
@user_passes_test(is_superuser)
|
||||
def debug_inventory_page(request):
|
||||
"""
|
||||
Отладочная страница для суперюзеров.
|
||||
Показывает полную картину по инвентаризации: партии, остатки, резервы, продажи.
|
||||
"""
|
||||
# Получаем параметры фильтров
|
||||
product_id = request.GET.get('product')
|
||||
order_number = request.GET.get('order')
|
||||
warehouse_id = request.GET.get('warehouse')
|
||||
|
||||
# Базовые querysets
|
||||
stock_batches = StockBatch.objects.select_related('product', 'warehouse').order_by('-created_at')
|
||||
stocks = Stock.objects.select_related('product', 'warehouse').order_by('product__name')
|
||||
reservations = Reservation.objects.select_related(
|
||||
'product', 'warehouse', 'order_item__order'
|
||||
).order_by('-created_at')
|
||||
sales = Sale.objects.select_related('product', 'warehouse', 'order').order_by('-created_at')
|
||||
allocations = SaleBatchAllocation.objects.select_related(
|
||||
'sale__product', 'batch'
|
||||
).order_by('-id')
|
||||
orders = Order.objects.prefetch_related('items').order_by('-created_at')
|
||||
|
||||
# Применяем фильтры
|
||||
if product_id:
|
||||
product = Product.objects.filter(id=product_id).first()
|
||||
stock_batches = stock_batches.filter(product_id=product_id)
|
||||
stocks = stocks.filter(product_id=product_id)
|
||||
reservations = reservations.filter(product_id=product_id)
|
||||
sales = sales.filter(product_id=product_id)
|
||||
allocations = allocations.filter(sale__product_id=product_id)
|
||||
orders = orders.filter(items__product_id=product_id).distinct()
|
||||
else:
|
||||
product = None
|
||||
|
||||
if order_number:
|
||||
order = Order.objects.filter(order_number=order_number).first()
|
||||
if order:
|
||||
reservations = reservations.filter(order_item__order=order)
|
||||
sales = sales.filter(order=order)
|
||||
# Фильтруем товары по заказу
|
||||
product_ids = order.items.values_list('product_id', flat=True)
|
||||
stock_batches = stock_batches.filter(product_id__in=product_ids)
|
||||
stocks = stocks.filter(product_id__in=product_ids)
|
||||
allocations = allocations.filter(sale__order=order)
|
||||
else:
|
||||
order = None
|
||||
|
||||
if warehouse_id:
|
||||
warehouse = Warehouse.objects.filter(id=warehouse_id).first()
|
||||
stock_batches = stock_batches.filter(warehouse_id=warehouse_id)
|
||||
stocks = stocks.filter(warehouse_id=warehouse_id)
|
||||
reservations = reservations.filter(warehouse_id=warehouse_id)
|
||||
sales = sales.filter(warehouse_id=warehouse_id)
|
||||
else:
|
||||
warehouse = None
|
||||
|
||||
# Ограничиваем количество записей для производительности
|
||||
stock_batches = stock_batches[:100]
|
||||
stocks = stocks[:100]
|
||||
reservations = reservations[:100]
|
||||
sales = sales[:100]
|
||||
allocations = allocations[:100]
|
||||
orders = orders[:50]
|
||||
|
||||
# Списки для фильтров
|
||||
products = Product.objects.filter(is_active=True).order_by('name')[:200]
|
||||
warehouses = Warehouse.objects.filter(is_active=True).order_by('name')
|
||||
|
||||
context = {
|
||||
'stock_batches': stock_batches,
|
||||
'stocks': stocks,
|
||||
'reservations': reservations,
|
||||
'sales': sales,
|
||||
'allocations': allocations,
|
||||
'orders': orders,
|
||||
'products': products,
|
||||
'warehouses': warehouses,
|
||||
'selected_product': product,
|
||||
'selected_order': order,
|
||||
'selected_warehouse': warehouse,
|
||||
'product_id': product_id,
|
||||
'order_number': order_number,
|
||||
'warehouse_id': warehouse_id,
|
||||
}
|
||||
|
||||
return render(request, 'inventory/debug_page.html', context)
|
||||
Reference in New Issue
Block a user