From 45e470f61e5c75f6fd911d5ab0264a438bcf79de Mon Sep 17 00:00:00 2001 From: Cameron Higby-Naquin Date: Fri, 6 Mar 2020 16:10:22 -0500 Subject: [PATCH] Copy affiliation data to incident targets We are phasing out the one-affiliation-per-incident affiliation model in favor of an Institution model, which can either be applied on a journalist by journalist basis, or to the incident as a whole, but as many as desired. For this, we must move data from the legacy affiliation field to the new Institution field. We do this using a data migration, with two pre- and post- migrations to work around this bug in djang-modelcluster: https://github.com/wagtail/django-modelcluster/issues/96 For the migration, we want these steps: 1. For each incident, examine the `affiliation` field 2. If it null or set to the default value of "Independent," discard it. The "independent" value is a placeholder for no definite affiliation and will not be used in the new scheme. 3. Create, if it doesn't already exist, an Institution with the title of the affiliation. 4. If this incident has any targeted journalists who do not already have an associated institution, associate the new institution with them. 5. If this incident does *not* have any targeted journalists, add the new institution as a target of this incident. This will fully bring any affiliation data into the institution model and apply it to the incidents that this data described. --- .../migrations/0043_auto_20200306_1646.py | 18 +++++++++ .../0044_copy_affiliation_to_institutions.py | 39 +++++++++++++++++++ .../migrations/0045_auto_20200306_1648.py | 19 +++++++++ 3 files changed, 76 insertions(+) create mode 100644 incident/migrations/0043_auto_20200306_1646.py create mode 100644 incident/migrations/0044_copy_affiliation_to_institutions.py create mode 100644 incident/migrations/0045_auto_20200306_1648.py diff --git a/incident/migrations/0043_auto_20200306_1646.py b/incident/migrations/0043_auto_20200306_1646.py new file mode 100644 index 000000000..5f8f342a7 --- /dev/null +++ b/incident/migrations/0043_auto_20200306_1646.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.10 on 2020-03-06 16:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('incident', '0042_copy_uncategorized_targets_to_gov_workers'), + ] + + operations = [ + migrations.AlterField( + model_name='incidentpage', + name='targeted_institutions', + field=models.ManyToManyField(blank=True, related_name='institutions_incidents', to='incident.Institution', verbose_name='Targeted Institutions'), + ), + ] diff --git a/incident/migrations/0044_copy_affiliation_to_institutions.py b/incident/migrations/0044_copy_affiliation_to_institutions.py new file mode 100644 index 000000000..fe9963345 --- /dev/null +++ b/incident/migrations/0044_copy_affiliation_to_institutions.py @@ -0,0 +1,39 @@ +# Generated by Django 2.2.10 on 2020-03-05 21:28 + +from django.db import migrations + + +def copy_affiliation(apps, schema_editor): + """Copy incident affiliations to """ + IncidentPage = apps.get_model('incident', 'IncidentPage') + Institution = apps.get_model('incident', 'Institution') + TargetedJournalist = apps.get_model('incident', 'TargetedJournalist') + + for incident in IncidentPage.objects.order_by('pk'): + if incident.affiliation and incident.affiliation != 'Independent': + inst, _ = Institution.objects.get_or_create(title=incident.affiliation) + + targeted_journos = incident.targeted_journalists.all() + if targeted_journos: + for tj in targeted_journos: + if not tj.institution: + tj.institution = inst + tj.save() + else: + incident.targeted_institutions.add(inst) + incident.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('incident', '0042_copy_uncategorized_targets_to_gov_workers'), + ] + + operations = [ + migrations.RunPython( + copy_affiliation, + reverse_code=migrations.RunPython.noop, + elidable=True, + ), + ] diff --git a/incident/migrations/0045_auto_20200306_1648.py b/incident/migrations/0045_auto_20200306_1648.py new file mode 100644 index 000000000..e171d854c --- /dev/null +++ b/incident/migrations/0045_auto_20200306_1648.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.10 on 2020-03-06 16:48 + +from django.db import migrations +import modelcluster.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('incident', '0044_auto_20200306_1646'), + ] + + operations = [ + migrations.AlterField( + model_name='incidentpage', + name='targeted_institutions', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='institutions_incidents', to='incident.Institution', verbose_name='Targeted Institutions'), + ), + ]