""" Management command to migrate from per-product currency to global currency system. Usage: python manage.py migrate_to_global_currency """ from django.core.management.base import BaseCommand from commerce.models import Product, Order from configuration.models import SiteConfiguration class Command(BaseCommand): help = 'Migrate from per-product currency to global currency system' def add_arguments(self, parser): parser.add_argument( '--target-currency', type=str, default='EUR', help='Target currency to migrate to (default: EUR)' ) parser.add_argument( '--dry-run', action='store_true', help='Show what would be changed without making changes' ) def handle(self, *args, **options): target_currency = options['target_currency'] dry_run = options['dry_run'] self.stdout.write( self.style.SUCCESS(f"Migrating to global currency: {target_currency}") ) # Check current state config = SiteConfiguration.get_solo() self.stdout.write(f"Current site currency: {config.currency}") if hasattr(Product.objects.first(), 'currency'): # Products still have currency field product_currencies = Product.objects.values_list('currency', flat=True).distinct() self.stdout.write(f"Product currencies found: {list(product_currencies)}") if len(product_currencies) > 1: self.stdout.write( self.style.WARNING( "Multiple currencies detected in products. " "Consider currency conversion before migration." ) ) order_currencies = Order.objects.values_list('currency', flat=True).distinct() order_currencies = [c for c in order_currencies if c] # Remove empty strings self.stdout.write(f"Order currencies found: {list(order_currencies)}") if not dry_run: # Update site configuration config.currency = target_currency config.save() self.stdout.write( self.style.SUCCESS(f"Updated site currency to {target_currency}") ) # Update orders with empty currency orders_updated = Order.objects.filter(currency='').update(currency=target_currency) self.stdout.write( self.style.SUCCESS(f"Updated {orders_updated} orders to use {target_currency}") ) else: self.stdout.write(self.style.WARNING("DRY RUN - No changes made")) self.stdout.write( self.style.SUCCESS("Migration completed successfully!") )