Skip to content

Commit 5f2da7b

Browse files
committed
Merged [6486] from rjsparks@nostrum.com:
Slightly more than minimal changes to have questionnaire reminders go only to those nominees who have accepted but have not yet sent in a questionnaire for a given position - Legacy-Id: 6573 Note: SVN reference [6486] has been migrated to Git commit 2a1b4c7
1 parent c8e7a4a commit 5f2da7b

5 files changed

Lines changed: 63 additions & 20 deletions

File tree

ietf/nomcom/management/commands/send_reminders.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,12 @@ class Command(BaseCommand):
2020

2121
def handle(self, *args, **options):
2222
for nomcom in NomCom.objects.filter(group__state__slug='active'):
23-
for state in ('pending','accepted'):
24-
for nominee_position in NomineePosition.objects.filter(nominee__nomcom=nomcom,
25-
state=state,
26-
nominee__duplicated__isnull=True):
27-
if is_time_to_send(nomcom, datetime.date.today(), nominee_position.time.date()):
28-
if state=='pending':
29-
send_accept_reminder_to_nominee(nominee_position)
30-
log('Sent accept reminder to %s' % nominee_position.nominee.email.address)
31-
elif state=='accepted':
32-
send_questionnaire_reminder_to_nominee(nominee_position)
33-
log('Sent questionnaire reminder to %s' % nominee_position.nominee.email.address)
34-
else:
35-
pass
23+
nps = NomineePosition.objects.filter(nominee__nomcom=nomcom,nominee__duplicated__isnull=True)
24+
for nominee_position in nps.pending():
25+
if is_time_to_send(nomcom, datetime.date.today(), nominee_position.time.date()):
26+
send_accept_reminder_to_nominee(nominee_position)
27+
log('Sent accept reminder to %s' % nominee_position.nominee.email.address)
28+
for nominee_position in nps.accepted().without_questionnaire_response():
29+
if is_time_to_send(nomcom, datetime.date.today(), nominee_position.time.date()):
30+
send_questionnaire_reminder_to_nominee(nominee_position)
31+
log('Sent questionnaire reminder to %s' % nominee_position.nominee.email.address)

ietf/nomcom/managers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ def declined(self):
3333
def not_duplicated(self):
3434
return self.filter(nominee__duplicated__isnull=True)
3535

36+
def with_questionnaire_response(self):
37+
return self.filter(nominee__feedback__type='questio',nominee__feedback__positions=models.F('position')).distinct()
38+
39+
def without_questionnaire_response(self):
40+
with_ids = self.with_questionnaire_response().values_list('id', flat=True)
41+
return self.exclude(id__in=with_ids)
42+
3643

3744
class NomineePositionManager(models.Manager, MixinManager):
3845
def get_query_set(self):

ietf/nomcom/tests.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515

1616
from ietf.person.models import Email, Person
17+
from django.contrib.auth.models import User
1718

1819
from ietf.nomcom.test_data import nomcom_test_data, generate_cert, check_comments, \
1920
COMMUNITY_USER, CHAIR_USER, \
@@ -657,12 +658,15 @@ def test_encrypted_comments(self):
657658
os.unlink(self.privatekey_file.name)
658659
os.unlink(self.cert_file.name)
659660

660-
class ReminderCommandTest(TestCase):
661+
class ReminderTest(TestCase):
661662
perma_fixtures = ['names', 'nomcom_templates']
662663

663664
def setUp(self):
664665
nomcom_test_data()
665666
self.nomcom = get_nomcom_by_year(NOMCOM_YEAR)
667+
self.cert_file, self.privatekey_file = generate_cert()
668+
self.nomcom.public_key.storage.location = tempfile.gettempdir()
669+
self.nomcom.public_key.save('cert', File(open(self.cert_file.name, 'r')))
666670

667671
gen = Position.objects.get(nomcom=self.nomcom,name='GEN')
668672
rai = Position.objects.get(nomcom=self.nomcom,name='RAI')
@@ -684,6 +688,17 @@ def setUp(self):
684688
np = n.nomineeposition_set.get(position=rai)
685689
np.time = t_minus_4
686690
np.save()
691+
n = get_or_create_nominee(self.nomcom,"Nominee 2","nominee2@example.org",gen,None)
692+
np = n.nomineeposition_set.get(position=gen)
693+
np.state = NomineePositionState.objects.get(slug='accepted')
694+
np.time = t_minus_4
695+
np.save()
696+
feedback = Feedback.objects.create(nomcom=self.nomcom,
697+
comments='some non-empty comments',
698+
type=FeedbackType.objects.get(slug='questio'),
699+
user=User.objects.get(username=CHAIR_USER))
700+
feedback.positions.add(gen)
701+
feedback.nominees.add(n)
687702

688703
def test_is_time_to_send(self):
689704
self.nomcom.reminder_interval = 4
@@ -714,5 +729,22 @@ def test_command(self):
714729
self.assertEqual(len(outbox), messages_before + 1)
715730
self.assertTrue('nominee2@example.org' in outbox[-1]['To'])
716731
self.assertTrue('please accept' in outbox[-1]['Subject'])
717-
718732

733+
def test_remind_accept_view(self):
734+
url = reverse('nomcom_send_reminder_mail', kwargs={'year': NOMCOM_YEAR,'type':'accept'})
735+
login_testing_unauthorized(self, CHAIR_USER, url)
736+
messages_before=len(outbox)
737+
test_data = {'selected': [x.id for x in Nominee.objects.filter(nomcom=self.nomcom)]}
738+
response = self.client.post(url, test_data)
739+
self.assertEqual(response.status_code, 200)
740+
self.assertEqual(len(outbox), messages_before + 2)
741+
742+
def test_remind_questionnaire_view(self):
743+
url = reverse('nomcom_send_reminder_mail', kwargs={'year': NOMCOM_YEAR,'type':'questionnaire'})
744+
login_testing_unauthorized(self, CHAIR_USER, url)
745+
messages_before=len(outbox)
746+
test_data = {'selected': [x.id for x in Nominee.objects.filter(nomcom=self.nomcom)]}
747+
response = self.client.post(url, test_data)
748+
self.assertEqual(response.status_code, 200)
749+
self.assertEqual(len(outbox), messages_before + 1)
750+

ietf/nomcom/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ def send_reminder_to_nominees(nominees,type):
263263
addrs.append(nominee_position.nominee.email.address)
264264
elif type=='questionnaire':
265265
for nominee in nominees:
266-
for nominee_position in nominee.nomineeposition_set.accepted():
266+
for nominee_position in nominee.nomineeposition_set.accepted().without_questionnaire_response():
267267
send_questionnaire_reminder_to_nominee(nominee_position)
268268
addrs.append(nominee_position.nominee.email.address)
269269
return addrs

ietf/nomcom/views.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,18 +173,26 @@ def send_reminder_mail(request, year, type):
173173
mail_path = nomcom_template_path + NOMINEE_ACCEPT_REMINDER_TEMPLATE
174174
reminder_description = 'accept (or decline) a nomination'
175175
selected_tab = 'send_accept_reminder'
176+
state_description = NomineePositionState.objects.get(slug=interesting_state).name
176177
elif type=='questionnaire':
177178
interesting_state = 'accepted'
178179
mail_path = nomcom_template_path + NOMINEE_QUESTIONNAIRE_REMINDER_TEMPLATE
179180
reminder_description = 'complete the questionnaire for a nominated position'
180181
selected_tab = 'send_questionnaire_reminder'
182+
state_description = NomineePositionState.objects.get(slug=interesting_state).name+' but no questionnaire has been received'
181183
else:
182184
raise Http404
183185

184186
nominees = Nominee.objects.get_by_nomcom(nomcom).not_duplicated().filter(nomineeposition__state=interesting_state).distinct()
185-
annotated_nominees = list(nominees)
186-
for nominee in annotated_nominees:
187-
nominee.interesting_positions = [x.position.name for x in nominee.nomineeposition_set.all() if x.state.slug==interesting_state]
187+
annotated_nominees = []
188+
for nominee in nominees:
189+
if type=='accept':
190+
nominee.interesting_positions = [x.position.name for x in nominee.nomineeposition_set.pending()]
191+
else:
192+
nominee.interesting_positions = [x.position.name for x in nominee.nomineeposition_set.accepted().without_questionnaire_response()]
193+
if nominee.interesting_positions:
194+
annotated_nominees.append(nominee)
195+
188196
mail_template = DBTemplate.objects.filter(group=nomcom.group, path=mail_path)
189197
mail_template = mail_template and mail_template[0] or None
190198
message = None
@@ -207,7 +215,7 @@ def send_reminder_mail(request, year, type):
207215
'mail_template': mail_template,
208216
'selected': selected_tab,
209217
'reminder_description': reminder_description,
210-
'state_description': NomineePositionState.objects.get(slug=interesting_state).name,
218+
'state_description': state_description,
211219
'message': message}, RequestContext(request))
212220

213221

0 commit comments

Comments
 (0)