Remove direct reservation management from web interface
PROBLEM: Direct deletion/creation of reservations via web interface bypassed POS business logic, creating data inconsistencies (orphaned showcase kits, incorrect stock calculations). SOLUTION: Make reservations read-only in web interface. All reservation management now happens only through: - POS (showcase kits) - Orders module CHANGES: - Remove reservation-create and reservation-update URL routes - Delete ReservationCreateView and ReservationUpdateView - Remove ReservationForm (no longer needed) - Delete reservation_form.html and reservation_update.html templates - Update reservation_list.html to read-only view with info banner - Add showcase and order columns to reservation list - Clean up imports in urls.py and views/__init__.py Reservations are now read-only for monitoring purposes only. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,7 @@ Inventory Views Package
|
||||
- inventory_ops.py: Инвентаризация и её строки
|
||||
- writeoff.py: Списания товара
|
||||
- transfer.py: Перемещения между складами
|
||||
- reservation.py: Резервирования товара
|
||||
- reservation.py: Резервирования товара (view-only)
|
||||
- stock.py: Справочник остатков (view-only)
|
||||
- batch.py: Справочник партий товара (view-only)
|
||||
- allocation.py: Распределение продаж по партиям (view-only)
|
||||
@@ -28,7 +28,7 @@ from .inventory_ops import (
|
||||
)
|
||||
from .writeoff import WriteOffListView, WriteOffCreateView, WriteOffUpdateView, WriteOffDeleteView
|
||||
from .transfer import TransferListView, TransferBulkCreateView, TransferDetailView, TransferDeleteView, GetProductStockView
|
||||
from .reservation import ReservationListView, ReservationCreateView, ReservationUpdateView
|
||||
from .reservation import ReservationListView
|
||||
from .stock import StockListView, StockDetailView
|
||||
from .allocation import SaleBatchAllocationListView
|
||||
from .movements import StockMovementListView
|
||||
@@ -60,7 +60,7 @@ __all__ = [
|
||||
# Transfer
|
||||
'TransferListView', 'TransferBulkCreateView', 'TransferDetailView', 'TransferDeleteView', 'GetProductStockView',
|
||||
# Reservation
|
||||
'ReservationListView', 'ReservationCreateView', 'ReservationUpdateView',
|
||||
'ReservationListView',
|
||||
# Stock
|
||||
'StockListView', 'StockDetailView',
|
||||
# StockBatch
|
||||
|
||||
@@ -1,46 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Reservation (Резервирование товара) views
|
||||
GROUP 2: MEDIUM PRIORITY
|
||||
Reservation (Резервирование товара) views - READ ONLY
|
||||
Резервы управляются только через POS и Orders
|
||||
"""
|
||||
from django.views.generic import ListView, CreateView, UpdateView
|
||||
from django.urls import reverse_lazy
|
||||
from django.views.generic import ListView
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.contrib import messages
|
||||
from ..models import Reservation
|
||||
from ..forms import ReservationForm
|
||||
|
||||
|
||||
class ReservationListView(LoginRequiredMixin, ListView):
|
||||
"""
|
||||
Список резервирований (только для просмотра).
|
||||
Управление резервами происходит через POS (витринные комплекты) и Orders.
|
||||
"""
|
||||
model = Reservation
|
||||
template_name = 'inventory/reservation/reservation_list.html'
|
||||
context_object_name = 'reservations'
|
||||
paginate_by = 20
|
||||
|
||||
def get_queryset(self):
|
||||
"""Показываем все резервы со статусом 'reserved'"""
|
||||
return Reservation.objects.filter(
|
||||
status='reserved'
|
||||
).select_related('product', 'warehouse', 'order_item').order_by('-reserved_at')
|
||||
|
||||
|
||||
class ReservationCreateView(LoginRequiredMixin, CreateView):
|
||||
model = Reservation
|
||||
form_class = ReservationForm
|
||||
template_name = 'inventory/reservation/reservation_form.html'
|
||||
success_url = reverse_lazy('inventory:reservation-list')
|
||||
|
||||
def form_valid(self, form):
|
||||
form.instance.status = 'reserved'
|
||||
messages.success(self.request, f'Товар успешно зарезервирован.')
|
||||
return super().form_valid(form)
|
||||
|
||||
|
||||
class ReservationUpdateView(LoginRequiredMixin, UpdateView):
|
||||
model = Reservation
|
||||
fields = ['status']
|
||||
template_name = 'inventory/reservation/reservation_update.html'
|
||||
success_url = reverse_lazy('inventory:reservation-list')
|
||||
|
||||
def form_valid(self, form):
|
||||
messages.success(self.request, f'Статус резервирования обновлен.')
|
||||
return super().form_valid(form)
|
||||
).select_related('product', 'warehouse', 'order_item', 'showcase').order_by('-reserved_at')
|
||||
|
||||
Reference in New Issue
Block a user