70 lines
4.8 KiB
Python
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')),
|
|
]
|