Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Download questionnaire responses #6111

Merged
merged 2 commits into from
Aug 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions ietf/nomcom/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2870,7 +2870,6 @@ class ReclassifyFeedbackTests(TestCase):
def setUp(self):
super().setUp()
setup_test_public_keys_dir(self)
nomcom_test_data()
self.nc = NomComFactory.create(**nomcom_kwargs_for_year())
self.chair = self.nc.group.role_set.filter(name='chair').first().person
self.member = self.nc.group.role_set.filter(name='member').first().person
Expand All @@ -2882,6 +2881,28 @@ def tearDown(self):
teardown_test_public_keys_dir(self)
super().tearDown()

def test_download_feedback_nominee(self):
# not really a reclassification test, but in closely adjacent code
fb = FeedbackFactory.create(nomcom=self.nc,type_id='questio')
fb.positions.add(self.position)
fb.nominees.add(self.nominee)
fb.save()
self.assertEqual(Feedback.objects.questionnaires().count(), 1)

url = reverse('ietf.nomcom.views.view_feedback_nominee', kwargs={'year':self.nc.year(), 'nominee_id':self.nominee.id})
login_testing_unauthorized(self,self.member.user.username,url)
provide_private_key_to_test_client(self)
response = self.client.post(url, {'feedback_id': fb.id, 'submit': 'download'})
self.assertEqual(response.status_code, 403)

self.client.logout()
self.client.login(username=self.chair.user.username, password=self.chair.user.username + "+password")
provide_private_key_to_test_client(self)

response = self.client.post(url, {'feedback_id': fb.id, 'submit': 'download'})
self.assertEqual(response.status_code, 200)
self.assertIn('questionnaire-', response['Content-Disposition'])

def test_reclassify_feedback_nominee(self):
fb = FeedbackFactory.create(nomcom=self.nc,type_id='comment')
fb.positions.add(self.position)
Expand All @@ -2892,14 +2913,14 @@ def test_reclassify_feedback_nominee(self):
url = reverse('ietf.nomcom.views.view_feedback_nominee', kwargs={'year':self.nc.year(), 'nominee_id':self.nominee.id})
login_testing_unauthorized(self,self.member.user.username,url)
provide_private_key_to_test_client(self)
response = self.client.post(url, {'feedback_id': fb.id, 'type': 'obe'})
response = self.client.post(url, {'feedback_id': fb.id, 'type': 'obe', 'submit': 'reclassify'})
self.assertEqual(response.status_code, 403)

self.client.logout()
self.client.login(username=self.chair.user.username, password=self.chair.user.username + "+password")
provide_private_key_to_test_client(self)

response = self.client.post(url, {'feedback_id': fb.id, 'type': 'obe'})
response = self.client.post(url, {'feedback_id': fb.id, 'type': 'obe', 'submit': 'reclassify'})
self.assertEqual(response.status_code, 200)

fb = Feedback.objects.get(id=fb.id)
Expand Down
49 changes: 32 additions & 17 deletions ietf/nomcom/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from django.template.loader import render_to_string
from django.urls import reverse
from django.utils.encoding import force_bytes, force_str
from django.utils.text import slugify

from email.errors import HeaderParseError

Expand Down Expand Up @@ -1023,24 +1024,38 @@ def view_feedback_nominee(request, year, nominee_id):
return HttpResponseForbidden('Restricted to roles: Nomcom Chair, Nomcom Advisor')
feedback_id = request.POST.get('feedback_id', None)
feedback = get_object_or_404(Feedback, id=feedback_id)
type = request.POST.get('type', None)
if type:
if type == 'unclassified':
feedback.type = None
feedback.nominees.clear()
messages.success(request, 'The selected feedback has been de-classified. Please reclassify it in the Pending emails tab.')
submit = request.POST.get('submit', None)
if submit == 'download':
fn = f'questionnaire-{slugify(nominee.name())}-{feedback.time.date()}.txt'
response = render_to_string('nomcom/download_questionnaire.txt',
{'year': year,
'nominee': nominee,
'feedback': feedback,
'positions': ','.join([str(p) for p in feedback.positions.all()]),
},
request=request)
response = HttpResponse(response, content_type='text/plain')
response['Content-Disposition'] = f'attachment; filename="{fn}"'
return response
elif submit == 'reclassify':
type = request.POST.get('type', None)
if type:
if type == 'unclassified':
feedback.type = None
feedback.nominees.clear()
messages.success(request, 'The selected feedback has been de-classified. Please reclassify it in the Pending emails tab.')
else:
feedback.type = FeedbackTypeName.objects.get(slug=type)
messages.success(request, f'The selected feedback has been reclassified as {feedback.type.name}.')
feedback.save()
else:
feedback.type = FeedbackTypeName.objects.get(slug=type)
messages.success(request, f'The selected feedback has been reclassified as {feedback.type.name}.')
feedback.save()
else:
return render(request, 'nomcom/view_feedback_nominee.html',
{'year': year,
'nomcom': nomcom,
'feedback_types': feedback_types,
'reclassify_feedback': feedback,
'is_chair_task': True,
})
return render(request, 'nomcom/view_feedback_nominee.html',
{'year': year,
'nomcom': nomcom,
'feedback_types': feedback_types,
'reclassify_feedback': feedback,
'is_chair_task': True,
})

last_seen = FeedbackLastSeen.objects.filter(reviewer=request.user.person,nominee=nominee).first()
last_seen_time = (last_seen and last_seen.time) or datetime.datetime(year=1, month=1, day=1, tzinfo=datetime.timezone.utc)
Expand Down
9 changes: 9 additions & 0 deletions ietf/templates/nomcom/download_questionnaire.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{# Copyright The IETF Trust 2023, All Rights Reserved #}{% autoescape off %}{% load nomcom_tags %}Questionnaire response from {{ nominee.person.name }}

From: {{ feedback.author|formatted_email|default:"Anonymous" }}
Date: {{ feedback.time|date:"Y-m-d" }}
Positions: {{ positions }}{% if feedback.subject %}
Subject: {{ feedback.subject }}{% endif %}

{% decrypt feedback.comments request year 1 %}
{% endautoescape %}
2 changes: 1 addition & 1 deletion ietf/templates/nomcom/reclassify_feedback_item.html
Original file line number Diff line number Diff line change
Expand Up @@ -99,5 +99,5 @@ <h2 class="mt-3">Reclassify feedback item</h2>
</tbody>
</table>
<input type="hidden" name="feedback_id" value="{{ reclassify_feedback.id }}">
<button class="btn btn-primary" type="submit">Classify</button>
<button class="btn btn-primary" type="submit" name="submit" value="reclassify">Classify</button>
</form>
7 changes: 6 additions & 1 deletion ietf/templates/nomcom/view_feedback_nominee.html
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,12 @@ <h2>Feedback about {{ nominee }}</h2>
<form id="reclassify-{{ feedback.id }}" method="post">
{% csrf_token %}
<input type="hidden" name="feedback_id" value="{{ feedback.id }}">
<button class="btn btn-warning btn-sm" type="submit">
{% if ft.slug == "questio" %}
<p><button class="btn btn-warning btn-sm" type="submit" name="submit" value="download">
Download
</button></p>
{% endif %}
<button class="btn btn-warning btn-sm" type="submit" name="submit" value="reclassify">
Reclassify
</button>
</form>
Expand Down
Loading