Добавлена защита зарезервированных префиксов артикулов от ручного ввода
- В миксин SKUUniqueMixin добавлен словарь RESERVED_PREFIXES - Префиксы PROD-, KIT-, CAT-, VAR- зарезервированы для автогенерации - При попытке ручного ввода артикула с зарезервированным префиксом выдается понятная ошибка - Проверка регистронезависимая (prod-123 тоже будет заблокирован) - Пользователю предлагается либо использовать другой артикул, либо оставить поле пустым для автогенерации - Решение элегантное, централизованное в миксине, работает для всех форм товаров
This commit is contained in:
@@ -12,12 +12,22 @@ class SKUUniqueMixin:
|
||||
"""
|
||||
Миксин для валидации уникальности артикула среди всех моделей.
|
||||
Проверяет уникальность SKU среди: Product, ProductKit, ProductCategory, ConfigurableProduct.
|
||||
Также защищает зарезервированные префиксы от ручного ввода.
|
||||
"""
|
||||
|
||||
# Зарезервированные префиксы для автогенерации
|
||||
RESERVED_PREFIXES = {
|
||||
'PROD-': 'товаров',
|
||||
'KIT-': 'комплектов',
|
||||
'CAT-': 'категорий',
|
||||
'VAR-': 'вариативных товаров',
|
||||
}
|
||||
|
||||
def clean_sku(self):
|
||||
"""
|
||||
Проверяет уникальность артикула среди всех моделей с артикулами.
|
||||
Если SKU пустой - пропускаем (будет сгенерирован автоматически).
|
||||
Запрещает ручной ввод зарезервированных префиксов.
|
||||
"""
|
||||
sku = self.cleaned_data.get('sku')
|
||||
|
||||
@@ -27,6 +37,15 @@ class SKUUniqueMixin:
|
||||
|
||||
sku = sku.strip()
|
||||
|
||||
# Проверяем зарезервированные префиксы
|
||||
sku_upper = sku.upper()
|
||||
for prefix, entity_type in self.RESERVED_PREFIXES.items():
|
||||
if sku_upper.startswith(prefix):
|
||||
raise forms.ValidationError(
|
||||
f'Префикс "{prefix}" зарезервирован для автоматической генерации артикулов {entity_type}. '
|
||||
f'Пожалуйста, используйте другой артикул или оставьте поле пустым для автогенерации.'
|
||||
)
|
||||
|
||||
# Проверяем во всех моделях
|
||||
models_to_check = [
|
||||
(Product, 'товар'),
|
||||
|
||||
Reference in New Issue
Block a user