Skip to content
Snippets Groups Projects
Commit 1ff8f69f authored by Jan Maximilian Michal's avatar Jan Maximilian Michal
Browse files

Added a submissions list view and the possibility to create feedback for a specific user

parent 09bb2f25
Branches
No related tags found
No related merge requests found
......@@ -52,3 +52,9 @@ table.dataTable {
.col-sm-12 {
padding: 0 !important; // this is ugly as --fucking-- hell
}
.table td.fit,
.table th.fit {
white-space: nowrap;
width: 1%;
}
......@@ -102,6 +102,7 @@
{# 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="Save">Save</button>
{% endif %}
{% if feedback.origin != feedback.MANUAL %}
......
......@@ -27,6 +27,7 @@
</tbody>
</table>
<div class="card-footer text-muted">
<a role="button" class="btn btn-outline-primary" href="{% url 'submission_list' %}">See all submissions</a>
<a role="button" class="btn btn-outline-primary" href="{% url 'export' %}">Download CSV data</a>
</div>
</div>
......@@ -99,6 +100,8 @@
{% include "core/feedback_list.html" with expanded="show" header="Did not compile feedback" unique="2" feedback_list=feedback_list_did_not_compile %}
{% include "core/feedback_list.html" with expanded="show" header="Could not link feedback" unique="3" feedback_list=feedback_list_could_not_link %}
{% include "core/feedback_list.html" with expanded="hide" header="Empty feedback" unique="1" feedback_list=feedback_list_empty %}
</div>
</div>
......@@ -108,14 +111,14 @@
<script>
$(document).ready(function() {
$('[id^=list-id-]').DataTable({
"paging": false,
"info": false,
"searching": false,
"stateSave": true,
"order": [[ 0, 'desc' ], [ 2, 'desc' ]],
"columnDefs": [
{ "orderable": false, "targets": -1 },
]
"paging": false,
"info": false,
"searching": false,
"stateSave": true,
"order": [[ 0, 'desc' ], [ 2, 'desc' ]],
"columnDefs": [
{ "orderable": false, "targets": -1 },
]
});
});
</script>
......
{% extends 'base.html' %}
{% load staticfiles %}
{% block nav_title %} Every single student {% endblock nav_title %}
{% block body_block %}
<div class="row">
<div class="col m-2">
<div class="card">
<h5 class="card-header">All student submissions</h5>
<div class="card-block">
<table id="list-id-submission_list" class="table nomargin">
<thead>
<tr>
<th></th>
<th>Task</th>
<th>Student</th>
<th>Score</th>
<th></th>
</tr>
</thead>
<tbody>
{% for submission in submission_list %}
<tr>
<td class="align-middle fit"> <a href="{% url 'SubmissionView' submission.slug %}" class="btn btn-outline-primary mb-1" name="edit" value="View">View submission</a></td>
<td class="align-middle"> {{ submission.type }} </td>
<td class="align-middle"> {{ submission.student }} </td>
<td class="align-middle">
{% if submission.feedback %}
<code> {{ submission.feedback.score }} / {{ submission.type.full_score }} </code>
{% else %}
<code> no feedback </code>
{% endif %}
</td>
<td class="align-middle fit">
{% if submission.feedback %}
{% if submission.feedback.origin == submission.feedback.WAS_EMPTY %}
<button type="button" class="btn btn-secondary" disabled>was empty</button>
{% else %}
<a href="{% url 'FeedbackEdit' submission.feedback.slug %}" class="btn btn-outline-primary" name="edit" value="View">Edit Feedback</a>
<a href="{% url 'FeedbackDelete' submission.feedback.slug %}" class="btn btn-outline-danger" name="delete" value="Delete">Delete Feedback</a>
{% endif %}
{% else %}
<a href="{% url 'create_feedback_for_submission' submission.slug %}" class="btn btn-outline-success"> Create Feedback </a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endblock body_block %}
{% block script_block %}
<script>
$(document).ready(function() {
$('[id^=list-id-]').DataTable({
"paging": false,
"info": false,
"searching": false,
"stateSave": true,
"order": [[ 2, 'desc' ]],
"columnDefs": [
{ "orderable": false, "targets": [0, -1] },
]
});
});
</script>
{% endblock script_block %}
......@@ -5,7 +5,7 @@
{% block body_block %}
{% with submission.feedback_list.all|first as feedback %}
{% with submission.feedback as feedback %}
<div class="row justify-content-center">
<div class="col-3 my-4">
<div class="card">
......@@ -17,8 +17,11 @@
<li class="list-group-item"><strong class="mr-2">Submission Type: </strong> {{ submission.type }} </li>
<li class="list-group-item"><strong class="mr-2">Student: </strong> {{ submission.student }}</li>
<li class="list-group-item"><strong class="mr-2">Score: </strong>
{% if feedback.final %}
{% if feedback and feedback.status == feedback.ACCEPTED %}
<code> {{ feedback.score }} / {{submission.type.full_score}} </code>
{% elif feedback and is_reviewer %}
<code> {{ feedback.score }} / {{submission.type.full_score}} </code>
<span class="badge badge-warning ml-2">Only visible to reviewer</span>
{% else %}
<span class="badge badge-danger">No Feedback</span>
{% endif %}
......@@ -26,7 +29,12 @@
</ul>
</div>
<div class="card-footer">
<a href="{% url 'start' %}" class="btn btn-success">Back</a>
{% if is_reviewer %}
<a href="{% url 'create_feedback_for_submission' submission.slug %}" class="btn btn-success"> Create Feedback </a>
<a href="{% url 'submission_list' %}" class="btn btn-outline-success">Back</a>
{% else %}
<a href="{% url 'start' %}" class="btn btn-success">Back</a>
{% endif %}
</div>
</div>
</div>
......@@ -40,11 +48,13 @@
</div>
</div>
{% if feedback.final %}
{% if submission.feedback and feedback.status == feedback.ACCEPTED or is_reviewer %}
<div class="col-4 my-4">
<div class="card">
<div class="card-block">
<div class="card-header">Our feedback</div>
<div class="card-header">Our feedback {% if is_reviewer %}
<span class="badge badge-warning ml-2">Only visible to reviewer</span>
{% endif %}</div>
<div class="editor-code" id="textarea_feedback">{{ feedback.text }}</div>
</div>
</div>
......
......@@ -15,7 +15,9 @@ urlpatterns = [
url(r'^feedback/edit/(?P<feedback_slug>\w+)/$', views.FeedbackEdit.as_view(), name='FeedbackEdit'),
url(r'^feedback/delete/(?P<feedback_slug>\w+)/$', views.delete_feedback, name='FeedbackDelete'),
url(r'^submission/list/$', views.get_submission_list, name='submission_list'),
url(r'^submission/view/(?P<slug>\w+)/$', views.SubmissionView.as_view(), name='SubmissionView'),
url(r'^submission/create-feedback-for/(?P<slug>\w+)/$', views.create_feedback_for_submission, name='create_feedback_for_submission'),
url(r'^submission/download/(?P<slug>\w+)/$', views.download_submissions, name='download_submissions'),
url(r'^csv/$', views.export_csv, name='export')
......
......@@ -86,6 +86,9 @@ class FeedbackEdit(UpdateView):
else: # in_groups(self.request.user, ('Tutor',)):
return HttpResponseRedirect(reverse('CreateFeedbackForType', args=(form.instance.of_submission.type.slug,)))
elif 'Save' in self.request.POST['update']:
return HttpResponseRedirect(reverse('FeedbackEdit', args=(form.instance.slug,)))
return HttpResponseRedirect(self.get_success_url())
def get_context_data(self, **kwargs):
......
from django.utils.decorators import method_decorator
from django.views.generic import DetailView
from django.shortcuts import render
from django.urls import reverse
from django.http import HttpResponseRedirect
from core.custom_annotations import group_required
from core.models import Submission
from core.custom_annotations import group_required, in_groups
from core.models import Submission, Feedback
class SubmissionView(DetailView):
......@@ -16,7 +19,35 @@ class SubmissionView(DetailView):
def get_object(self):
obj = Submission.objects.get(slug=self.kwargs['slug'])
if obj.final_feedback is not None:
if in_groups(self.request.user, ('Students', )) and hasattr(obj, 'feedback') and obj.feedback.status == Feedback.ACCEPTED:
obj.seen = True
obj.save()
return obj
def get_context_data(self, **kwargs):
context = super(SubmissionView, self).get_context_data(**kwargs)
context['is_reviewer'] = in_groups(self.request.user, ('Reviewers', ))
return context
@group_required('Reviewers')
def create_feedback_for_submission(request, slug):
submission = Submission.objects.get(slug=slug)
submission.feedback = Feedback()
submission.feedback.of_reviewer = request.user
submission.feedback.of_tutor = request.user
submission.feedback.of_submission = submission
submission.feedback.save()
submission.save()
return HttpResponseRedirect(reverse('FeedbackEdit', args=(submission.feedback.slug,)))
@group_required('Reviewers')
def get_submission_list(request):
context = {
'submission_list': Submission.objects.all(),
}
return render(request, 'core/student_submission_list.html', context)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment