"""This file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license. """ import logging from django.db import migrations logger = logging.getLogger(__name__) def update_storage(storage, db_alias=None): logger.info(f'=> Migration for {storage._meta.label} statuses started') manager = storage.objects.using(db_alias) if db_alias else storage.objects manager.update(status='initialized') instances = list(manager.all().only('id', 'meta', 'status', 'last_sync_count', 'project_id')) for instance in instances: prefix = f'Project ID={instance.project_id} {instance}' # import source storages if 'import' in storage._meta.label_lower: links_manager = instance.links.using(db_alias) if db_alias else instance.links count = links_manager.count() - instance.last_sync_count if instance.last_sync_count else 0 instance.meta['tasks_existed'] = count if count > 0 else 0 if instance.meta['tasks_existed'] and instance.meta['tasks_existed'] > 0: instance.status = 'completed' logger.info(f'{prefix} tasks_existed = {instance.meta["tasks_existed"]}') # target export storages else: instance.meta['total_annotations'] = instance.last_sync_count if instance.last_sync_count and instance.last_sync_count > 0: instance.status = 'completed' logger.info(f'{prefix} total_annotations = {instance.last_sync_count}') manager.bulk_update(instances, fields=['meta', 'status'], batch_size=100) logger.info(f'=> Migration for {storage._meta.label} statuses finished') def forwards(apps, schema_editor): db_alias = schema_editor.connection.alias storages = [ apps.get_model('io_storages', 'AzureBlobImportStorage'), apps.get_model('io_storages', 'AzureBlobExportStorage'), apps.get_model('io_storages', 'GCSImportStorage'), apps.get_model('io_storages', 'GCSExportStorage'), apps.get_model('io_storages', 'LocalFilesImportStorage'), apps.get_model('io_storages', 'LocalFilesExportStorage'), apps.get_model('io_storages', 'RedisImportStorage'), apps.get_model('io_storages', 'RedisExportStorage'), apps.get_model('io_storages', 'S3ImportStorage'), apps.get_model('io_storages', 'S3ExportStorage'), ] for storage in storages: update_storage(storage, db_alias) def backwards(apps, schema_editor): pass class Migration(migrations.Migration): dependencies = [ ('io_storages', '0013_auto_20230420_0259'), ] operations = [ migrations.RunPython(forwards, backwards), ]