260 lines
9.2 KiB
Python
260 lines
9.2 KiB
Python
"""
|
||
Примеры использования системы вариантов товаров.
|
||
|
||
Этот файл содержит примеры кода для демонстрации работы с системой.
|
||
Запускать через Django shell: python manage.py shell < docs/example_usage.py
|
||
"""
|
||
|
||
from decimal import Decimal
|
||
from products.models import (
|
||
Product, ProductKit, KitItem, ProductCategory,
|
||
ProductVariantGroup, KitItemPriority
|
||
)
|
||
from products.utils.stock_manager import StockManager
|
||
|
||
|
||
def example_1_create_variant_group():
|
||
"""Пример 1: Создание группы вариантов"""
|
||
print("\n" + "="*60)
|
||
print("ПРИМЕР 1: Создание группы вариантов")
|
||
print("="*60)
|
||
|
||
# Создаём категорию
|
||
category, _ = ProductCategory.objects.get_or_create(
|
||
name="Цветы",
|
||
defaults={'slug': 'cvety'}
|
||
)
|
||
|
||
# Создаём товары - розы разной длины
|
||
rose_50, _ = Product.objects.get_or_create(
|
||
name="Роза Freedom 50см красная",
|
||
defaults={
|
||
'cost_price': Decimal('80.00'),
|
||
'sale_price': Decimal('100.00'),
|
||
'category': category
|
||
}
|
||
)
|
||
|
||
rose_60, _ = Product.objects.get_or_create(
|
||
name="Роза Freedom 60см красная",
|
||
defaults={
|
||
'cost_price': Decimal('120.00'),
|
||
'sale_price': Decimal('150.00'),
|
||
'category': category
|
||
}
|
||
)
|
||
|
||
rose_70, _ = Product.objects.get_or_create(
|
||
name="Роза Freedom 70см красная",
|
||
defaults={
|
||
'cost_price': Decimal('160.00'),
|
||
'sale_price': Decimal('200.00'),
|
||
'category': category
|
||
}
|
||
)
|
||
|
||
# Создаём группу вариантов
|
||
group, created = ProductVariantGroup.objects.get_or_create(
|
||
name="Роза красная Freedom",
|
||
defaults={
|
||
'description': 'Красная роза Freedom различной длины (50-70см)'
|
||
}
|
||
)
|
||
|
||
# Добавляем товары в группу
|
||
rose_50.variant_groups.add(group)
|
||
rose_60.variant_groups.add(group)
|
||
rose_70.variant_groups.add(group)
|
||
|
||
print(f"✓ Создана группа: {group.name}")
|
||
print(f" Товаров в группе: {group.get_products_count()}")
|
||
print(f" Товары:")
|
||
for product in group.products.all():
|
||
print(f" - {product.name} ({product.sale_price} руб.)")
|
||
|
||
return group, rose_50, rose_60, rose_70
|
||
|
||
|
||
def example_2_create_premium_bouquet(group, rose_50, rose_60, rose_70):
|
||
"""Пример 2: Создание премиум букета с приоритетами"""
|
||
print("\n" + "="*60)
|
||
print("ПРИМЕР 2: Создание премиум букета")
|
||
print("="*60)
|
||
|
||
# Создаём букет
|
||
kit, _ = ProductKit.objects.get_or_create(
|
||
name="Ранчо Виталия Премиум",
|
||
defaults={
|
||
'slug': 'rancho-vitaliya-premium',
|
||
'pricing_method': 'from_sale_prices'
|
||
}
|
||
)
|
||
|
||
# Создаём позицию с группой вариантов
|
||
kit_item, _ = KitItem.objects.get_or_create(
|
||
kit=kit,
|
||
variant_group=group,
|
||
defaults={
|
||
'quantity': Decimal('15.000'),
|
||
'notes': 'Использовать самые длинные розы'
|
||
}
|
||
)
|
||
|
||
# Настраиваем приоритеты (для премиум букета - сначала длинные)
|
||
KitItemPriority.objects.get_or_create(
|
||
kit_item=kit_item,
|
||
product=rose_70,
|
||
defaults={'priority': 0} # Наивысший приоритет
|
||
)
|
||
KitItemPriority.objects.get_or_create(
|
||
kit_item=kit_item,
|
||
product=rose_60,
|
||
defaults={'priority': 1}
|
||
)
|
||
KitItemPriority.objects.get_or_create(
|
||
kit_item=kit_item,
|
||
product=rose_50,
|
||
defaults={'priority': 2} # Самый низкий приоритет
|
||
)
|
||
|
||
print(f"✓ Создан букет: {kit.name}")
|
||
print(f" Позиций: {kit.get_total_components_count()}")
|
||
print(f" С вариантами: {kit.get_components_with_variants_count()}")
|
||
print(f"\n Приоритеты для позиции '{kit_item.get_display_name()}':")
|
||
for priority in kit_item.priorities.all().order_by('priority'):
|
||
print(f" {priority.priority}. {priority.product.name} - {priority.product.sale_price} руб.")
|
||
|
||
return kit
|
||
|
||
|
||
def example_3_create_economy_bouquet(group, rose_50, rose_60, rose_70):
|
||
"""Пример 3: Создание эконом букета"""
|
||
print("\n" + "="*60)
|
||
print("ПРИМЕР 3: Создание эконом букета")
|
||
print("="*60)
|
||
|
||
# Создаём эконом букет
|
||
kit, _ = ProductKit.objects.get_or_create(
|
||
name="Ранчо Виталия Эконом",
|
||
defaults={
|
||
'slug': 'rancho-vitaliya-econom',
|
||
'pricing_method': 'from_sale_prices'
|
||
}
|
||
)
|
||
|
||
# Та же группа вариантов, но другие приоритеты
|
||
kit_item, _ = KitItem.objects.get_or_create(
|
||
kit=kit,
|
||
variant_group=group,
|
||
defaults={
|
||
'quantity': Decimal('15.000'),
|
||
'notes': 'Эконом вариант'
|
||
}
|
||
)
|
||
|
||
# Для эконом букета - сначала короткие (дешевые)
|
||
KitItemPriority.objects.get_or_create(
|
||
kit_item=kit_item,
|
||
product=rose_50,
|
||
defaults={'priority': 0} # Наивысший приоритет
|
||
)
|
||
KitItemPriority.objects.get_or_create(
|
||
kit_item=kit_item,
|
||
product=rose_60,
|
||
defaults={'priority': 1}
|
||
)
|
||
KitItemPriority.objects.get_or_create(
|
||
kit_item=kit_item,
|
||
product=rose_70,
|
||
defaults={'priority': 2} # Самый низкий приоритет
|
||
)
|
||
|
||
print(f"✓ Создан букет: {kit.name}")
|
||
print(f"\n Приоритеты для позиции '{kit_item.get_display_name()}':")
|
||
for priority in kit_item.priorities.all().order_by('priority'):
|
||
print(f" {priority.priority}. {priority.product.name} - {priority.product.sale_price} руб.")
|
||
|
||
return kit
|
||
|
||
|
||
def example_4_check_availability(premium_kit, economy_kit):
|
||
"""Пример 4: Проверка доступности"""
|
||
print("\n" + "="*60)
|
||
print("ПРИМЕР 4: Проверка доступности букетов")
|
||
print("="*60)
|
||
|
||
stock_manager = StockManager()
|
||
|
||
# Проверяем премиум букет
|
||
print(f"\nПремиум букет: {premium_kit.name}")
|
||
if premium_kit.check_availability(stock_manager):
|
||
print(" ✓ Доступен для сборки")
|
||
price = premium_kit.calculate_price_with_substitutions(stock_manager)
|
||
print(f" Цена: {price} руб.")
|
||
else:
|
||
print(" ✗ Недоступен")
|
||
|
||
# Проверяем эконом букет
|
||
print(f"\nЭконом букет: {economy_kit.name}")
|
||
if economy_kit.check_availability(stock_manager):
|
||
print(" ✓ Доступен для сборки")
|
||
price = economy_kit.calculate_price_with_substitutions(stock_manager)
|
||
print(f" Цена: {price} руб.")
|
||
else:
|
||
print(" ✗ Недоступен")
|
||
|
||
|
||
def example_5_best_product():
|
||
"""Пример 5: Получение лучшего доступного товара"""
|
||
print("\n" + "="*60)
|
||
print("ПРИМЕР 5: Выбор лучшего доступного товара")
|
||
print("="*60)
|
||
|
||
# Получаем премиум букет
|
||
kit = ProductKit.objects.filter(name="Ранчо Виталия Премиум").first()
|
||
if not kit:
|
||
print(" Букет не найден")
|
||
return
|
||
|
||
stock_manager = StockManager()
|
||
|
||
for kit_item in kit.kit_items.all():
|
||
print(f"\nПозиция: {kit_item.get_display_name()}")
|
||
print(f"Количество: {kit_item.quantity}")
|
||
|
||
best_product = kit_item.get_best_available_product(stock_manager)
|
||
if best_product:
|
||
print(f"✓ Лучший доступный товар: {best_product.name}")
|
||
print(f" Цена: {best_product.sale_price} руб.")
|
||
print(f" Стоимость позиции: {best_product.sale_price * kit_item.quantity} руб.")
|
||
else:
|
||
print("✗ Нет доступных товаров")
|
||
|
||
|
||
def main():
|
||
"""Запуск всех примеров"""
|
||
print("\n" + "="*60)
|
||
print("ДЕМОНСТРАЦИЯ СИСТЕМЫ ВАРИАНТОВ ТОВАРОВ")
|
||
print("="*60)
|
||
|
||
# Создаём данные
|
||
group, rose_50, rose_60, rose_70 = example_1_create_variant_group()
|
||
|
||
# Создаём букеты
|
||
premium_kit = example_2_create_premium_bouquet(group, rose_50, rose_60, rose_70)
|
||
economy_kit = example_3_create_economy_bouquet(group, rose_50, rose_60, rose_70)
|
||
|
||
# Проверяем доступность
|
||
example_4_check_availability(premium_kit, economy_kit)
|
||
|
||
# Получаем лучший товар
|
||
example_5_best_product()
|
||
|
||
print("\n" + "="*60)
|
||
print("ДЕМОНСТРАЦИЯ ЗАВЕРШЕНА")
|
||
print("="*60 + "\n")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|