diff --git a/core/templates/core/feedback_form.html b/core/templates/core/feedback_form.html index 4aa8e4a9443e7188bcc516217f9369236d22b1a8..a63de4e4ddadd33669e392e608eb726687ae6e9f 100644 --- a/core/templates/core/feedback_form.html +++ b/core/templates/core/feedback_form.html @@ -11,7 +11,10 @@ <div class="col my-2 nopadding-right"> <div class="card mb-2"> - <h4 class="card-header">{{feedback.of_submission.type.name}}</h4> + <div class="card-header form-inline pb-1"> + <h4 class="mr-2">{{feedback.of_submission.type.name}}</h4> + <a href="{% url 'download_submissions' feedback.of_submission.slug %}" class="btn btn-sm btn-outline-secondary mb-1">Download</a> + </div> <div class="card-block"> <div id="student_text" class="editor editor-code"></div> </div> @@ -98,11 +101,11 @@ {# Beware! compares status and origin #} {% if feedback.status == feedback.NEEDS_REVIEW or feedback.status == feedback.EDITABLE %} - <button type="submit" form="form1" class="btn btn-success mr-1 mb-1" name="update" value="Next">Next</button> + <button type="submit" form="form1" class="btn btn-success mr-1 mb-1" name="update" value="Next">Next</button> {% endif %} {% if feedback.origin != feedback.MANUAL %} - <a href="{% url 'FeedbackDelete' feedback.slug %}" class="btn btn-outline-danger mr-1 mb-1" name="delete" value="Delete">Delete auto feedback</a> + <a href="{% url 'FeedbackDelete' feedback.slug %}" class="btn btn-outline-danger mr-1 mb-1" name="delete" value="Delete">Delete auto feedback</a> {% endif %} {% if feedback.status == feedback.ACCEPTED %} diff --git a/core/urls.py b/core/urls.py index 992524b9c8caaed5d945dd108715942fbc6ed718..d880aebe6cb1eaae65c3545486898a3528e0255b 100644 --- a/core/urls.py +++ b/core/urls.py @@ -16,6 +16,7 @@ urlpatterns = [ url(r'^feedback/delete/(?P<feedback_slug>\w+)/$', views.delete_feedback, name='FeedbackDelete'), url(r'^submission/view/(?P<slug>\w+)/$', views.SubmissionView.as_view(), name='SubmissionView'), + url(r'^submission/download/(?P<slug>\w+)/$', views.download_submissions, name='download_submissions'), url(r'^csv/$', views.export_csv, name='export') ] diff --git a/core/views/feedback.py b/core/views/feedback.py index 767e14d21c6cf41f20cc14ca3f21878a1160cac7..418868cc12f4bb60c1080f98593801c5accd05fb 100644 --- a/core/views/feedback.py +++ b/core/views/feedback.py @@ -1,7 +1,7 @@ from random import choice from django.contrib import messages -from django.http import Http404, HttpResponseRedirect +from django.http import Http404, HttpResponseRedirect, HttpResponse from django.urls import reverse from django.utils.decorators import method_decorator from django.views.generic.edit import UpdateView @@ -56,6 +56,8 @@ class FeedbackEdit(UpdateView): elif instance.status == Feedback.OPEN: instance.reassign_to_tutor(self.request.user) return instance + elif not (instance.of_tutor == self.request.user or in_groups(self.request.user, ('Reviewers', ))): + messages.error(self.request, "Get your hands of somebody else's feedback!") raise Http404 def form_valid(self, form): @@ -90,3 +92,17 @@ class FeedbackEdit(UpdateView): context = super(FeedbackEdit, self).get_context_data(**kwargs) context['grady_says'] = choice(grady_says) return context + +@group_required('Reviewers', 'Tutors') +def download_submissions(request, slug): + submission = Submission.objects.get(slug=slug) + + if not (submission.feedback.of_tutor == request.user or in_groups(request.user, ('Reviewers', ))): + messages.error(request, "Get your hands of somebody else's feedback!") + return HttpResponseRedirect(reverse('start')) + + response = HttpResponse(content_type='text/plain') + response['Content-Disposition'] = 'attachment; filename="%s_%s.c"' % (submission.type.name, submission.slug) + response.write(submission.text) + + return response