PyInventory/inventory/migrations/0005_serve_uploads_by_djang...

78 wiersze
2.1 KiB
Python

# Generated by Django 2.2.17 on 2020-12-06 14:07
import os
from pathlib import Path
from django.conf import settings
from django.db import migrations
from django.utils import timezone
class Tee:
def __init__(self, f):
self.f = f
def __enter__(self):
return self
def __call__(self, line):
if not isinstance(line, str):
line = str(line)
print(line)
self.f.write(line)
self.f.write('\n')
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def forward_code(apps, schema_editor):
ItemImageModel = apps.get_model('inventory', 'ItemImageModel')
if ItemImageModel.objects.count() == 0:
# No image uploaded, yet -> nothing to do
return
print()
log_file_path = Path(settings.MEDIA_ROOT, 'migrate.log')
print('Generate log file here:', log_file_path)
with log_file_path.open('w+') as log, Tee(log) as log:
log('-' * 100)
log(timezone.now())
from django_tools.serve_media_app.models import generate_media_path
qs = ItemImageModel.objects.all()
for instance in qs:
log('_' * 100)
log(f'Migrate {instance}')
user = instance.user
image = instance.image
file_path = Path(str(image.file))
log(f'Old path: {file_path}')
media_path = generate_media_path(user, filename=file_path.name)
new_file_path = Path(settings.MEDIA_ROOT, media_path)
log(f'New path: {new_file_path}')
os.makedirs(new_file_path.parent, exist_ok=True)
os.link(file_path, new_file_path)
instance.image = media_path
instance.save(update_fields=('image',))
log('All new path created via hardlinks!')
log('Old path can be deleted.')
class Migration(migrations.Migration):
dependencies = [
('inventory', '0004_item_user_images'),
('serve_media_app', '0001_initial'),
]
operations = [
migrations.RunPython(forward_code, reverse_code=migrations.RunPython.noop),
]