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:
2025-11-20 13:17:04 +03:00
parent cd037e8f6b
commit 82261cbba7
7 changed files with 123 additions and 69 deletions

View File

@@ -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')