Skip to content

Commit 53fa91f

Browse files
committed
Enhanced the interim_meetings data migration to also update the interim meeting numbers to consistently use zero-padded two-digit serial numbers, in line with how new interim meeting numbers are generated. Added reverse migrations. Made the migration accept existing TimeSlot and Assignments, if found.
- Legacy-Id: 11421
1 parent d46a3d5 commit 53fa91f

1 file changed

Lines changed: 39 additions & 10 deletions

File tree

ietf/meeting/migrations/0024_migrate_interim_meetings.py

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import datetime
55
import os
6+
import re
67
import subprocess
78

89
from django.conf import settings
@@ -33,7 +34,7 @@ def copy_materials(meeting):
3334
os.makedirs(target)
3435
subprocess.call(['rsync','-a',source,target])
3536

36-
def migrate_interim_meetings(apps, schema_editor):
37+
def migrate_interim_meetings_forward(apps, schema_editor):
3738
"""For all existing interim meetings create an official schedule and timeslot assignments"""
3839
Meeting = apps.get_model("meeting", "Meeting")
3940
Schedule = apps.get_model("meeting", "Schedule")
@@ -44,38 +45,66 @@ def migrate_interim_meetings(apps, schema_editor):
4445

4546
meetings = Meeting.objects.filter(type='interim')
4647
for meeting in meetings:
48+
single_digit_serial = re.search('^(.+)-([0-9])$', meeting.number)
49+
dirty = False
50+
if single_digit_serial:
51+
name = single_digit_serial.group(1)
52+
serial = single_digit_serial.group(2)
53+
meeting.number = "%s-%02d" % (name, int(serial))
54+
dirty = True
4755
if not meeting.agenda:
4856
meeting.agenda = Schedule.objects.create(
4957
meeting=meeting,
5058
owner=system,
5159
name='Official')
60+
dirty = True
61+
if dirty:
5262
meeting.save()
63+
dirty = False
5364
session = meeting.session_set.first() # all legacy interim meetings have one session
5465
time = datetime.datetime.combine(meeting.date, datetime.time(0))
55-
slot = TimeSlot.objects.create(
56-
meeting=meeting,
57-
type_id="session",
58-
duration=session.requested_duration,
59-
time=time)
60-
SchedTimeSessAssignment.objects.create(
66+
if TimeSlot.objects.filter(meeting=meeting, type_id="session", time=time).exists():
67+
slot = TimeSlot.objects.get(meeting=meeting, type_id="session", time=time).exists()
68+
else:
69+
slot = TimeSlot.objects.create(
70+
meeting=meeting,
71+
type_id="session",
72+
duration=session.requested_duration,
73+
time=time)
74+
SchedTimeSessAssignment.objects.get_or_create(
6175
timeslot=slot,
6276
session=session,
6377
schedule=meeting.agenda)
6478

65-
def migrate_interim_materials_files(apps, schema_editor):
79+
def migrate_interim_meetings_backward(apps, schema_editor):
80+
Meeting = apps.get_model("meeting", "Meeting")
81+
meetings = Meeting.objects.filter(type='interim')
82+
for meeting in meetings:
83+
zero_digit_serial = re.search('^(.+)-0([0-9])$', meeting.number)
84+
if zero_digit_serial:
85+
name = zero_digit_serial.group(1)
86+
serial = zero_digit_serial.group(2)
87+
meeting.number = "%s-%s" % (name, serial)
88+
meeting.save()
89+
90+
def migrate_interim_materials_files_forward(apps, schema_editor):
6691
"""Copy interim materials files to new location"""
6792
Meeting = apps.get_model("meeting", "Meeting")
6893

6994
for meeting in Meeting.objects.filter(type='interim'):
7095
copy_materials(meeting)
7196

97+
def migrate_interim_materials_files_backward(apps, schema_editor):
98+
"""Copy interim materials files to new location"""
99+
pass
100+
72101
class Migration(migrations.Migration):
73102

74103
dependencies = [
75104
('meeting', '0023_session_remote_instructions'),
76105
]
77106

78107
operations = [
79-
migrations.RunPython(migrate_interim_meetings),
80-
migrations.RunPython(migrate_interim_materials_files),
108+
migrations.RunPython(migrate_interim_meetings_forward, migrate_interim_meetings_backward),
109+
migrations.RunPython(migrate_interim_materials_files_forward, migrate_interim_materials_files_backward),
81110
]

0 commit comments

Comments
 (0)