From 2842ad12bb955651d1bc52c06c8e1b5cd83122eb Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Sat, 23 Mar 2019 14:49:33 +0000 Subject: [PATCH] Fix issue where cancelling one break session causes other breaks to get cancelled. Fixes #2699. Commit ready for merge. - Legacy-Id: 16085 --- .../migrations/0012_auto_20190323_0611.py | 40 ++++++++++++++++++ ietf/secr/meetings/views.py | 41 ++++++------------- 2 files changed, 53 insertions(+), 28 deletions(-) create mode 100644 ietf/meeting/migrations/0012_auto_20190323_0611.py diff --git a/ietf/meeting/migrations/0012_auto_20190323_0611.py b/ietf/meeting/migrations/0012_auto_20190323_0611.py new file mode 100644 index 000000000..e53bcf678 --- /dev/null +++ b/ietf/meeting/migrations/0012_auto_20190323_0611.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-03-23 06:11 +from __future__ import unicode_literals + +import datetime +from django.db import migrations + + +def copy_session(session): + session.pk = None + session.save() + return session + + +def forward(apps,schema_editor): + Meeting = apps.get_model('meeting','Meeting') + today = datetime.datetime.today() + meetings = Meeting.objects.filter(date__gt=today,type='ietf') + for meeting in meetings: + sessions = meeting.session_set.filter(type__in=['break','reg']) + for session in sessions: + assignments = session.timeslotassignments.filter(schedule=meeting.agenda) + if assignments.count() > 1: + ids = [ a.id for a in assignments ] + first_assignment = session.timeslotassignments.get(id=ids[0]) + original_session = first_assignment.session + for assignment in session.timeslotassignments.filter(id__in=ids[1:]): + assignment.session = copy_session(original_session) + assignment.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('meeting', '0011_auto_20190114_0550'), + ] + + operations = [ + migrations.RunPython(forward), + ] diff --git a/ietf/secr/meetings/views.py b/ietf/secr/meetings/views.py index bde64d4c4..94688866c 100644 --- a/ietf/secr/meetings/views.py +++ b/ietf/secr/meetings/views.py @@ -97,39 +97,24 @@ def build_nonsession(meeting,schedule): delta = meeting.date - last_meeting.date system = Person.objects.get(name='(System)') - secretariat = Group.objects.get(acronym='secretariat') for slot in TimeSlot.objects.filter(meeting=last_meeting,type__in=('break','reg','other','plenary','lead')): new_time = slot.time + delta - session = None - # create Session object for Tutorials to hold materials - if slot.type.slug in ('other','plenary'): - session = Session(meeting=meeting, - name=slot.name, - short=get_session(slot).short, - group=get_session(slot).group, - requested_by=system, - status_id='sched', - type=slot.type, - ) - else: - session, __ = Session.objects.get_or_create(meeting=meeting, - name=slot.name, - group=secretariat, - requested_by=system, - status_id='sched', - type=slot.type, - ) - session.save() + session = Session.objects.create(meeting=meeting, + name=slot.name, + short=get_session(slot).short, + group=get_session(slot).group, + requested_by=system, + status_id='sched', + type=slot.type) ts = TimeSlot.objects.create(type=slot.type, - meeting=meeting, - name=slot.name, - time=new_time, - duration=slot.duration, - show_location=slot.show_location) - if session: - SchedTimeSessAssignment.objects.create(schedule=schedule,session=session,timeslot=ts) + meeting=meeting, + name=slot.name, + time=new_time, + duration=slot.duration, + show_location=slot.show_location) + SchedTimeSessAssignment.objects.create(schedule=schedule,session=session,timeslot=ts) def check_nonsession(meeting,schedule): '''