diff --git a/ietf/meeting/utils.py b/ietf/meeting/utils.py index 1acd8a364..6ae0b96f1 100644 --- a/ietf/meeting/utils.py +++ b/ietf/meeting/utils.py @@ -14,9 +14,10 @@ import debug # pyflakes:ignore from ietf.dbtemplate.models import DBTemplate from ietf.meeting.models import Session, Meeting, SchedulingEvent, TimeSlot -from ietf.group.models import Group +from ietf.group.models import Group, Role from ietf.group.utils import can_manage_materials from ietf.name.models import SessionStatusName +from ietf.nomcom.utils import DISQUALIFYING_ROLE_QUERY_EXPRESSION from ietf.person.models import Email from ietf.secr.proceedings.proc_utils import import_audio_files @@ -174,13 +175,9 @@ def attended_in_last_five_ietf_meetings(person, date=datetime.datetime.today()): def is_nomcom_eligible(person, date=datetime.date.today()): attended = attended_in_last_five_ietf_meetings(person, date) - # See RFC8713 section 4.15 - is_isoc_board = person.role_set.filter(group__acronym='isocbot', name_id__in=['member', 'chair']).exists() - is_ietf_trust = person.role_set.filter(group__acronym='ietf-trust', name_id__in=['member', 'chair']).exists() - is_llc_board = person.role_set.filter(group__acronym='llc-board', name_id__in=['member', 'chair']).exists() - is_iesg = person.role_set.filter(group__type_id='area',group__state='active',name_id='ad').exists() - is_iab = person.role_set.filter(group__acronym='iab',name_id__in=['member','chair']).exists() - return len(attended)>=3 and not any([is_isoc_board, is_ietf_trust, is_llc_board, is_iesg, is_iab]) + 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 = [] diff --git a/ietf/nomcom/utils.py b/ietf/nomcom/utils.py index 2383b29f1..e92d34d31 100644 --- a/ietf/nomcom/utils.py +++ b/ietf/nomcom/utils.py @@ -13,6 +13,7 @@ from email.header import decode_header from email.iterators import typed_subpart_iterator from email.utils import parseaddr +from django.db.models import Q from django.conf import settings from django.contrib.sites.models import Site from django.core.exceptions import ObjectDoesNotExist @@ -57,6 +58,11 @@ DEFAULT_NOMCOM_TEMPLATES = [HOME_TEMPLATE, IESG_GENERIC_REQUIREMENTS_TEMPLATE, ] +# See RFC8713 section 4.15 +DISQUALIFYING_ROLE_QUERY_EXPRESSION = ( Q(group__acronym__in=['isocbot', 'ietf-trust', 'llc-board', 'iab'], name_id__in=['member', 'chair']) + | Q(group__type_id='area', group__state='active',name_id='ad') + ) + def get_nomcom_by_year(year): from ietf.nomcom.models import NomCom @@ -470,4 +476,5 @@ def create_feedback_email(nomcom, msg): class EncryptedException(Exception): pass + \ No newline at end of file diff --git a/ietf/nomcom/views.py b/ietf/nomcom/views.py index 71825ba0b..3a10df293 100644 --- a/ietf/nomcom/views.py +++ b/ietf/nomcom/views.py @@ -22,7 +22,7 @@ from django.utils.encoding import force_bytes from ietf.dbtemplate.models import DBTemplate 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 +from ietf.group.models import Group, GroupEvent, Role from ietf.message.models import Message from ietf.meeting.models import Meeting @@ -37,7 +37,8 @@ from ietf.nomcom.models import (Position, NomineePosition, Nominee, Feedback, No 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) + HOME_TEMPLATE, NOMINEE_ACCEPT_REMINDER_TEMPLATE,NOMINEE_QUESTIONNAIRE_REMINDER_TEMPLATE, + DISQUALIFYING_ROLE_QUERY_EXPRESSION) from ietf.ietfauth.utils import role_required from ietf.person.models import Person from ietf.utils import log @@ -1251,14 +1252,8 @@ def eligible(request, year): registration_emails = m.meetingregistration_set.values_list('email',flat=True) attendees[m] = Person.objects.filter(email__address__in=registration_emails).distinct() # See RFC8713 section 4.15 - potentials.update( - attendees[m] \ - .exclude(role__group__acronym='isocbot', role__name_id__in=['member','chair']) \ - .exclude(role__group__acronym='ietf-trust', role__name_id__in=['member','chair']) \ - .exclude(role__group__acronym='llc-board', role__name_id__in=['member','chair']) \ - .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']) - ) + 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