Skip to content

Commit 06f6b12

Browse files
committed
Refine volunteer list view. Show rfc8989 paths. Commit ready for merge.
- Legacy-Id: 19139
1 parent 9a0d818 commit 06f6b12

4 files changed

Lines changed: 109 additions & 26 deletions

File tree

ietf/nomcom/tests.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
key
4242
from ietf.nomcom.utils import get_nomcom_by_year, make_nomineeposition, \
4343
get_hash_nominee_position, is_eligible, list_eligible, \
44-
get_eligibility_date, suggest_affiliation
44+
get_eligibility_date, suggest_affiliation, \
45+
decorate_volunteers_with_qualifications
4546
from ietf.person.factories import PersonFactory, EmailFactory
4647
from ietf.person.models import Email, Person
4748
from ietf.stats.models import MeetingRegistration
@@ -2529,3 +2530,49 @@ def test_suggest_affiliation(self):
25292530
self.assertEqual(suggest_affiliation(person), 'volunteer_affil')
25302531
MeetingRegistrationFactory(person=person, affiliation='meeting_affil')
25312532
self.assertEqual(suggest_affiliation(person), 'meeting_affil')
2533+
2534+
class VolunteerDecoratorUnitTests(TestCase):
2535+
def test_decorate_volunteers_with_qualifications(self):
2536+
nomcom = NomComFactory(group__acronym='nomcom2021', populate_personnel=False, first_call_for_volunteers=datetime.date(2021,5,15))
2537+
elig_date = get_eligibility_date(nomcom)
2538+
Role.objects.filter(name_id__in=('chair','secr')).delete()
2539+
2540+
meeting_person = PersonFactory()
2541+
meetings = [MeetingFactory(number=number, date=date, type_id='ietf') for number,date in [
2542+
('110', datetime.date(2021, 3, 6)),
2543+
('109', datetime.date(2020, 11, 14)),
2544+
('108', datetime.date(2020, 7, 25)),
2545+
('107', datetime.date(2020, 3, 21)),
2546+
('106', datetime.date(2019, 11, 16)),
2547+
]]
2548+
for m in meetings:
2549+
MeetingRegistrationFactory(meeting=m,person=meeting_person)
2550+
nomcom.volunteer_set.create(person=meeting_person)
2551+
2552+
office_person = PersonFactory()
2553+
RoleHistoryFactory(
2554+
name_id='chair',
2555+
group__time= elig_date - datetime.timedelta(days=365),
2556+
group__group__state_id='conclude',
2557+
person=office_person,
2558+
)
2559+
nomcom.volunteer_set.create(person=office_person)
2560+
2561+
author_person = PersonFactory()
2562+
for i in range(2):
2563+
da = WgDocumentAuthorFactory(person=author_person)
2564+
DocEventFactory(type='published_rfc',doc=da.document,time=datetime.date(elig_date.year-3,elig_date.month,elig_date.day))
2565+
nomcom.volunteer_set.create(person=author_person)
2566+
2567+
volunteers = nomcom.volunteer_set.all()
2568+
decorate_volunteers_with_qualifications(volunteers,nomcom=nomcom)
2569+
2570+
self.assertEqual(len(volunteers), 3)
2571+
for v in volunteers:
2572+
if v.person == meeting_person:
2573+
self.assertEqual(v.qualifications,'path_1')
2574+
if v.person == office_person:
2575+
self.assertEqual(v.qualifications,'path_2')
2576+
if v.person == author_person:
2577+
self.assertEqual(v.qualifications,'path_3')
2578+

ietf/nomcom/utils.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,25 @@ def list_eligible(nomcom=None, date=None, base_qs=None):
500500
else:
501501
return Person.objects.none()
502502

503+
def decorate_volunteers_with_qualifications(volunteers, nomcom=None, date=None, base_qs=None):
504+
if not base_qs:
505+
base_qs = Person.objects.all()
506+
eligibility_date = get_eligibility_date(nomcom, date)
507+
if eligibility_date.year == 2021:
508+
three_of_five_qs, officer_qs, author_qs = get_8989_eligibility_querysets(eligibility_date, base_qs)
509+
for v in volunteers:
510+
qualifications = []
511+
if v.person in three_of_five_qs:
512+
qualifications.append('path_1')
513+
if v.person in officer_qs:
514+
qualifications.append('path_2')
515+
if v.person in author_qs:
516+
qualifications.append('path_3')
517+
v.qualifications = ", ".join(qualifications)
518+
else:
519+
for v in volunteers:
520+
v.qualifications = ''
521+
503522
def list_eligible_8713(date, base_qs=None):
504523
if not base_qs:
505524
base_qs = Person.objects.all()
@@ -512,7 +531,7 @@ def list_eligible_8788(date, base_qs=None):
512531
previous_five = Meeting.objects.filter(number__in=['102','103','104','105','106'])
513532
return remove_disqualified(three_of_five_eligible(previous_five=previous_five, queryset=base_qs))
514533

515-
def list_eligible_8989(date, base_qs=None):
534+
def get_8989_eligibility_querysets(date, base_qs):
516535
if not base_qs:
517536
base_qs = Person.objects.all()
518537

@@ -545,13 +564,17 @@ def list_eligible_8989(date, base_qs=None):
545564
).annotate(
546565
document_author_count = Count('documentauthor')
547566
).filter(document_author_count__gte=2)
567+
return three_of_five_qs, officer_qs, author_qs
548568

549-
# Would be nice to use queryset union here, but the annotations make that difficult
550-
return remove_disqualified(Person.objects.filter(pk__in=
551-
set(three_of_five_qs.values_list('pk',flat=True)).union(
552-
set(officer_qs.values_list('pk',flat=True))).union(
553-
set(author_qs.values_list('pk',flat=True)))
554-
))
569+
def list_eligible_8989(date, base_qs=None):
570+
if not base_qs:
571+
base_qs = Person.objects.all()
572+
three_of_five_qs, officer_qs, author_qs = get_8989_eligibility_querysets(date, base_qs)
573+
# Would be nice to use queryset union here, but the annotations in the three existing querysets make that difficult
574+
three_of_five_pks = three_of_five_qs.values_list('pk',flat=True)
575+
officer_pks = officer_qs.values_list('pk',flat=True)
576+
author_pks = author_qs.values_list('pk',flat=True)
577+
return remove_disqualified(Person.objects.filter(pk__in=set(three_of_five_pks).union(set(officer_pks)).union(set(author_pks))))
555578

556579
def get_eligibility_date(nomcom=None, date=None):
557580
if date:

ietf/nomcom/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
FeedbackLastSeen, Topic, TopicFeedbackLastSeen, )
3737
from ietf.nomcom.utils import (get_nomcom_by_year, store_nomcom_private_key, suggest_affiliation,
3838
get_hash_nominee_position, send_reminder_to_nominees, list_eligible,
39+
decorate_volunteers_with_qualifications,
3940
HOME_TEMPLATE, NOMINEE_ACCEPT_REMINDER_TEMPLATE,NOMINEE_QUESTIONNAIRE_REMINDER_TEMPLATE, )
4041

4142
from ietf.ietfauth.utils import role_required
@@ -1323,6 +1324,7 @@ def volunteers(request, year, public=False):
13231324
eligible = list_eligible(nomcom)
13241325
for v in volunteers:
13251326
v.eligible = v.person in eligible
1327+
decorate_volunteers_with_qualifications(volunteers,nomcom=nomcom)
13261328
volunteers = sorted(volunteers,key=lambda v:(not v.eligible,v.person.last_name()))
13271329
return render(request, 'nomcom/volunteers.html', dict(year=year, nomcom=nomcom, volunteers=volunteers, public=public))
13281330

ietf/templates/nomcom/volunteers.html

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,36 @@
1414
{% origin %}
1515
<h2>Volunteers for {{ nomcom.group }}</h2>
1616

17-
<table class="table table-condensed table-striped tablesorter">
18-
<thead>
19-
<th>Eligible</th>
20-
<th>Last Name</th>
21-
<th>First Name</th>
22-
<th>Affiliation</th>
23-
<th>Email Addresses</th>
24-
</thead>
25-
26-
{% for v in volunteers %}
27-
<tr>
28-
<td>{{v.eligible|yesno}}
29-
<td><a href="{% url 'ietf.person.views.profile' v.person.name %}">{{v.person.last_name}}</a></td>
30-
<td>{{v.person.first_name}}</td>
31-
<td>{{v.affiliation}}</td>
32-
<td>{% for e in v.person.email_set.all %}{{e.address}}{% if not forloop.last %}, {% endif %}{% endfor %}</td>
33-
</tr>
17+
{% regroup volunteers by eligible as volunteers_by_eligibility %}
18+
19+
{% for eligibility_group in volunteers_by_eligibility %}
20+
<div class="panel panel-default">
21+
<div class="panel-heading">{{ eligibility_group.grouper|yesno:"Eligible, Not Eligible"}}</div>
22+
<div class="panel-body">
23+
<table class="table table-condensed table-striped tablesorter">
24+
<thead>
25+
<th></th>
26+
<th>Last Name</th>
27+
<th>First Name</th>
28+
<th>Affiliation</th>
29+
<th>Primary Email Address</th>
30+
<th>Qualifications</th>
31+
</thead>
32+
33+
{% for v in eligibility_group.list %}
34+
<tr>
35+
<td>{{ forloop.counter }}</td>
36+
<td><a href="{% url 'ietf.person.views.profile' v.person.name %}">{{v.person.last_name}}</a></td>
37+
<td>{{v.person.first_name}}</td>
38+
<td>{{v.affiliation}}</td>
39+
<td>{{v.person.email}}</td>
40+
<td>{{v.qualifications}}</td>
41+
</tr>
42+
{% endfor %}
43+
</table>
44+
</div>
45+
</div>
3446
{% endfor %}
35-
</table>
3647
{% endblock nomcom_content %}
3748

3849
{% block js %}

0 commit comments

Comments
 (0)