Files
octopus/myproject/docs/example_usage.py

260 lines
9.2 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.
"""
Примеры использования системы вариантов товаров.
Этот файл содержит примеры кода для демонстрации работы с системой.
Запускать через 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()