Files
octopus/myproject/inventory/forms_showcase.py
Andrey Smakotin dd184265ee 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>
2025-11-20 11:40:08 +03:00

77 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
from django import forms
from django.core.exceptions import ValidationError
from .models import Showcase, Warehouse
class ShowcaseForm(forms.ModelForm):
"""
Форма для создания и редактирования витрин.
Витрина привязывается к складу и используется для выкладки готовых букетов.
"""
class Meta:
model = Showcase
fields = ['name', 'warehouse', 'description', 'is_active', 'is_default']
widgets = {
'name': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Название витрины (например: Витрина №1, Витрина у входа)'
}),
'warehouse': forms.Select(attrs={'class': 'form-control'}),
'description': forms.Textarea(attrs={
'class': 'form-control',
'rows': 3,
'placeholder': 'Описание витрины, её расположение или особенности'
}),
'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
'is_default': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
}
labels = {
'name': 'Название витрины',
'warehouse': 'Склад',
'description': 'Описание',
'is_active': 'Активна',
'is_default': 'Витрина по умолчанию',
}
help_texts = {
'warehouse': 'Склад, к которому привязана витрина',
'is_active': 'Неактивные витрины скрыты из списка выбора',
'is_default': 'Витрина будет автоматически выбрана при создании резерва на этом складе',
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Фильтруем только активные склады
self.fields['warehouse'].queryset = Warehouse.objects.filter(is_active=True).order_by('name')
# Если создаём новую витрину и есть склад по умолчанию - предвыбираем его
if not self.instance.pk and not self.initial.get('warehouse'):
default_warehouse = Warehouse.objects.filter(
is_active=True,
is_default=True
).first()
if default_warehouse:
self.initial['warehouse'] = default_warehouse.id
def clean_name(self):
"""Проверка уникальности названия витрины в рамках склада"""
name = self.cleaned_data.get('name')
warehouse = self.cleaned_data.get('warehouse')
if name and warehouse:
# Проверяем уникальность названия в рамках склада
queryset = Showcase.objects.filter(name=name, warehouse=warehouse)
# При редактировании исключаем текущий экземпляр
if self.instance and self.instance.pk:
queryset = queryset.exclude(pk=self.instance.pk)
if queryset.exists():
raise ValidationError(
f'Витрина с названием "{name}" уже существует на складе "{warehouse.name}". '
'Пожалуйста, выберите другое название.'
)
return name