Skip to content

Commit 2a1b4c7

Browse files
committed
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: 6486
1 parent 8c87d60 commit 2a1b4c7

5 files changed

Lines changed: 64 additions & 21 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: 13 additions & 5 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
@@ -197,7 +205,7 @@ def send_reminder_mail(request, year, type):
197205
if addrs:
198206
message = ('success', 'A copy of "%s" has been sent to %s'%(mail_template.title,", ".join(addrs)))
199207
else:
200-
message = {'warning', 'No messages were sent.'}
208+
message = ('warning', 'No messages were sent.')
201209
else:
202210
message = ('warning', "Please, select at least one nominee")
203211
return render_to_response('nomcom/send_reminder_mail.html',
@@ -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)