"""Introduce numbered user spaces without relocating any existing file bytes.""" import django.db.models.deletion from django.conf import settings from django.db import migrations, models import uuid def assign_existing(apps, schema_editor): User = apps.get_model(*settings.AUTH_USER_MODEL.split('.')) Space = apps.get_model('drive', 'DriveSpace') Item = apps.get_model('drive', 'DriveItem') Upload = apps.get_model('drive', 'UploadSession') users = list(User.objects.order_by('-is_superuser', '-is_staff', 'pk')) if not users: return root_user = users[0] root = Space.objects.create(user_id=root_user.pk, relative_path='root', display_name='Racine') for user in users[1:]: s = Space.objects.create(user_id=user.pk, parent_id=root.pk, relative_path='pending/%s' % uuid.uuid4().hex, display_name=user.username) s.directory_name = f'{s.pk - 1:04d}' s.relative_path = f'root/{s.directory_name}' s.save(update_fields=['directory_name','relative_path']) for s in Space.objects.all(): Item.objects.filter(owner_id=s.user_id).update(space_id=s.pk, is_shared=False) Upload.objects.filter(owner_id=s.user_id).update(space_id=s.pk) class Migration(migrations.Migration): dependencies = [('drive','0003_rename_drive_owner_parent_idx_drive_drive_owner_i_b49586_idx_and_more'), migrations.swappable_dependency(settings.AUTH_USER_MODEL)] operations = [ migrations.CreateModel(name='DriveSpace',fields=[ ('id',models.BigAutoField(primary_key=True,serialize=False)), ('directory_name',models.CharField(max_length=24,unique=True,null=True,blank=True)), ('relative_path',models.CharField(max_length=700,unique=True)), ('display_name',models.CharField(max_length=120)), ('can_view_parent',models.BooleanField(default=True)), ('can_write_parent',models.BooleanField(default=False)), ('can_invite',models.BooleanField(default=False)), ('created_at',models.DateTimeField(auto_now_add=True)), ('user',models.OneToOneField(to=settings.AUTH_USER_MODEL,on_delete=django.db.models.deletion.PROTECT,related_name='drive_space')), ('parent',models.ForeignKey(to='drive.drivespace',on_delete=django.db.models.deletion.PROTECT,related_name='children',null=True,blank=True)), ]), migrations.CreateModel(name='SpaceInvitation',fields=[ ('id',models.UUIDField(default=uuid.uuid4,editable=False,primary_key=True,serialize=False)), ('token_hash',models.CharField(max_length=64,unique=True)), ('can_view_parent',models.BooleanField(default=True)), ('can_write_parent',models.BooleanField(default=False)), ('can_invite',models.BooleanField(default=False)), ('expires_at',models.DateTimeField()), ('used_at',models.DateTimeField(null=True,blank=True)), ('revoked_at',models.DateTimeField(null=True,blank=True)), ('created_at',models.DateTimeField(auto_now_add=True)), ('created_by',models.ForeignKey(to=settings.AUTH_USER_MODEL,on_delete=django.db.models.deletion.PROTECT)), ('used_by',models.ForeignKey(to=settings.AUTH_USER_MODEL,on_delete=django.db.models.deletion.SET_NULL,related_name='redeemed_invitations',null=True,blank=True)), ('parent_space',models.ForeignKey(to='drive.drivespace',on_delete=django.db.models.deletion.CASCADE,related_name='invitations')), ]), migrations.AddField(model_name='driveitem',name='space',field=models.ForeignKey(to='drive.drivespace',on_delete=django.db.models.deletion.PROTECT,related_name='items',null=True)), migrations.AddField(model_name='driveitem',name='storage_location',field=models.CharField(max_length=1200,blank=True)), migrations.AddField(model_name='uploadsession',name='space',field=models.ForeignKey(to='drive.drivespace',on_delete=django.db.models.deletion.CASCADE,null=True)), migrations.RunPython(assign_existing,migrations.RunPython.noop), migrations.AlterField(model_name='driveitem',name='space',field=models.ForeignKey(to='drive.drivespace',on_delete=django.db.models.deletion.PROTECT,related_name='items')), migrations.AlterField(model_name='uploadsession',name='space',field=models.ForeignKey(to='drive.drivespace',on_delete=django.db.models.deletion.CASCADE)), migrations.AlterField(model_name='driveitem',name='owner',field=models.ForeignKey(to=settings.AUTH_USER_MODEL,on_delete=django.db.models.deletion.PROTECT,related_name='drive_items')), migrations.RemoveIndex(model_name='driveitem',name='drive_drive_owner_i_a6138a_idx'), migrations.AddIndex(model_name='driveitem',index=models.Index(fields=['space','trashed_at'],name='drive_space_trash_idx')), ]