From 8e97669dff1d93bfce42b114c93017a2fd3555ec Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Sun, 1 Apr 2018 18:36:36 +0000 Subject: [PATCH] Added a get_active_ads() utility function that uses the cache to reduce database access. Moved some utility functions so as to reduce import loops. - Legacy-Id: 14986 --- ietf/meeting/utils.py | 16 ++++++++++++- ietf/person/templatetags/person_filters.py | 2 +- ietf/person/utils.py | 27 ++++++++-------------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/ietf/meeting/utils.py b/ietf/meeting/utils.py index e91b6a076..9e97303dc 100644 --- a/ietf/meeting/utils.py +++ b/ietf/meeting/utils.py @@ -8,7 +8,7 @@ from django.template.loader import render_to_string import debug # pyflakes:ignore from ietf.dbtemplate.models import DBTemplate -from ietf.meeting.models import Session +from ietf.meeting.models import Session, Meeting from ietf.group.utils import can_manage_materials from ietf.secr.proceedings.proc_utils import import_audio_files @@ -138,3 +138,17 @@ def finalize(meeting): meeting.save() return +def attended_ietf_meetings(person): + return Meeting.objects.filter(type='ietf',meetingregistration__email__in=Email.objects.filter(person=person).values_list('address',flat=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) + 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() + is_iaoc = person.role_set.filter(group__acronym='iaoc',name_id__in=['member','chair']).exists() + return len(attended)>=3 and not (is_iesg or is_iab or is_iaoc) diff --git a/ietf/person/templatetags/person_filters.py b/ietf/person/templatetags/person_filters.py index 21bdcb700..849c3e9ca 100644 --- a/ietf/person/templatetags/person_filters.py +++ b/ietf/person/templatetags/person_filters.py @@ -6,7 +6,7 @@ from django import template import debug # pyflakes:ignore -from ietf.person.utils import is_nomcom_eligible as util_is_nomcom_eligible +from ietf.meeting.utils import is_nomcom_eligible as util_is_nomcom_eligible register = template.Library() diff --git a/ietf/person/utils.py b/ietf/person/utils.py index 59f83ac07..c0329ad83 100755 --- a/ietf/person/utils.py +++ b/ietf/person/utils.py @@ -7,13 +7,12 @@ import syslog from django.contrib import admin from django.contrib.auth.models import User +from django.core.exceptions import ObjectDoesNotExist import debug # pyflakes:ignore -from ietf.nomcom.models import Nominee from ietf.person.models import Person, Email from ietf.utils.mail import send_mail -from ietf.meeting.models import Meeting def merge_persons(source, target, file=sys.stdout, verbose=False): changes = [] @@ -141,7 +140,7 @@ def merge_nominees(source, target): for nominee in source.nominee_set.all(): try: target_nominee = target.nominee_set.get(nomcom=nominee.nomcom) - except Nominee.DoesNotExist: + except ObjectDoesNotExist: target_nominee = target.nominee_set.create(nomcom=nominee.nomcom, email=target.email()) nominee.nomination_set.all().update(nominee=target_nominee) for fb in nominee.feedback_set.all(): @@ -183,17 +182,11 @@ def determine_merge_order(source,target): source,target = sorted([source,target],key=lambda a: a.user.last_login if a.user.last_login else datetime.datetime.min) return source,target -def attended_ietf_meetings(person): - return Meeting.objects.filter(type='ietf',meetingregistration__email__in=Email.objects.filter(person=person).values_list('address',flat=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) - 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() - is_iaoc = person.role_set.filter(group__acronym='iaoc',name_id__in=['member','chair']).exists() - return len(attended)>=3 and not (is_iesg or is_iab or is_iaoc) +def get_active_ads(): + from ietf.person.models import Person + cache_key = "doc:active_ads" + active_ads = cache.get(cache_key) + if not active_ads: + active_ads = list(Person.objects.filter(role__name="ad", role__group__state="active", role__group__type="area").distinct()) + cache.set(cache_key, active_ads) + return active_ads