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
This commit is contained in:
Henrik Levkowetz 2016-06-20 18:22:09 +00:00
parent d46a3d5768
commit 53fa91f7bb

View file

@ -3,6 +3,7 @@ from __future__ import unicode_literals
import datetime
import os
import re
import subprocess
from django.conf import settings
@ -33,7 +34,7 @@ def copy_materials(meeting):
os.makedirs(target)
subprocess.call(['rsync','-a',source,target])
def migrate_interim_meetings(apps, schema_editor):
def migrate_interim_meetings_forward(apps, schema_editor):
"""For all existing interim meetings create an official schedule and timeslot assignments"""
Meeting = apps.get_model("meeting", "Meeting")
Schedule = apps.get_model("meeting", "Schedule")
@ -44,31 +45,59 @@ def migrate_interim_meetings(apps, schema_editor):
meetings = Meeting.objects.filter(type='interim')
for meeting in meetings:
single_digit_serial = re.search('^(.+)-([0-9])$', meeting.number)
dirty = False
if single_digit_serial:
name = single_digit_serial.group(1)
serial = single_digit_serial.group(2)
meeting.number = "%s-%02d" % (name, int(serial))
dirty = True
if not meeting.agenda:
meeting.agenda = Schedule.objects.create(
meeting=meeting,
owner=system,
name='Official')
dirty = True
if dirty:
meeting.save()
dirty = False
session = meeting.session_set.first() # all legacy interim meetings have one session
time = datetime.datetime.combine(meeting.date, datetime.time(0))
slot = TimeSlot.objects.create(
meeting=meeting,
type_id="session",
duration=session.requested_duration,
time=time)
SchedTimeSessAssignment.objects.create(
if TimeSlot.objects.filter(meeting=meeting, type_id="session", time=time).exists():
slot = TimeSlot.objects.get(meeting=meeting, type_id="session", time=time).exists()
else:
slot = TimeSlot.objects.create(
meeting=meeting,
type_id="session",
duration=session.requested_duration,
time=time)
SchedTimeSessAssignment.objects.get_or_create(
timeslot=slot,
session=session,
schedule=meeting.agenda)
def migrate_interim_materials_files(apps, schema_editor):
def migrate_interim_meetings_backward(apps, schema_editor):
Meeting = apps.get_model("meeting", "Meeting")
meetings = Meeting.objects.filter(type='interim')
for meeting in meetings:
zero_digit_serial = re.search('^(.+)-0([0-9])$', meeting.number)
if zero_digit_serial:
name = zero_digit_serial.group(1)
serial = zero_digit_serial.group(2)
meeting.number = "%s-%s" % (name, serial)
meeting.save()
def migrate_interim_materials_files_forward(apps, schema_editor):
"""Copy interim materials files to new location"""
Meeting = apps.get_model("meeting", "Meeting")
for meeting in Meeting.objects.filter(type='interim'):
copy_materials(meeting)
def migrate_interim_materials_files_backward(apps, schema_editor):
"""Copy interim materials files to new location"""
pass
class Migration(migrations.Migration):
dependencies = [
@ -76,6 +105,6 @@ class Migration(migrations.Migration):
]
operations = [
migrations.RunPython(migrate_interim_meetings),
migrations.RunPython(migrate_interim_materials_files),
migrations.RunPython(migrate_interim_meetings_forward, migrate_interim_meetings_backward),
migrations.RunPython(migrate_interim_materials_files_forward, migrate_interim_materials_files_backward),
]