Add default showcase selection per warehouse

- Add is_default field to Showcase model with unique constraint per warehouse
- Implement Showcase.save() to ensure only one default per warehouse
- Add SetDefaultShowcaseView for AJAX-based default selection
- Update ShowcaseForm to include is_default checkbox
- Add interactive checkbox UI in showcase list with AJAX functionality
- Update POS API to return showcase.is_default instead of warehouse.is_default
- Update terminal.js to auto-select showcase based on its is_default flag
- Add migration for is_default field

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-20 11:40:08 +03:00
parent 766ca3c87c
commit dd184265ee
9 changed files with 253 additions and 15 deletions

View File

@@ -1,11 +1,13 @@
# -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
from django.shortcuts import render, redirect, get_object_or_404
from django.db.models import Count, Q
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, View
from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
from django.http import JsonResponse
from inventory.models import Showcase, Reservation
from inventory.forms_showcase import ShowcaseForm
@@ -173,3 +175,42 @@ class ShowcaseDeleteView(DeleteView):
)
return response
@method_decorator(login_required, name='dispatch')
class SetDefaultShowcaseView(LoginRequiredMixin, View):
"""
Установка витрины по умолчанию для её склада.
Обрабатывает POST запрос от AJAX и возвращает JSON ответ.
"""
def post(self, request, pk):
"""
Установить витрину с заданным pk как витрину по умолчанию для её склада
"""
try:
showcase = get_object_or_404(Showcase, pk=pk, is_active=True)
# Установить эту витрину как по умолчанию
# (метод save() в модели автоматически снимет флаг с других витрин этого склада)
showcase.is_default = True
showcase.save()
return JsonResponse({
'status': 'success',
'message': f'Витрина "{showcase.name}" на складе "{showcase.warehouse.name}" установлена по умолчанию',
'showcase_id': showcase.id,
'showcase_name': showcase.name,
'warehouse_id': showcase.warehouse.id,
'warehouse_name': showcase.warehouse.name
})
except Showcase.DoesNotExist:
return JsonResponse({
'status': 'error',
'message': 'Витрина не найдена'
}, status=404)
except Exception as e:
return JsonResponse({
'status': 'error',
'message': f'Ошибка при установке витрины по умолчанию: {str(e)}'
}, status=500)