File indexing completed on 2026-06-26 08:40:25
0001 import django.db.models.deletion
0002 from django.db import migrations, models
0003
0004
0005 def backfill_campaign(apps, schema_editor):
0006 """Link each Dataset to its producing campaign and recompute the composed
0007 name from the campaign name. The campaign is taken from the dataset's
0008 producing task; failing that, from a Campaign whose name equals the legacy
0009 detector_version. The composed name is rebuilt from the same formula as
0010 Dataset.build_dataset_name (campaign name, falling back to detector_version),
0011 so for current data — where the two are equal — the stored name is
0012 unchanged."""
0013 Dataset = apps.get_model('pcs', 'Dataset')
0014 Campaign = apps.get_model('pcs', 'Campaign')
0015 by_name = {c.name: c for c in Campaign.objects.all()}
0016 rows = list(Dataset.objects.select_related(
0017 'physics_tag', 'evgen_tag', 'simu_tag', 'reco_tag', 'background_tag'
0018 ).prefetch_related('prod_tasks__campaign'))
0019 for ds in rows:
0020 camp = None
0021 for t in ds.prod_tasks.all():
0022 if t.campaign_id:
0023 camp = t.campaign
0024 break
0025 if camp is None:
0026 camp = by_name.get(ds.detector_version)
0027 ds.campaign = camp
0028 version = camp.name if camp else ds.detector_version
0029 name = (f"{ds.scope}.{version}.{ds.detector_config}"
0030 f".{ds.physics_tag.tag_label}.{ds.evgen_tag.tag_label}"
0031 f".{ds.simu_tag.tag_label}.{ds.reco_tag.tag_label}")
0032 if ds.background_tag_id:
0033 name = f"{name}.{ds.background_tag.tag_label}"
0034 if ds.sample_name:
0035 name = f"{name}.{ds.sample_name}"
0036 ds.composed_name = name
0037 if rows:
0038 Dataset.objects.bulk_update(
0039 rows, ['campaign', 'composed_name'], batch_size=500)
0040
0041
0042 def noop_reverse(apps, schema_editor):
0043 pass
0044
0045
0046 class Migration(migrations.Migration):
0047
0048 dependencies = [
0049 ('pcs', '0017_dataset_composed_name'),
0050 ]
0051
0052 operations = [
0053 migrations.AddField(
0054 model_name='dataset',
0055 name='campaign',
0056 field=models.ForeignKey(
0057 blank=True, null=True,
0058 on_delete=django.db.models.deletion.PROTECT,
0059 related_name='datasets', to='pcs.campaign',
0060 ),
0061 ),
0062 migrations.RunPython(backfill_campaign, noop_reverse),
0063 ]