From 4ce6b934b890039970153efcacd539b0501ea97e Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Wed, 17 Jan 2018 17:58:58 +0000 Subject: [PATCH] Add a page for the nomcom-chair and the secretariat to view who the datatracker thinks is nomcom eligible. Related to #2257. Commit ready for merge. - Legacy-Id: 14533 --- ietf/nomcom/tests.py | 6 +++ ietf/nomcom/urls.py | 1 + ietf/nomcom/views.py | 30 ++++++++++++++ ietf/templates/nomcom/eligible.html | 39 +++++++++++++++++++ .../templates/nomcom/nomcom_private_base.html | 1 + 5 files changed, 77 insertions(+) create mode 100644 ietf/templates/nomcom/eligible.html diff --git a/ietf/nomcom/tests.py b/ietf/nomcom/tests.py index eebbe8533..c3eab1008 100644 --- a/ietf/nomcom/tests.py +++ b/ietf/nomcom/tests.py @@ -1749,6 +1749,12 @@ Junk body for testing response = self.client.get(url) self.assertEqual(response.status_code, 200) + def test_eligible(self): + url = reverse('ietf.nomcom.views.eligible',kwargs={'year':self.nc.year()}) + login_testing_unauthorized(self,self.chair.user.username,url) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + class NomComIndexTests(TestCase): def setUp(self): diff --git a/ietf/nomcom/urls.py b/ietf/nomcom/urls.py index d891e204e..1e06ce79b 100644 --- a/ietf/nomcom/urls.py +++ b/ietf/nomcom/urls.py @@ -36,6 +36,7 @@ urlpatterns = [ url(r'^(?P\d{4})/private/chair/topic/add/$', views.edit_topic), url(r'^(?P\d{4})/private/chair/topic/(?P\d+)/$', views.edit_topic), url(r'^(?P\d{4})/private/chair/topic/(?P\d+)/remove/$', views.remove_topic), + url(r'^(?P\d{4})/private/chair/eligible/$', views.eligible ), url(r'^(?P\d{4})/$', views.year_index), url(r'^(?P\d{4})/requirements/$', views.requirements), diff --git a/ietf/nomcom/views.py b/ietf/nomcom/views.py index 87ba0469c..5447c4f7f 100644 --- a/ietf/nomcom/views.py +++ b/ietf/nomcom/views.py @@ -18,6 +18,7 @@ from ietf.dbtemplate.views import template_edit, template_show from ietf.name.models import NomineePositionStateName, FeedbackTypeName from ietf.group.models import Group, GroupEvent from ietf.message.models import Message +from ietf.meeting.models import Meeting from ietf.nomcom.decorators import nomcom_private_key_required from ietf.nomcom.forms import (NominateForm, NominateNewPersonForm, FeedbackForm, QuestionnaireForm, @@ -1223,3 +1224,32 @@ def extract_email_lists(request, year): 'noresp': noresp, 'bypos': bypos, }) + +@role_required("Nomcom Chair", "Nomcom Advisor", "Secretariat") +def eligible(request, year): + nomcom = get_nomcom_by_year(year) + + date = datetime.date.today() + previous_five = Meeting.objects.filter(type='ietf',date__lte=date).order_by('-date')[:5] + attendees = {} + potentials = set() + for m in previous_five: + registration_emails = m.meetingregistration_set.values_list('email',flat=True) + attendees[m] = Person.objects.filter(email__address__in=registration_emails).distinct() + potentials.update(attendees[m].exclude(role__group__type_id='area',role__group__state='active',role__name_id='ad').exclude(role__group__acronym='iab',role__name_id__in=['member','chair']).exclude(role__group__acronym='iaoc',role__name_id__in=['member','chair'])) + eligible_persons = [] + for p in potentials: + count = 0 + for m in previous_five: + if p in attendees[m]: + count += 1 + if count >= 3: + eligible_persons.append(p) + + eligible_persons.sort(key=lambda p: p.last_name() ) + + return render(request, 'nomcom/eligible.html', + {'nomcom':nomcom, + 'year':year, + 'eligible_persons':eligible_persons, + }) diff --git a/ietf/templates/nomcom/eligible.html b/ietf/templates/nomcom/eligible.html new file mode 100644 index 000000000..dd04dbec4 --- /dev/null +++ b/ietf/templates/nomcom/eligible.html @@ -0,0 +1,39 @@ +{% extends "nomcom/nomcom_private_base.html" %} +{# Copyright The IETF Trust 2015, All Rights Reserved #} +{% load origin %} +{% load bootstrap3 %} +{% load staticfiles %} + +{% block subtitle %} - Eligible People{% endblock %} + +{% block pagehead %} + +{% endblock %} + +{% block nomcom_content %} + {% origin %} +

Eligible People for {{ nomcom.group }}

+ +

+ This calculation is experimental and is likely wrong. Check carefully against the secretariat eligibility tools if it matters. This page lists people who would be nomcom eligible if the selection were made today. Thus if today is not between the spring and summer IETF meetings, the list won't reflect eligibility at the time actual selections will be made. +

+ + + + + + + + {% for p in eligible_persons %} + + + + + + {% endfor %} +
Last NameFirst NameEmail Addresses
{{p.last_name}}{{p.first_name}}{% for e in p.email_set.all %}{{e.address}}{% if not forloop.last %}, {% endif %}{% endfor %}
+{% endblock nomcom_content %} + +{% block js %} + +{% endblock %} diff --git a/ietf/templates/nomcom/nomcom_private_base.html b/ietf/templates/nomcom/nomcom_private_base.html index 872468fc9..e0b68ff58 100644 --- a/ietf/templates/nomcom/nomcom_private_base.html +++ b/ietf/templates/nomcom/nomcom_private_base.html @@ -45,6 +45,7 @@ {% if nomcom.group.state_id == 'active' %}
  • Edit Members
  • {% endif %} +
  • View Eligible
  • Configuration Help
  • Announcement Tool