diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py index 9824b5ef4..f3e525d1d 100644 --- a/ietf/doc/factories.py +++ b/ietf/doc/factories.py @@ -13,7 +13,7 @@ from django.conf import settings from ietf.doc.models import ( Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor, StateDocEvent, BallotPositionDocEvent, BallotDocEvent, BallotType, IRSGBallotDocEvent, TelechatDocEvent, - DocumentActionHolder, DocumentAuthor) + DocumentActionHolder) from ietf.group.models import Group def draft_name_generator(type_id,group,n): diff --git a/ietf/meeting/utils.py b/ietf/meeting/utils.py index 0ff7115ba..471686cfe 100644 --- a/ietf/meeting/utils.py +++ b/ietf/meeting/utils.py @@ -18,12 +18,11 @@ from django.utils.safestring import mark_safe import debug # pyflakes:ignore from ietf.dbtemplate.models import DBTemplate -from ietf.meeting.models import Session, Meeting, SchedulingEvent, TimeSlot, Constraint, SchedTimeSessAssignment -from ietf.group.models import Group, Role +from ietf.meeting.models import Session, SchedulingEvent, TimeSlot, Constraint, SchedTimeSessAssignment +from ietf.group.models import Group from ietf.group.utils import can_manage_materials from ietf.name.models import SessionStatusName, ConstraintName -from ietf.nomcom.utils import DISQUALIFYING_ROLE_QUERY_EXPRESSION -from ietf.person.models import Person, Email +from ietf.person.models import Person from ietf.secr.proceedings.proc_utils import import_audio_files def session_time_for_sorting(session, use_meeting_date): @@ -171,25 +170,6 @@ def finalize(meeting): meeting.save() return -def attended_ietf_meetings(person): - email_addresses = Email.objects.filter(person=person).values_list('address',flat=True) - return Meeting.objects.filter( - type='ietf', - meetingregistration__email__in=email_addresses, - meetingregistration__attended=True, - ) - -def attended_in_last_five_ietf_meetings(person, date=datetime.datetime.today()): - previous_five = Meeting.objects.filter(type='ietf',date__lte=date).order_by('-date')[:5] - attended = attended_ietf_meetings(person) - return set(previous_five).intersection(attended) - -def is_nomcom_eligible(person, date=datetime.date.today()): - attended = attended_in_last_five_ietf_meetings(person, date) - disqualifying_roles = Role.objects.filter(person=person).filter(DISQUALIFYING_ROLE_QUERY_EXPRESSION) - return len(attended)>=3 and not disqualifying_roles.exists() - - def sort_accept_tuple(accept): tup = [] if accept: diff --git a/ietf/nomcom/utils.py b/ietf/nomcom/utils.py index 6472d1325..6a8787d52 100644 --- a/ietf/nomcom/utils.py +++ b/ietf/nomcom/utils.py @@ -480,6 +480,10 @@ def create_feedback_email(nomcom, msg): class EncryptedException(Exception): pass +def remove_disqualified(queryset): + disqualified_roles = Role.objects.filter(DISQUALIFYING_ROLE_QUERY_EXPRESSION) + return queryset.exclude(role__in=disqualified_roles) + def is_eligible(person, nomcom=None, date=None): return list_eligible(nomcom=nomcom, date=date, base_qs=Person.objects.filter(pk=person.pk)).exists() @@ -500,13 +504,13 @@ def list_eligible_8713(date, base_qs=None): if not base_qs: base_qs = Person.objects.all() previous_five = previous_five_meetings(date) - return three_of_five_eligible(previous_five=previous_five, queryset=base_qs) + return remove_disqualified(three_of_five_eligible(previous_five=previous_five, queryset=base_qs)) def list_eligible_8788(date, base_qs=None): if not base_qs: base_qs = Person.objects.all() previous_five = Meeting.objects.filter(number__in=['102','103','104','105','106']) - return three_of_five_eligible(previous_five=previous_five, queryset=base_qs) + return remove_disqualified(three_of_five_eligible(previous_five=previous_five, queryset=base_qs)) def list_eligible_8989(date, base_qs=None): if not base_qs: @@ -542,12 +546,12 @@ def list_eligible_8989(date, base_qs=None): document_author_count = Count('documentauthor') ).filter(document_author_count__gte=2) -# return three_of_five_qs.union(officer_qs, author_qs) - return Person.objects.filter(pk__in= + # Would be nice to use queryset union here, but the annotations make that difficult + return remove_disqualified(Person.objects.filter(pk__in= set(three_of_five_qs.values_list('pk',flat=True)).union( set(officer_qs.values_list('pk',flat=True))).union( set(author_qs.values_list('pk',flat=True))) - ) + )) def get_eligibility_date(nomcom=None, date=None): if date: diff --git a/ietf/nomcom/views.py b/ietf/nomcom/views.py index db77086d7..ca1c8eff3 100644 --- a/ietf/nomcom/views.py +++ b/ietf/nomcom/views.py @@ -24,7 +24,6 @@ from ietf.dbtemplate.views import group_template_edit, group_template_show from ietf.name.models import NomineePositionStateName, FeedbackTypeName from ietf.group.models import Group, GroupEvent, Role 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, @@ -36,12 +35,11 @@ from ietf.nomcom.forms import (NominateForm, NominateNewPersonForm, FeedbackForm from ietf.nomcom.models import (Position, NomineePosition, Nominee, Feedback, NomCom, ReminderDates, FeedbackLastSeen, Topic, TopicFeedbackLastSeen, ) from ietf.nomcom.utils import (get_nomcom_by_year, store_nomcom_private_key, - get_hash_nominee_position, send_reminder_to_nominees, - HOME_TEMPLATE, NOMINEE_ACCEPT_REMINDER_TEMPLATE,NOMINEE_QUESTIONNAIRE_REMINDER_TEMPLATE, - DISQUALIFYING_ROLE_QUERY_EXPRESSION) + get_hash_nominee_position, send_reminder_to_nominees, list_eligible, + HOME_TEMPLATE, NOMINEE_ACCEPT_REMINDER_TEMPLATE,NOMINEE_QUESTIONNAIRE_REMINDER_TEMPLATE, ) + from ietf.ietfauth.utils import role_required from ietf.person.models import Person -from ietf.utils import log from ietf.utils.response import permission_denied import debug # pyflakes:ignore @@ -1275,31 +1273,7 @@ def extract_email_lists(request, year): def eligible(request, year): nomcom = get_nomcom_by_year(year) - # This should probably be refined. If the nomcom year is this year, then - # today's date makes sense; for previous nomcoms, we should probably get - # the date of the announcement of the Call for Volunteers, instead - date = datetime.date.today() - previous_five = ( Meeting.objects.filter(type='ietf',date__lte=date) - .exclude(city='').exclude(city='Virtual') - .order_by('-date')[:5] ) - log.assertion("len(previous_five) == 5") - attendees = {} - potentials = set() - for m in previous_five: - registration_emails = m.meetingregistration_set.filter(attended=True).values_list('email',flat=True) - attendees[m] = Person.objects.filter(email__address__in=registration_emails).distinct() - # See RFC8713 section 4.15 - disqualified_roles = Role.objects.filter(DISQUALIFYING_ROLE_QUERY_EXPRESSION) - potentials.update(attendees[m].exclude(role__in=disqualified_roles)) - 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 = list(list_eligible(nomcom=nomcom)) eligible_persons.sort(key=lambda p: p.last_name() ) return render(request, 'nomcom/eligible.html', diff --git a/ietf/person/templatetags/person_filters.py b/ietf/person/templatetags/person_filters.py index 1756ba9e2..5e1ae40ca 100644 --- a/ietf/person/templatetags/person_filters.py +++ b/ietf/person/templatetags/person_filters.py @@ -6,14 +6,14 @@ from django import template import debug # pyflakes:ignore -from ietf.meeting.utils import is_nomcom_eligible as util_is_nomcom_eligible +from ietf.nomcom.utils import is_eligible from ietf.person.models import Alias register = template.Library() @register.filter def is_nomcom_eligible(person, date=datetime.date.today()): - return util_is_nomcom_eligible(person,date) + return is_eligible(person=person,date=date) @register.filter def person_by_name(name): diff --git a/ietf/stats/management/commands/find_meetingregistration_person_issues.py b/ietf/stats/management/commands/find_meetingregistration_person_issues.py index 5dd6919e5..4eaf6ac23 100644 --- a/ietf/stats/management/commands/find_meetingregistration_person_issues.py +++ b/ietf/stats/management/commands/find_meetingregistration_person_issues.py @@ -2,7 +2,7 @@ import debug # pyflakes:ignore -from django.core.management.base import BaseCommand, CommandError +from django.core.management.base import BaseCommand from ietf.stats.utils import find_meetingregistration_person_issues diff --git a/ietf/stats/management/commands/repair_meetingregistration_person.py b/ietf/stats/management/commands/repair_meetingregistration_person.py index 450054c09..74b1a807a 100644 --- a/ietf/stats/management/commands/repair_meetingregistration_person.py +++ b/ietf/stats/management/commands/repair_meetingregistration_person.py @@ -2,7 +2,7 @@ import debug # pyflakes:ignore -from django.core.management.base import BaseCommand, CommandError +from django.core.management.base import BaseCommand from ietf.stats.utils import repair_meetingregistration_person diff --git a/ietf/stats/utils.py b/ietf/stats/utils.py index 704e8a4ef..f5dbbaf7c 100644 --- a/ietf/stats/utils.py +++ b/ietf/stats/utils.py @@ -6,7 +6,6 @@ import re import requests from collections import defaultdict -from django.db.models import F, Q from django.conf import settings from django.contrib.auth.models import User diff --git a/ietf/templates/nomcom/eligible.html b/ietf/templates/nomcom/eligible.html index 679b2cd08..8c82e1f44 100644 --- a/ietf/templates/nomcom/eligible.html +++ b/ietf/templates/nomcom/eligible.html @@ -14,9 +14,6 @@ {% 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. -

diff --git a/ietf/templates/registration/edit_profile.html b/ietf/templates/registration/edit_profile.html index 9ca92a3e8..09fe7d1f8 100644 --- a/ietf/templates/registration/edit_profile.html +++ b/ietf/templates/registration/edit_profile.html @@ -69,17 +69,16 @@
{{person|is_nomcom_eligible|yesno:'Yes,No,No'}}

- This calculation is EXPERIMENTAL.
- - If you believe it is incorrect, make sure you've added all the + If you believe this calculation is incorrect, make sure you've added all the email addresses you've registered for IETF meetings with to the list below.
If you've done so and the calculation is still incorrect, please send a note to - {{settings.SECRETARIAT_INFO_EMAIL}}.
- See RFC 7437 - for eligibility requirements. + {{settings.SECRETARIAT_SUPPORT_EMAIL}}.
+ See RFC 8713 + for eligibility requirements. + For the 2021 nomcom, see also RFC 8989.

@@ -181,7 +180,7 @@ dagger symbol () next to it, or listed on your notification subscription page. Most of this information can be edited or removed on these pages. There are some exceptions, such - as photos, which currently require an email to the Secretariat + as photos, which currently require an email to the Secretariat if you wish to update or remove the information.

Last Name