Skip to content

Commit fd38a9b

Browse files
committed
Add RFC 8989 nomcom eligibility calculations. Commit ready for merge.
- Legacy-Id: 18975
2 parents 6127274 + fe82f4d commit fd38a9b

15 files changed

Lines changed: 616 additions & 70 deletions

File tree

ietf/doc/factories.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,3 +365,14 @@ class Meta:
365365

366366
document = factory.SubFactory(WgDraftFactory)
367367
person = factory.SubFactory('ietf.person.factories.PersonFactory')
368+
369+
class DocumentAuthorFactory(factory.DjangoModelFactory):
370+
class Meta:
371+
model = DocumentAuthor
372+
373+
document = factory.SubFactory(DocumentFactory)
374+
person = factory.SubFactory('ietf.person.factories.PersonFactory')
375+
email = factory.LazyAttribute(lambda obj: obj.person.email())
376+
377+
class WgDocumentAuthorFactory(DocumentAuthorFactory):
378+
document = factory.SubFactory(WgDraftFactory)

ietf/group/factories.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
from typing import List # pyflakes:ignore
77

8-
from ietf.group.models import Group, Role, GroupEvent, GroupMilestone
8+
from ietf.group.models import Group, Role, GroupEvent, GroupMilestone, \
9+
GroupHistory, RoleHistory
910
from ietf.review.factories import ReviewTeamSettingsFactory
1011

1112
class GroupFactory(factory.DjangoModelFactory):
@@ -71,3 +72,25 @@ class DatelessGroupMilestoneFactory(BaseGroupMilestoneFactory):
7172
group = factory.SubFactory(GroupFactory, uses_milestone_dates=False)
7273
order = factory.Sequence(lambda n: n)
7374

75+
class GroupHistoryFactory(factory.DjangoModelFactory):
76+
class Meta:
77+
model=GroupHistory
78+
79+
name = factory.LazyAttribute(lambda obj: obj.group.name)
80+
state_id = 'active'
81+
type_id = factory.LazyAttribute(lambda obj: obj.group.type_id)
82+
list_email = factory.LazyAttribute(lambda obj: '%s@ietf.org'% obj.group.acronym)
83+
uses_milestone_dates = True
84+
used_roles = [] # type: List[str]
85+
86+
group = factory.SubFactory(GroupFactory)
87+
acronym = factory.LazyAttribute(lambda obj: obj.group.acronym)
88+
89+
class RoleHistoryFactory(factory.DjangoModelFactory):
90+
class Meta:
91+
model=RoleHistory
92+
93+
group = factory.SubFactory(GroupHistoryFactory)
94+
person = factory.SubFactory('ietf.person.factories.PersonFactory')
95+
email = factory.LazyAttribute(lambda obj: obj.person.email())
96+

ietf/meeting/utils.py

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@
1818
import debug # pyflakes:ignore
1919

2020
from ietf.dbtemplate.models import DBTemplate
21-
from ietf.meeting.models import Session, Meeting, SchedulingEvent, TimeSlot, Constraint, SchedTimeSessAssignment
22-
from ietf.group.models import Group, Role
21+
from ietf.meeting.models import Session, SchedulingEvent, TimeSlot, Constraint, SchedTimeSessAssignment
22+
from ietf.group.models import Group
2323
from ietf.group.utils import can_manage_materials
2424
from ietf.name.models import SessionStatusName, ConstraintName
25-
from ietf.nomcom.utils import DISQUALIFYING_ROLE_QUERY_EXPRESSION
26-
from ietf.person.models import Person, Email
25+
from ietf.person.models import Person
2726
from ietf.secr.proceedings.proc_utils import import_audio_files
2827

2928
def session_time_for_sorting(session, use_meeting_date):
@@ -171,25 +170,6 @@ def finalize(meeting):
171170
meeting.save()
172171
return
173172

174-
def attended_ietf_meetings(person):
175-
email_addresses = Email.objects.filter(person=person).values_list('address',flat=True)
176-
return Meeting.objects.filter(
177-
type='ietf',
178-
meetingregistration__email__in=email_addresses,
179-
meetingregistration__attended=True,
180-
)
181-
182-
def attended_in_last_five_ietf_meetings(person, date=datetime.datetime.today()):
183-
previous_five = Meeting.objects.filter(type='ietf',date__lte=date).order_by('-date')[:5]
184-
attended = attended_ietf_meetings(person)
185-
return set(previous_five).intersection(attended)
186-
187-
def is_nomcom_eligible(person, date=datetime.date.today()):
188-
attended = attended_in_last_five_ietf_meetings(person, date)
189-
disqualifying_roles = Role.objects.filter(person=person).filter(DISQUALIFYING_ROLE_QUERY_EXPRESSION)
190-
return len(attended)>=3 and not disqualifying_roles.exists()
191-
192-
193173
def sort_accept_tuple(accept):
194174
tup = []
195175
if accept:
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 2.2.20 on 2021-04-22 14:32
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('nomcom', '0009_auto_20201109_0439'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='nomcom',
15+
name='first_call_for_volunteers',
16+
field=models.DateField(blank=True, null=True, verbose_name='Date of the first call for volunteers'),
17+
),
18+
]

ietf/nomcom/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class NomCom(models.Model):
5959
help_text='Display pictures of each nominee (if available) on the feedback pages')
6060
show_accepted_nominees = models.BooleanField(verbose_name='Show accepted nominees', default=True,
6161
help_text='Show accepted nominees on the public nomination page')
62+
first_call_for_volunteers = models.DateField(verbose_name='Date of the first call for volunteers', blank=True, null=True)
6263

6364
class Meta:
6465
verbose_name_plural = 'NomComs'

0 commit comments

Comments
 (0)