from django.db import migrations
import random
import string

def forwards(apps, schema_editor):
    Product = apps.get_model('products', 'Product')
    existing = set(Product.objects.exclude(unique_code__isnull=True).values_list('unique_code', flat=True))
    def gen():
        return ''.join(random.choices(string.ascii_uppercase, k=2)) + ''.join(random.choices(string.digits, k=6)) + ''.join(random.choices(string.ascii_uppercase, k=2))
    to_update = []
    for p in Product.objects.filter(unique_code__isnull=True):
        for _ in range(200):
            code = gen()
            if code not in existing:
                existing.add(code)
                p.unique_code = code
                to_update.append(p)
                break
    if to_update:
        Product.objects.bulk_update(to_update, ['unique_code'])

def backwards(apps, schema_editor):
    Product = apps.get_model('products', 'Product')
    Product.objects.update(unique_code=None)

class Migration(migrations.Migration):
    dependencies = [
        ('products', '0009_product_unique_code'),
    ]
    operations = [
        migrations.RunPython(forwards, backwards),
    ]
