Skip to content

Commit 55b430b

Browse files
committed
Merged in [12748] from rcross@amsl.com:
Fixes ietf-tools#2172. Add Requested Resources and People who must be there, to email notifications of session requests. - Legacy-Id: 12757 Note: SVN reference [12748] has been migrated to Git commit eeb35e9
2 parents d433b98 + eeb35e9 commit 55b430b

6 files changed

Lines changed: 68 additions & 19 deletions

File tree

ietf/secr/sreq/forms.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from django import forms
22

3+
import debug # pyflakes:ignore
4+
35
from ietf.group.models import Group
46
from ietf.meeting.models import ResourceAssociation
57
from ietf.person.fields import SearchablePersonsField
@@ -66,7 +68,7 @@ class SessionForm(forms.Form):
6668
wg_selector2 = forms.ChoiceField(choices=WG_CHOICES,required=False)
6769
wg_selector3 = forms.ChoiceField(choices=WG_CHOICES,required=False)
6870
third_session = forms.BooleanField(required=False)
69-
resources = forms.MultipleChoiceField(choices=[(x.pk,x.desc) for x in ResourceAssociation.objects.all()], widget=forms.CheckboxSelectMultiple,required=False)
71+
resources = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,required=False)
7072
bethere = SearchablePersonsField(label="Must be present", required=False)
7173

7274
def __init__(self, *args, **kwargs):
@@ -82,7 +84,8 @@ def __init__(self, *args, **kwargs):
8284
self.fields['wg_selector3'].widget.attrs['onChange'] = "document.form_post.conflict3.value=document.form_post.conflict3.value + ' ' + this.options[this.selectedIndex].value; return handleconflictfield(3);"
8385
self.fields['wg_selector3'].widget.attrs['onClick'] = "return check_prior_conflict(3);"
8486
self.fields['third_session'].widget.attrs['onClick'] = "if (document.form_post.num_session.selectedIndex < 2) { alert('Cannot use this field - Number of Session is not set to 2'); return false; } else { if (this.checked==true) { document.form_post.length_session3.disabled=false; } else { document.form_post.length_session3.value=0;document.form_post.length_session3.disabled=true; } }"
85-
87+
self.fields["resources"].choices = [(x.pk,x.desc) for x in ResourceAssociation.objects.all() ]
88+
8689
# check third_session checkbox if instance and length_session3
8790
# assert False, (self.instance, self.fields['length_session3'].initial)
8891
if self.initial and 'length_session3' in self.initial:

ietf/secr/sreq/tests.py

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
from django.core.urlresolvers import reverse
22

3+
import debug # pyflakes:ignore
4+
35
from ietf.utils.test_utils import TestCase, unicontent
46
from ietf.group.models import Group
5-
#from ietf.meeting.models import Session
6-
#from ietf.utils.test_data import make_test_data
7-
from ietf.meeting.test_data import make_meeting_test_data as make_test_data
7+
from ietf.meeting.models import Meeting, Session, ResourceAssociation
8+
from ietf.meeting.test_data import make_meeting_test_data
89
from ietf.utils.mail import outbox, empty_outbox
10+
from ietf.utils.test_data import make_test_data
911

1012
from pyquery import PyQuery
1113

1214
SECR_USER='secretary'
1315

1416
class SreqUrlTests(TestCase):
1517
def test_urls(self):
16-
make_test_data()
18+
make_meeting_test_data()
1719

1820
self.client.login(username="secretary", password="secretary+password")
1921

@@ -29,7 +31,7 @@ def test_urls(self):
2931

3032
class SessionRequestTestCase(TestCase):
3133
def test_main(self):
32-
make_test_data()
34+
make_meeting_test_data()
3335
url = reverse('sessions')
3436
self.client.login(username="secretary", password="secretary+password")
3537
r = self.client.get(url)
@@ -42,20 +44,20 @@ def test_main(self):
4244
class SubmitRequestCase(TestCase):
4345
def test_submit_request(self):
4446
make_test_data()
45-
acronym = Group.objects.all()[0].acronym
46-
url = reverse('sessions_new',kwargs={'acronym':acronym})
47+
group = Group.objects.get(acronym='mars')
48+
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
4749
post_data = {'num_session':'1',
4850
'length_session1':'3600',
4951
'attendees':'10',
5052
'conflict1':'',
5153
'comments':'need projector'}
5254
self.client.login(username="secretary", password="secretary+password")
5355
r = self.client.post(url,post_data)
54-
self.assertEqual(r.status_code, 302)
56+
self.assertRedirects(r, reverse('sessions_confirm', kwargs={'acronym':group.acronym}))
5557

5658
def test_submit_request_invalid(self):
5759
make_test_data()
58-
group = Group.objects.filter(type='wg').first()
60+
group = Group.objects.get(acronym='mars')
5961
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
6062
post_data = {'num_session':'2',
6163
'length_session1':'3600',
@@ -69,9 +71,42 @@ def test_submit_request_invalid(self):
6971
self.assertEqual(len(q('#session-request-form')),1)
7072
self.assertTrue('You must enter a length for all sessions' in unicontent(r))
7173

74+
def test_request_notification(self):
75+
make_test_data()
76+
meeting = Meeting.objects.filter(type='ietf').first()
77+
group = Group.objects.get(acronym='ames')
78+
ad = group.parent.role_set.filter(name='ad').first().person
79+
resource = ResourceAssociation.objects.first()
80+
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
81+
confirm_url = reverse('sessions_confirm',kwargs={'acronym':group.acronym})
82+
len_before = len(outbox)
83+
post_data = {'num_session':'1',
84+
'length_session1':'3600',
85+
'attendees':'10',
86+
'bethere':str(ad.pk),
87+
'conflict1':'',
88+
'comments':'',
89+
'resources': resource.pk}
90+
self.client.login(username="ameschairman", password="ameschairman+password")
91+
# submit
92+
r = self.client.post(url,post_data)
93+
self.assertRedirects(r, confirm_url)
94+
# confirm
95+
r = self.client.post(confirm_url,{'submit':'Submit'})
96+
self.assertRedirects(r, reverse('sessions'))
97+
self.assertEqual(len(outbox),len_before+1)
98+
notification = outbox[-1]
99+
notification_payload = unicode(notification.get_payload(decode=True),"utf-8","replace")
100+
session = Session.objects.get(meeting=meeting,group=group)
101+
self.assertEqual(session.resources.count(),1)
102+
self.assertEqual(session.people_constraints.count(),1)
103+
resource = session.resources.first()
104+
self.assertTrue(resource.desc in notification_payload)
105+
self.assertTrue(ad.ascii_name() in notification_payload)
106+
72107
class LockAppTestCase(TestCase):
73108
def test_edit_request(self):
74-
meeting = make_test_data()
109+
meeting = make_meeting_test_data()
75110
meeting.session_request_lock_message='locked'
76111
meeting.save()
77112
group = Group.objects.get(acronym='mars')
@@ -83,7 +118,7 @@ def test_edit_request(self):
83118
self.assertEqual(len(q(':disabled[name="submit"]')), 1)
84119

85120
def test_view_request(self):
86-
meeting = make_test_data()
121+
meeting = make_meeting_test_data()
87122
meeting.session_request_lock_message='locked'
88123
meeting.save()
89124
group = Group.objects.get(acronym='mars')
@@ -95,7 +130,7 @@ def test_view_request(self):
95130
self.assertEqual(len(q(':disabled[name="edit"]')), 1)
96131

97132
def test_new_request(self):
98-
meeting = make_test_data()
133+
meeting = make_meeting_test_data()
99134
meeting.session_request_lock_message='locked'
100135
meeting.save()
101136
group = Group.objects.get(acronym='mars')
@@ -121,8 +156,7 @@ class EditRequestCase(TestCase):
121156
class NotMeetingCase(TestCase):
122157

123158
def test_not_meeting(self):
124-
125-
make_test_data()
159+
make_meeting_test_data()
126160
group = Group.objects.get(acronym='mars')
127161
url = reverse('sessions_no_session',kwargs={'acronym':group.acronym})
128162
self.client.login(username="secretary", password="secretary+password")

ietf/secr/sreq/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from django.shortcuts import render_to_response, get_object_or_404, redirect
77
from django.template import RequestContext
88

9+
import debug # pyflakes:ignore
10+
911
from ietf.group.models import Group
1012
from ietf.ietfauth.utils import has_role, role_required
1113
from ietf.meeting.models import Meeting, Session, Constraint, ResourceAssociation

ietf/secr/templates/includes/session_info.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ Conflicts to Avoid:
1313
{% if session.conflict3 %} Third Priority: {{ session.conflict3 }}{% endif %}
1414

1515

16+
People who must be present:
17+
{% for person in session.bethere %} {{ person.ascii_name }}
18+
{% endfor %}
19+
Resources Requested:
20+
{% for resource in session.resources %} {{ resource.desc }}
21+
{% endfor %}
1622
Special Requests:
1723
{{ session.comments }}
1824
---------------------------------------------------------

ietf/secr/templates/includes/sessions_request_form.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
</tr>
5454
<tr class="bg2"><td>Resources requested:</td>
5555
<td>
56-
{{ form.resources }}
56+
{{ form.resources.errors }} {{ form.resources }}
5757
</td>
5858
</tr>
5959
<tr class="bg1">

ietf/utils/test_data.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
from ietf.group.models import Group, GroupHistory, Role, RoleHistory
1111
from ietf.iesg.models import TelechatDate
1212
from ietf.ipr.models import HolderIprDisclosure, IprDocRel, IprDisclosureStateName, IprLicenseTypeName
13-
from ietf.meeting.models import Meeting
14-
from ietf.name.models import StreamName, DocRelationshipName
13+
from ietf.meeting.models import Meeting, ResourceAssociation
14+
from ietf.name.models import StreamName, DocRelationshipName, RoomResourceName
1515
from ietf.person.models import Person, Email
1616
from ietf.group.utils import setup_default_community_list_for_group
1717
from ietf.review.models import (ReviewRequest, ReviewerSettings, ReviewResultName, ReviewTypeName, ReviewTeamSettings )
@@ -377,6 +377,10 @@ def rfc_for_status_change_test_factory(name,rfc_num,std_level_id):
377377
rfc_for_status_change_test_factory('draft-ietf-random-otherthing',9998,'inf')
378378
rfc_for_status_change_test_factory('draft-was-never-issued',14,'unkn')
379379

380+
# Session Request ResourceAssociation
381+
name = RoomResourceName.objects.get(slug='project')
382+
ResourceAssociation.objects.create(name=name,icon='projector.png',desc='Projector in room')
383+
380384
# Instances of the remaining document types
381385
# (Except liaison, liai-att, and recording which the code in ietf.doc does not use...)
382386
# Meeting-related documents are created in make_meeting_test_data, and

0 commit comments

Comments
 (0)