from django.conf import settings from django.db import migrations, models import base36 import random def random_code(): return base36.dumps( random.randint(pow(36, code_length - 2), pow(36, code_length - 1) - 1) ) # Migrate existing GroupedOrder `place` to the new `place` table def link_existing_place(apps, schema_editor): GroupedOrder = apps.get_model('order', 'GroupedOrder') Place = apps.get_model('order', 'Place') for grouped_order in GroupedOrder.objects.all(): if grouped_order.place: # Generate new random code for this existing place code = random_code() while Place.objects.all().filter(code=code): # Random code already exists, try a new random code code = random_code() place = Place.objects.create( name=grouped_order.place, code=code, ) grouped_order.places.add(place) grouped_order.save() class Migration(migrations.Migration): dependencies = [ ("order", "0029_set_phone_mandatory_for_existing_orders"), ] operations = [ migrations.CreateModel( name="Place", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("name", models.CharField(max_length=100, verbose_name="Nom du lieu de distribution")), ("code", models.CharField(max_length=20, verbose_name="Identifiant unique du lieu (raccourci)", unique=True)), ("orga", models.ForeignKey(on_delete=models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Organisateur·ice')), ("description", models.TextField(blank=True, null=True, verbose_name="Description")), ], ), migrations.AddField( model_name="groupedorder", name="places", field=models.ManyToManyField( to="order.place", verbose_name="Lieux de distribution", related_name="orders", ) ), migrations.RunPython(link_existing_place), migrations.RemoveField( model_name='groupedorder', name='place', ), migrations.AddField( model_name="order", name="place", field=models.ForeignKey(blank=True, null=True, on_delete=models.deletion.CASCADE, to='order.place'), ), migrations.AddIndex( model_name="groupedorder", index=models.Index(fields=["code"], name="order_group_code_50902d_idx"), ), migrations.AddIndex( model_name="place", index=models.Index(fields=["code"], name="order_place_code_4e2b27_idx"), ), ]