Louis Mazin ac44c6ed8b nice
2026-10-13 23:47:19 +02:00

70 lines
4.8 KiB
Python

"""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')),
]