uchill/backend/apps/subscriptions/management/commands/create_sample_promo_codes.py

131 lines
6.3 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.

"""
Команда для создания примерных промокодов.
"""
from django.core.management.base import BaseCommand
from django.utils import timezone
from datetime import timedelta
from apps.subscriptions.models import PromoCode, SubscriptionPlan
from decimal import Decimal
class Command(BaseCommand):
help = 'Создает примерные промокоды для тестирования'
def handle(self, *args, **options):
self.stdout.write('Создание примерных промокодов...')
now = timezone.now()
# 1. Промокод на 10% скидку
promo_10, created = PromoCode.objects.get_or_create(
code='WELCOME10',
defaults={
'description': 'Приветственная скидка 10% для новых пользователей',
'discount_type': 'percentage',
'discount_value': Decimal('10'),
'valid_from': now,
'valid_until': now + timedelta(days=365), # Действует год
'max_uses_total': 1000,
'max_uses_per_user': 1,
'is_active': True,
}
)
if created:
self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_10.code} (10% скидка)'))
else:
self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_10.code}'))
# 2. Промокод на 20% скидку
promo_20, created = PromoCode.objects.get_or_create(
code='SUMMER20',
defaults={
'description': 'Летняя акция - скидка 20%',
'discount_type': 'percentage',
'discount_value': Decimal('20'),
'valid_from': now,
'valid_until': now + timedelta(days=90), # Действует 3 месяца
'max_uses_total': 500,
'max_uses_per_user': 1,
'is_active': True,
}
)
if created:
self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_20.code} (20% скидка)'))
else:
self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_20.code}'))
# 3. Промокод на фиксированную скидку 500 руб
promo_fixed, created = PromoCode.objects.get_or_create(
code='SAVE500',
defaults={
'description': 'Скидка 500 рублей на первую подписку',
'discount_type': 'fixed',
'discount_value': Decimal('500'),
'valid_from': now,
'valid_until': now + timedelta(days=180), # Действует 6 месяцев
'max_uses_total': 200,
'max_uses_per_user': 1,
'is_active': True,
}
)
if created:
self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_fixed.code} (500 руб скидка)'))
else:
self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_fixed.code}'))
# 4. Промокод на 30% скидку (ограниченный)
promo_30, created = PromoCode.objects.get_or_create(
code='VIP30',
defaults={
'description': 'VIP промокод - скидка 30%',
'discount_type': 'percentage',
'discount_value': Decimal('30'),
'valid_from': now,
'valid_until': now + timedelta(days=60), # Действует 2 месяца
'max_uses_total': 50, # Очень ограниченный
'max_uses_per_user': 1,
'is_active': True,
}
)
if created:
self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_30.code} (30% скидка, ограниченный)'))
else:
self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_30.code}'))
# 5. Промокод для определенных планов
plan_per_student = SubscriptionPlan.objects.filter(slug='per-student-basic').first()
if plan_per_student:
promo_plan, created = PromoCode.objects.get_or_create(
code='STUDENT15',
defaults={
'description': 'Скидка 15% на подписку "За ученика"',
'discount_type': 'percentage',
'discount_value': Decimal('15'),
'valid_from': now,
'valid_until': now + timedelta(days=120),
'max_uses_total': 300,
'max_uses_per_user': 1,
'is_active': True,
}
)
if created:
promo_plan.applicable_plans.add(plan_per_student)
self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_plan.code} (15% скидка, только для "За ученика")'))
else:
self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_plan.code}'))
self.stdout.write(self.style.SUCCESS('\nВсе промокоды созданы!'))
self.stdout.write('\nДоступные промокоды:')
self.stdout.write(' 1. WELCOME10 - 10% скидка (1000 использований)')
self.stdout.write(' 2. SUMMER20 - 20% скидка (500 использований, 3 месяца)')
self.stdout.write(' 3. SAVE500 - 500 руб скидка (200 использований)')
self.stdout.write(' 4. VIP30 - 30% скидка (50 использований, ограниченный)')
if plan_per_student:
self.stdout.write(' 5. STUDENT15 - 15% скидка на "За ученика" (300 использований)')