datatracker/ietf/meeting/migrations/0024_migrate_interim_meetings.py

111 lines
4.1 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import datetime
import os
import re
import subprocess
from django.conf import settings
from django.db import migrations
def get_old_path(meeting):
"""Return old path to interim materials file"""
path = os.path.join(settings.AGENDA_PATH,
'interim',
meeting.date.strftime('%Y'),
meeting.date.strftime('%m'),
meeting.date.strftime('%d'),
meeting.session_set.first().group.acronym) + '/'
#doc.type_id,
#doc.external_url)
return path
def get_new_path(meeting):
"""Returns new path to document"""
return os.path.join(settings.AGENDA_PATH,meeting.number) + '/'
def copy_materials(meeting):
"""Copy all materials files to new location on disk"""
source = get_old_path(meeting)
target = get_new_path(meeting)
if not os.path.isdir(target):
os.makedirs(target)
subprocess.call(['rsync','-a',source,target])
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")
TimeSlot = apps.get_model("meeting", "TimeSlot")
SchedTimeSessAssignment = apps.get_model("meeting", "SchedTimeSessAssignment")
Person = apps.get_model("person", "Person")
system = Person.objects.get(name="(system)")
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))
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_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 = [
('meeting', '0023_session_remote_instructions'),
]
operations = [
migrations.RunPython(migrate_interim_meetings_forward, migrate_interim_meetings_backward),
migrations.RunPython(migrate_interim_materials_files_forward, migrate_interim_materials_files_backward),
]