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:
parent
d332bfd91d
commit
9a82586e1b
|
@ -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'})
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue