From 9a82586e1babbf388abdbd853388461c324046c7 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Wed, 31 Jul 2019 23:02:20 +0000 Subject: [PATCH] Fix issue where third session requests, which rerequire AD approval, get left with approved status, instead of scheduled, after Secretraiat sends out notifications of official schedule. Fixes #2765. Commit ready for merge. - Legacy-Id: 16607 --- ietf/secr/meetings/tests.py | 34 +++++++++++++++--------------- ietf/secr/meetings/views.py | 42 ++++--------------------------------- 2 files changed, 21 insertions(+), 55 deletions(-) diff --git a/ietf/secr/meetings/tests.py b/ietf/secr/meetings/tests.py index 5082cb6b9..ca22d37c0 100644 --- a/ietf/secr/meetings/tests.py +++ b/ietf/secr/meetings/tests.py @@ -18,6 +18,7 @@ from django.urls import reverse from ietf.group.models import Group, GroupEvent from ietf.meeting.models import Meeting, Room, TimeSlot, SchedTimeSessAssignment, Session from ietf.meeting.test_data import make_meeting_test_data +from ietf.name.models import SessionStatusName from ietf.person.models import Person from ietf.secr.meetings.forms import get_times from ietf.utils.mail import outbox @@ -91,19 +92,7 @@ class SecrMeetingTestCase(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual(Meeting.objects.count(),count + 1) new_meeting = Meeting.objects.get(number=number) - - # ensure new schedule is populated with specials sessions from previous meeting self.assertTrue(new_meeting.agenda) - self.assertTrue(meeting.agenda.assignments.filter(timeslot__type='break').count() > 0) - self.assertEqual( - meeting.agenda.assignments.filter(timeslot__type='break').count(), - new_meeting.agenda.assignments.filter(timeslot__type='break').count() - ) - self.assertTrue(meeting.agenda.assignments.filter(timeslot__type='reg').count() > 0) - self.assertEqual( - meeting.agenda.assignments.filter(timeslot__type='reg').count(), - new_meeting.agenda.assignments.filter(timeslot__type='reg').count() - ) self.assertEqual(new_meeting.attendees, None) def test_edit_meeting(self): @@ -159,16 +148,21 @@ class SecrMeetingTestCase(TestCase): def test_notifications(self): "Test Notifications" meeting = make_meeting_test_data() + mars_group = Group.objects.get(acronym='mars') + ames_group = Group.objects.get(acronym='ames') + ames_stsa = meeting.agenda.assignments.get(session__group=ames_group) + assert ames_stsa.session.status_id == 'schedw' + mars_stsa = meeting.agenda.assignments.get(session__group=mars_group) + mars_stsa.session.status = SessionStatusName.objects.get(slug='appr') + mars_stsa.session.save() url = reverse('ietf.secr.meetings.views.notifications',kwargs={'meeting_id':72}) self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) self.assertEqual(response.status_code, 200) q = PyQuery(response.content) self.assertEqual(q('#id_notification_list').html(),'ames, mars') - + # test that only changes since last notification show up - mars_group = Group.objects.get(acronym='mars') - ames_group = Group.objects.get(acronym='ames') now = datetime.datetime.now() then = datetime.datetime.now()+datetime.timedelta(hours=1) person = Person.objects.get(name="(System)") @@ -183,13 +177,19 @@ class SecrMeetingTestCase(TestCase): q = PyQuery(response.content) self.assertEqual(q('#id_notification_list').html(),'ames') - # test that email goes out + # test post: email goes out, status changed mailbox_before = len(outbox) self.client.login(username="secretary", password="secretary+password") response = self.client.post(url) self.assertEqual(response.status_code, 302) self.assertEqual(len(outbox), mailbox_before + 1) - + ames_stsa = meeting.agenda.assignments.get(session__group=ames_group) + print(ames_stsa.session.status_id) + assert ames_stsa.session.status_id == 'sched' + mars_stsa = meeting.agenda.assignments.get(session__group=mars_group) + print(mars_stsa.session.status_id) + assert mars_stsa.session.status_id == 'sched' + def test_meetings_rooms(self): meeting = make_meeting_test_data() url = reverse('ietf.secr.meetings.views.rooms',kwargs={'meeting_id':72,'schedule_name':'test-agenda'}) diff --git a/ietf/secr/meetings/views.py b/ietf/secr/meetings/views.py index f2b13790b..4a5f4d38b 100644 --- a/ietf/secr/meetings/views.py +++ b/ietf/secr/meetings/views.py @@ -1,3 +1,6 @@ +# Copyright The IETF Trust 2007-2019, All Rights Reserved +# -*- coding: utf-8 -*- + import datetime import os import time @@ -86,46 +89,12 @@ def build_timeslots(meeting,room=None): location=room, duration=t.duration) -def build_nonsession(meeting,schedule): - ''' - This function takes a meeting object and creates non-session records - for a new meeting, based on the last meeting - ''' - last_meeting = get_last_meeting(meeting) - if not last_meeting: - return None - - delta = meeting.date - last_meeting.date - system = Person.objects.get(name='(System)') - - for slot in TimeSlot.objects.filter(meeting=last_meeting,type__in=('break','reg','other','plenary','lead')): - new_time = slot.time + delta - 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) - SchedTimeSessAssignment.objects.create(schedule=schedule,session=session,timeslot=ts) - def check_nonsession(meeting,schedule): ''' Ensure non-session timeslots exist and have appropriate SchedTimeSessAssignment objects for the specified schedule. ''' slots = TimeSlot.objects.filter(meeting=meeting,type__in=('break','reg','other','plenary','lead','offagenda')) - if not slots: - build_nonsession(meeting,schedule) - return None - plenary = slots.filter(type='plenary').first() if plenary: assignments = plenary.sessionassignments.all() @@ -269,9 +238,6 @@ def add(request): meeting.save() populate_important_dates(meeting) - - # copy special sessions from previous meeting - build_nonsession(meeting,schedule) # Create Physical new meeting directory and subdirectories make_materials_directories(meeting) @@ -605,7 +571,7 @@ def notifications(request, meeting_id): # ensure session state is scheduled for ss in meeting.agenda.assignments.all(): session = ss.session - if session.status.slug == "schedw": + if session.status.slug in ["schedw", "appr"]: session.status_id = "sched" session.scheduled = datetime.datetime.now() session.save()