# -*- coding: utf-8 -*- from django.shortcuts import render, redirect from django.views.generic import ListView, CreateView, DetailView, View, FormView from django.urls import reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib import messages from django.http import HttpResponseRedirect from ..models import Inventory, InventoryLine from ..forms import InventoryForm, InventoryLineForm class InventoryListView(LoginRequiredMixin, ListView): """ Список всех инвентаризаций по складам """ model = Inventory template_name = 'inventory/inventory/inventory_list.html' context_object_name = 'inventories' paginate_by = 20 def get_queryset(self): queryset = Inventory.objects.select_related('warehouse').order_by('-date') # Фильтры (если переданы) warehouse_id = self.request.GET.get('warehouse') status = self.request.GET.get('status') if warehouse_id: queryset = queryset.filter(warehouse_id=warehouse_id) if status: queryset = queryset.filter(status=status) return queryset class InventoryCreateView(LoginRequiredMixin, CreateView): """ Начало новой инвентаризации по конкретному складу. Переводит инвентаризацию в статус 'processing'. """ model = Inventory form_class = InventoryForm template_name = 'inventory/inventory/inventory_form.html' success_url = reverse_lazy('inventory:inventory-list') def form_valid(self, form): form.instance.status = 'processing' messages.success( self.request, f'Инвентаризация склада "{form.instance.warehouse.name}" начата.' ) return super().form_valid(form) class InventoryDetailView(LoginRequiredMixin, DetailView): """ Детальный просмотр инвентаризации с её строками. Позволяет добавлять строки и заполнять фактические количества. """ model = Inventory template_name = 'inventory/inventory/inventory_detail.html' context_object_name = 'inventory' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # Получаем все строки этой инвентаризации context['lines'] = InventoryLine.objects.filter( inventory=self.object ).select_related('product') return context class InventoryLineCreateBulkView(LoginRequiredMixin, View): """ Форма для массового внесения результатов инвентаризации. Позволяет заполнить результаты пересчета для всех товаров на складе. """ template_name = 'inventory/inventory/inventory_line_bulk_form.html' def get_context_data(self, inventory_id, **kwargs): inventory = Inventory.objects.get(pk=inventory_id) return { 'inventory': inventory, 'products': inventory.warehouse.stock_batches.values_list( 'product', flat=True ).distinct() } def get(self, request, pk): inventory = Inventory.objects.get(pk=pk) context = { 'inventory': inventory, 'lines': InventoryLine.objects.filter(inventory=inventory).select_related('product') } return render(request, self.template_name, context) def post(self, request, pk): inventory = Inventory.objects.get(pk=pk) # Здесь будет логика обработки массового ввода данных # TODO: Реализовать обработку формы с множественными строками messages.success(request, 'Результаты инвентаризации добавлены.') return redirect('inventory:inventory-detail', pk=pk)