from django.core.management.base import BaseCommand from parts.models import Component, Package, Distributor, Manufacturer import os import shutil class Command(BaseCommand): help = 'Migrate all media files to the current folder structure' def move_files_of_model(self, queryset): for comp in queryset: img_path = comp.image.name img_path = os.path.normpath(img_path) path_components = img_path.split(os.sep) if len(path_components) <= 2: self.stdout.write(f'Legacy path found: {img_path}. Will be moved') full_path_components = os.path.normpath(comp.image.path).split(os.sep) fname = full_path_components[-1] path_elem_count = len(full_path_components) full_path_components.insert(path_elem_count-1, str(fname[1])) full_path_components.insert(path_elem_count-1, str(fname[0])) dest_path = os.sep.join(full_path_components) # Move file os.makedirs(os.path.dirname(dest_path), exist_ok=True) shutil.move(comp.image.path, dest_path) # Update model new_rel_path_comps = path_components l = len(new_rel_path_comps) new_rel_path_comps.insert(l-1, str(fname[1])) new_rel_path_comps.insert(l-1, str(fname[0])) new_name = os.sep.join(new_rel_path_comps) self.stdout.write(f'New location: {dest_path}, new name: {new_name}') comp.image.name = new_name comp.save() def handle(self, *args, **kwargs): self.stdout.write('Querying components...') components = Component.objects.exclude(image='') self.stdout.write(f'Count of components with images: {components.count()}'); self.move_files_of_model(components) self.stdout.write('Querying packages...') pkgs = Package.objects.exclude(image='') self.stdout.write(f'Count of components with images: {pkgs.count()}'); self.move_files_of_model(pkgs) self.stdout.write('Querying manufacturers...') manufacturers = Manufacturer.objects.exclude(image='') self.stdout.write(f'Count of components with images: {manufacturers.count()}'); self.move_files_of_model(manufacturers) self.stdout.write('Querying distributors...') distris = Distributor.objects.exclude(image='') self.stdout.write(f'Count of components with images: {distris.count()}'); self.move_files_of_model(distris)