# management/commands/create_plans.py from django.core.management.base import BaseCommand from plans.models import Plan, Quota, Pricing, PlanPricing from decimal import Decimal from django.db.models import Q class Command(BaseCommand): help = 'Create basic subscription plans structure' def add_arguments(self, parser): parser.add_argument( '--reset', action='store_true', help='Delete existing plans and quotas before creating new ones' ) def handle(self, *args, **options): if options['reset']: self.stdout.write(self.style.WARNING('Resetting existing plans data...')) Plan.objects.all().delete() Quota.objects.filter( Q(codename='basic') | Q(codename='pro') | Q(codename='premium') ).delete() # Ensure no existing plans are marked as default Plan.objects.all().delete() Quota.objects.all().delete() Pricing.objects.all().delete() # Create core quotas basic_quota, _ = Quota.objects.update_or_create( codename='basic', defaults={ 'name': 'Basic Features', 'description': 'Essential platform access', 'is_boolean': True } ) pro_quota, _ = Quota.objects.update_or_create( codename='pro', defaults={ 'name': 'Pro Features', 'description': 'Advanced functionality', 'is_boolean': True } ) premium_quota, _ = Quota.objects.update_or_create( codename='premium', defaults={ 'name': 'Premium Features', 'description': 'Full platform access', 'is_boolean': True } ) # Create pricing period monthly_pricing, _ = Pricing.objects.update_or_create( name='Monthly', defaults={'period': 30} ) # Define plan structure plans = [ { 'name': 'Basic', 'description': 'Entry-level plan', 'price': Decimal('0.00'), 'period': None, 'quotas': [basic_quota], 'default': True }, { 'name': 'Pro', 'description': 'Professional plan', 'price': Decimal('29.00'), 'period': 30, 'quotas': [basic_quota, pro_quota], 'default': False }, { 'name': 'Premium', 'description': 'Full access plan', 'price': Decimal('99.00'), 'period': 30, 'quotas': [basic_quota, pro_quota, premium_quota], 'default': None } ] # Create plans and associations for plan_data in plans: plan, created = Plan.objects.update_or_create( name=plan_data['name'], defaults={ 'description': plan_data['description'], 'default': plan_data.get('default', False), 'available': True, 'visible': True } ) # Set quotas plan.quotas.set(plan_data['quotas']) # Create pricing if applicable if plan_data['price'] > 0: PlanPricing.objects.update_or_create( plan=plan, pricing=monthly_pricing, defaults={ 'price': plan_data['price'], 'visible': True } ) status = 'Created' if created else 'Updated' self.stdout.write(self.style.SUCCESS(f'{status} {plan.name} plan')) self.stdout.write(self.style.SUCCESS('Successfully created plans structure'))