From ed69d4c617d640522a0270dec4948ab26324ea18 Mon Sep 17 00:00:00 2001 From: Joseph Muller Date: Mon, 20 Jan 2025 15:58:17 +0000 Subject: [PATCH] feat #3168 Migrations for existing data --- ...0100_location_organization_affiliation.py} | 24 ++--- .../0101_migrate_affiliation_institution.py | 95 +++++++++++++++++++ ...ccount_country_affiliation_organization.py | 29 ++++++ ...ove_preprintauthor_affiliation_and_more.py | 1 + ...80_remove_frozenauthor_country_and_more.py | 1 + 5 files changed, 132 insertions(+), 18 deletions(-) rename src/core/migrations/{0097_location_organization_remove_account_country_and_more.py => 0100_location_organization_affiliation.py} (96%) create mode 100644 src/core/migrations/0101_migrate_affiliation_institution.py create mode 100644 src/core/migrations/0102_remove_account_country_affiliation_organization.py diff --git a/src/core/migrations/0097_location_organization_remove_account_country_and_more.py b/src/core/migrations/0100_location_organization_affiliation.py similarity index 96% rename from src/core/migrations/0097_location_organization_remove_account_country_and_more.py rename to src/core/migrations/0100_location_organization_affiliation.py index d56d10394..761eee25d 100644 --- a/src/core/migrations/0097_location_organization_remove_account_country_and_more.py +++ b/src/core/migrations/0100_location_organization_affiliation.py @@ -9,9 +9,8 @@ class Migration(migrations.Migration): dependencies = [ - ('repository', '0044_remove_preprintauthor_affiliation_and_more'), - ('submission', '0080_remove_frozenauthor_country_and_more'), ('core', '0099_alter_accountrole_options'), + ('utils', '0035_rorimport_rorimporterror'), ] operations = [ @@ -35,18 +34,7 @@ class Migration(migrations.Migration): ('website', models.CharField(blank=True, max_length=500)), ('locations', models.ManyToManyField(blank=True, null=True, to='core.location')), ], - ), - migrations.RemoveField( - model_name='account', - name='country', - ), - migrations.RemoveField( - model_name='account', - name='department', - ), - migrations.RemoveField( - model_name='account', - name='institution', + options={'ordering': ['ror_display__value']}, ), migrations.CreateModel( name='OrganizationName', @@ -67,16 +55,16 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(blank=True, max_length=300, verbose_name='Title, position, or role')), ('department', models.CharField(blank=True, max_length=300, verbose_name='Department, unit, or team')), - ('is_primary', models.BooleanField(default=False)), - ('start', models.DateField(blank=True, null=True)), - ('end', models.DateField(blank=True, null=True)), + ('is_primary', models.BooleanField(default=False, help_text='Each account can have one primary affiliation')), + ('start', models.DateField(blank=True, null=True, verbose_name='Start date')), + ('end', models.DateField(blank=True, null=True, help_text='Leave empty for a current affiliation', verbose_name='End date')), ('account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ('frozen_author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='submission.frozenauthor')), ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.organization')), ('preprint_author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='repository.preprintauthor')), ], options={ - 'ordering': ['-pk'], + 'ordering': ['is_primary', '-pk'], }, ), migrations.AddConstraint( diff --git a/src/core/migrations/0101_migrate_affiliation_institution.py b/src/core/migrations/0101_migrate_affiliation_institution.py new file mode 100644 index 000000000..2f8140c4b --- /dev/null +++ b/src/core/migrations/0101_migrate_affiliation_institution.py @@ -0,0 +1,95 @@ +# Generated by Django 4.2.16 on 2025-01-17 16:21 + +from django.db import migrations +from django.db.models import Q + + +def naive_create_organization(apps, old_institution=None): + if not old_institution: + return None + + Organization = apps.get_model("core", "Organization") + OrganizationName = apps.get_model("core", "OrganizationName") + + organization = Organization.objects.create() + OrganizationName.objects.create( + value=old_institution, + custom_label_for=organization, + ) + return organization + + +def naive_create_affiliation( + apps, + old_institution, + old_department, + account=None, + frozen_author=None, + preprint_author=None, +): + Affiliation = apps.get_model("core", "Affiliation") + organization = naive_create_organization(apps, old_institution) + + # Create or update the actual affiliation if the associated + # account / frozen author / preprint author has been saved already + affiliation = Affiliation.objects.create( + account=account, + frozen_author=frozen_author, + preprint_author=preprint_author, + organization=organization, + department=old_department, + is_primary=True, + ) + return affiliation + + +def migrate_affiliation_institution(apps, schema_editor): + Account = apps.get_model("core", "Account") + FrozenAuthor = apps.get_model("submission", "FrozenAuthor") + PreprintAuthor = apps.get_model("repository", "PreprintAuthor") + + for account in Account.objects.filter( + ~Q(institution__exact='') + | ~Q(department__exact='') + ): + naive_create_affiliation( + apps, + account.institution, + account.department, + account=account, + ) + + for frozen_author in FrozenAuthor.objects.filter( + ~Q(institution__exact='') + | ~Q(department__exact='') + ): + naive_create_affiliation( + apps, + frozen_author.institution, + frozen_author.department, + frozen_author=frozen_author, + ) + + for preprint_author in PreprintAuthor.objects.filter( + affiliation__isnull=True, + ): + naive_create_affiliation( + apps, + preprint_author.affiliation, + '', + preprint_author=preprint_author, + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0100_location_organization_affiliation'), + ] + + operations = [ + migrations.RunPython( + migrate_affiliation_institution, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/src/core/migrations/0102_remove_account_country_affiliation_organization.py b/src/core/migrations/0102_remove_account_country_affiliation_organization.py new file mode 100644 index 000000000..08c95a07f --- /dev/null +++ b/src/core/migrations/0102_remove_account_country_affiliation_organization.py @@ -0,0 +1,29 @@ +# Generated by Django 4.2.14 on 2024-07-26 13:26 + +import core.models +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('submission', '0080_remove_frozenauthor_country_and_more'), + ('core', '0101_migrate_affiliation_institution'), + ] + + operations = [ + migrations.RemoveField( + model_name='account', + name='country', + ), + migrations.RemoveField( + model_name='account', + name='department', + ), + migrations.RemoveField( + model_name='account', + name='institution', + ), + ] diff --git a/src/repository/migrations/0044_remove_preprintauthor_affiliation_and_more.py b/src/repository/migrations/0044_remove_preprintauthor_affiliation_and_more.py index 2391580b4..bd7ef2839 100644 --- a/src/repository/migrations/0044_remove_preprintauthor_affiliation_and_more.py +++ b/src/repository/migrations/0044_remove_preprintauthor_affiliation_and_more.py @@ -6,6 +6,7 @@ class Migration(migrations.Migration): dependencies = [ + ('core', '0101_migrate_affiliation_institution'), ('repository', '0045_historicalrepository_display_public_metrics_and_more'), ] diff --git a/src/submission/migrations/0080_remove_frozenauthor_country_and_more.py b/src/submission/migrations/0080_remove_frozenauthor_country_and_more.py index 0c5ccc0f9..e2c02de91 100644 --- a/src/submission/migrations/0080_remove_frozenauthor_country_and_more.py +++ b/src/submission/migrations/0080_remove_frozenauthor_country_and_more.py @@ -6,6 +6,7 @@ class Migration(migrations.Migration): dependencies = [ + ('core', '0101_migrate_affiliation_institution'), ('submission', '0084_remove_article_jats_article_type_and_more'), ]