From 9a82586e1babbf388abdbd853388461c324046c7 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Wed, 31 Jul 2019 23:02:20 +0000 Subject: [PATCH 1/3] 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() From 0bbdbca8acbba15ff5242fd5c1ed8ced87163bda Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Tue, 3 Sep 2019 21:03:19 +0000 Subject: [PATCH 2/3] Add migration to remove any break / registration sessions that have already been created for future meetings. Goes with changes for #2713. Commit ready for merge. - Legacy-Id: 16701 --- .../0019_remove_future_break_sessions.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ietf/meeting/migrations/0019_remove_future_break_sessions.py diff --git a/ietf/meeting/migrations/0019_remove_future_break_sessions.py b/ietf/meeting/migrations/0019_remove_future_break_sessions.py new file mode 100644 index 000000000..632e6b11c --- /dev/null +++ b/ietf/meeting/migrations/0019_remove_future_break_sessions.py @@ -0,0 +1,33 @@ +# Copyright The IETF Trust 2019, All Rights Reserved +# -*- coding: utf-8 -*- +# Generated by Django 1.11.22 on 2019-07-22 14:56 + +from __future__ import unicode_literals + +import datetime +from django.db import migrations + + +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: + meeting.agenda.assignments.all().delete() + meeting.session_set.all().delete() + meeting.timeslot_set.all().delete() + + +def backward(apps, schema_editor): + return + + +class Migration(migrations.Migration): + + dependencies = [ + ('meeting', '0018_document_primary_key_cleanup'), + ] + + operations = [ + migrations.RunPython(forward, backward), + ] From f950f1b8ead8926b25a84a73f6623c3a0e6be443 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Tue, 3 Sep 2019 21:16:10 +0000 Subject: [PATCH 3/3] Remove temporary print statements. Commit ready for merge. - Legacy-Id: 16702 --- ietf/secr/meetings/tests.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ietf/secr/meetings/tests.py b/ietf/secr/meetings/tests.py index ca22d37c0..19afb30fb 100644 --- a/ietf/secr/meetings/tests.py +++ b/ietf/secr/meetings/tests.py @@ -184,10 +184,8 @@ class SecrMeetingTestCase(TestCase): 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):