Skip to content

Commit

Permalink
Copy affiliation data to incident targets
Browse files Browse the repository at this point in the history
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:
    wagtail/django-modelcluster#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.
  • Loading branch information
chigby committed Mar 6, 2020
1 parent a5a51fb commit 45e470f
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
18 changes: 18 additions & 0 deletions incident/migrations/0043_auto_20200306_1646.py
Original file line number Diff line number Diff line change
@@ -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'),
),
]
39 changes: 39 additions & 0 deletions incident/migrations/0044_copy_affiliation_to_institutions.py
Original file line number Diff line number Diff line change
@@ -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,
),
]
19 changes: 19 additions & 0 deletions incident/migrations/0045_auto_20200306_1648.py
Original file line number Diff line number Diff line change
@@ -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'),
),
]

0 comments on commit 45e470f

Please sign in to comment.