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
This commit is contained in:
Ryan Cross 2019-07-31 23:02:20 +00:00
parent d332bfd91d
commit 9a82586e1b
2 changed files with 21 additions and 55 deletions

View file

@ -18,6 +18,7 @@ from django.urls import reverse
from ietf.group.models import Group, GroupEvent from ietf.group.models import Group, GroupEvent
from ietf.meeting.models import Meeting, Room, TimeSlot, SchedTimeSessAssignment, Session from ietf.meeting.models import Meeting, Room, TimeSlot, SchedTimeSessAssignment, Session
from ietf.meeting.test_data import make_meeting_test_data from ietf.meeting.test_data import make_meeting_test_data
from ietf.name.models import SessionStatusName
from ietf.person.models import Person from ietf.person.models import Person
from ietf.secr.meetings.forms import get_times from ietf.secr.meetings.forms import get_times
from ietf.utils.mail import outbox from ietf.utils.mail import outbox
@ -91,19 +92,7 @@ class SecrMeetingTestCase(TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(Meeting.objects.count(),count + 1) self.assertEqual(Meeting.objects.count(),count + 1)
new_meeting = Meeting.objects.get(number=number) 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(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) self.assertEqual(new_meeting.attendees, None)
def test_edit_meeting(self): def test_edit_meeting(self):
@ -159,16 +148,21 @@ class SecrMeetingTestCase(TestCase):
def test_notifications(self): def test_notifications(self):
"Test Notifications" "Test Notifications"
meeting = make_meeting_test_data() 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}) url = reverse('ietf.secr.meetings.views.notifications',kwargs={'meeting_id':72})
self.client.login(username="secretary", password="secretary+password") self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url) response = self.client.get(url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
q = PyQuery(response.content) q = PyQuery(response.content)
self.assertEqual(q('#id_notification_list').html(),'ames, mars') self.assertEqual(q('#id_notification_list').html(),'ames, mars')
# test that only changes since last notification show up # 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() now = datetime.datetime.now()
then = datetime.datetime.now()+datetime.timedelta(hours=1) then = datetime.datetime.now()+datetime.timedelta(hours=1)
person = Person.objects.get(name="(System)") person = Person.objects.get(name="(System)")
@ -183,13 +177,19 @@ class SecrMeetingTestCase(TestCase):
q = PyQuery(response.content) q = PyQuery(response.content)
self.assertEqual(q('#id_notification_list').html(),'ames') self.assertEqual(q('#id_notification_list').html(),'ames')
# test that email goes out # test post: email goes out, status changed
mailbox_before = len(outbox) mailbox_before = len(outbox)
self.client.login(username="secretary", password="secretary+password") self.client.login(username="secretary", password="secretary+password")
response = self.client.post(url) response = self.client.post(url)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertEqual(len(outbox), mailbox_before + 1) 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): def test_meetings_rooms(self):
meeting = make_meeting_test_data() meeting = make_meeting_test_data()
url = reverse('ietf.secr.meetings.views.rooms',kwargs={'meeting_id':72,'schedule_name':'test-agenda'}) url = reverse('ietf.secr.meetings.views.rooms',kwargs={'meeting_id':72,'schedule_name':'test-agenda'})

View file

@ -1,3 +1,6 @@
# Copyright The IETF Trust 2007-2019, All Rights Reserved
# -*- coding: utf-8 -*-
import datetime import datetime
import os import os
import time import time
@ -86,46 +89,12 @@ def build_timeslots(meeting,room=None):
location=room, location=room,
duration=t.duration) 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): def check_nonsession(meeting,schedule):
''' '''
Ensure non-session timeslots exist and have appropriate SchedTimeSessAssignment objects Ensure non-session timeslots exist and have appropriate SchedTimeSessAssignment objects
for the specified schedule. for the specified schedule.
''' '''
slots = TimeSlot.objects.filter(meeting=meeting,type__in=('break','reg','other','plenary','lead','offagenda')) 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() plenary = slots.filter(type='plenary').first()
if plenary: if plenary:
assignments = plenary.sessionassignments.all() assignments = plenary.sessionassignments.all()
@ -269,9 +238,6 @@ def add(request):
meeting.save() meeting.save()
populate_important_dates(meeting) populate_important_dates(meeting)
# copy special sessions from previous meeting
build_nonsession(meeting,schedule)
# Create Physical new meeting directory and subdirectories # Create Physical new meeting directory and subdirectories
make_materials_directories(meeting) make_materials_directories(meeting)
@ -605,7 +571,7 @@ def notifications(request, meeting_id):
# ensure session state is scheduled # ensure session state is scheduled
for ss in meeting.agenda.assignments.all(): for ss in meeting.agenda.assignments.all():
session = ss.session session = ss.session
if session.status.slug == "schedw": if session.status.slug in ["schedw", "appr"]:
session.status_id = "sched" session.status_id = "sched"
session.scheduled = datetime.datetime.now() session.scheduled = datetime.datetime.now()
session.save() session.save()