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.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'})
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue