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

Reworked score field

parent 479e42ae
No related branches found
No related tags found
No related merge requests found
......@@ -22,17 +22,6 @@ class FeedbackForm(ModelForm):
required=False,
)
score = IntegerField(
widget=NumberInput(
attrs={
'name': 'score',
'id': 'id_score',
'min': '0',
'class': 'form-control mx-sm-1',
}
)
)
def clean(self):
cleaned_data = super().clean()
score = cleaned_data.get("score")
......@@ -45,6 +34,13 @@ class FeedbackForm(ModelForm):
params={'max_score': full_score},
)
final = cleaned_data.get("final")
if final:
raise ValidationError(
"Feedback is final and not editable",
code="is_final",
)
class Meta:
model = Feedback
auto_id = False
......
......@@ -8,102 +8,117 @@
{% block body_block %}
<div class="row m-2">
<div class="col-auto m-2">
<h2>The student submitted:</h2>
<textarea id="student_text">
{{ feedback.of_submission.text }}
</textarea>
<div class="my-2">
<a class="btn btn-primary" data-toggle="collapse" href="#collapsed_task" aria-expanded="false" aria-controls="collapsed_task">Task</a>
<a class="btn btn-primary" data-toggle="collapse" href="#possible_solution" aria-expanded="false" aria-controls="possible_solution">Solution</a>
<a class="btn btn-primary" data-toggle="collapse" href="#correction_guideline" aria-expanded="false" aria-controls="correction_guideline">Guideline</a>
<a class="btn btn-primary" data-toggle="collapse" href="#custom_feedback" aria-expanded="false" aria-controls="custom_feedback">Custom feedback</a>
<button type="button" id="collapseAllOpen" class="btn btn-secondary">Open All</button>
<button type="button" id="collapseAllClose" class="btn btn-secondary">Close All</button>
</div>
<div class="collapse my-2" id="collapsed_task">
<div class="card card-block">
{{ feedback.of_submission.type.task_description }}
</div>
</div>
<div class="collapse my-2" id="possible_solution">
<div class="card card-block">
{{ feedback.of_submission.type.possible_solution }}
</div>
</div>
<div class="collapse my-2" id="correction_guideline">
<div class="card card-block">
{{ feedback.of_submission.type.correction_guideline }}
</div>
<div class="col my-2">
<h2>The student submitted:</h2>
<textarea id="student_text">
{{ feedback.of_submission.text }}
</textarea>
<div class="my-2">
<a class="btn btn-primary" data-toggle="collapse" href="#collapsed_task" aria-expanded="false" aria-controls="collapsed_task">Task</a>
<a class="btn btn-primary" data-toggle="collapse" href="#possible_solution" aria-expanded="false" aria-controls="possible_solution">Solution</a>
<a class="btn btn-primary" data-toggle="collapse" href="#correction_guideline" aria-expanded="false" aria-controls="correction_guideline">Guideline</a>
<a class="btn btn-primary" data-toggle="collapse" href="#custom_feedback" aria-expanded="false" aria-controls="custom_feedback">Custom feedback</a>
<button type="button" id="collapseAllOpen" class="btn btn-secondary">Open All</button>
<button type="button" id="collapseAllClose" class="btn btn-secondary">Close All</button>
</div>
<div class="collapse my-2" id="collapsed_task">
<div class="card card-block">
{{ feedback.of_submission.type.task_description }}
</div>
</div>
<div class="collapse my-2" id="possible_solution">
<div class="card card-block">
{{ feedback.of_submission.type.possible_solution }}
</div>
</div>
<div class="collapse my-2" id="correction_guideline">
<div class="card card-block">
{{ feedback.of_submission.type.correction_guideline }}
</div>
</div>
<div class="collapse my-2" id="custom_feedback">
<div class="card card-block">
Compiler output / custom feedback goes here.
</div>
</div>
</div>
<div class="col-auto my-2">
<h2>Please provide your feedback here:</h2>
<form action="{% url 'FeedbackEdit' feedback.slug %}" method="post" id="form1">
{% csrf_token %}
{% for field in form %}
{% if field.name == "score" %}
<div class="row my-2">
<div class="col-6">
<div class="input-group">
<span class="input-group-addon" id="sizing-addon1">Score:</span>
<input class="form-control" id="id_score" min="0" max="{{ feedback.of_submission.type.full_score }}" name="score" type="number" value="{{ field.value }}" required>
<span class="input-group-btn">
<button id="assign_full_score" class="btn btn-secondary" type="button"><code>/{{ feedback.of_submission.type.full_score }}</code></button>
</span>
</div>
</div>
<div class="collapse my-2" id="custom_feedback">
<div class="card card-block">
Compiler output / custom feedback goes here.
</div>
<div class="col-5">
{% if not feedback.final %}
<button type="submit" form="form1" class="btn btn-success" name="update" value="Submit">Submit</button>
<a href="{% url 'FeedbackDelete' feedback.slug %}" class="btn btn-danger" name="delete" value="Delete">Delete</a>
{% else %}
<button class="btn btn-success mx-1" value="Submit" disabled>Submit</button>
<button class="btn btn-danger" value="Delete" disabled>Delete</button>
{% endif %}
</div>
</div>
<div class="col-auto m-2">
<h2>Please provide your feedback here:</h2>
<form action="{% url 'FeedbackEdit' feedback.slug %}" method="post" id="form1">
{% csrf_token %}
{% for field in form %}
{% if field.name == "score" %}
<div class="form-inline my-2">
<label for="id_{{ field.name }}">{{ field.name|capfirst }}:</label>
{{ field }}
{% if not feedback.final %}
<button type="submit" form="form1" class="btn btn-success mx-1" name="update" value="Submit">Submit</button>
<a href="{% url 'FeedbackDelete' feedback.slug %}" class="btn btn-danger" name="delete" value="Delete">Delete</a>
{% else %}
<button class="btn btn-success mx-1" value="Submit" disabled>Submit</button>
<button class="btn btn-danger" value="Delete" disabled>Delete</button>
{% endif %}
</div>
{% else %}
<div> {{ field }} </div>
{% endif %}
{% endfor %}
</form>
</div>
{% else %}
<div> {{ field }} </div>
{% endif %}
{% endfor %}
</div>
</form>
</div>
</div>
{% endblock %}
{% block script_block %}
<script>
$(document).ready(function(){
$('#collapseAllClose').hide();
$('#collapseAllOpen').click(function(){
$('.collapse').collapse('show');
$('#collapseAllOpen').hide();
$('#collapseAllClose').show();
});
$(document).ready(function(){
$('#collapseAllClose').hide();
$('#collapseAllClose').click(function(){
$('.collapse').collapse('hide');
$('#collapseAllClose').hide();
$('#collapseAllOpen').show();
});
});
var studentTextArea = document.getElementById('student_text');
var editorTutor = CodeMirror.fromTextArea(studentTextArea, {
lineNumbers: true,
readOnly: true,
$('#collapseAllOpen').click(function(){
$('.collapse').collapse('show');
$('#collapseAllOpen').hide();
$('#collapseAllClose').show();
});
editorTutor.setSize(600, 500);
var tutorTextArea = document.getElementById('id_text');
var editorTutor = CodeMirror.fromTextArea(tutorTextArea, {
lineNumbers: true,
{% if not feedback.final %}
keyMap: "vim",
{% else %}
readOnly: true,
{% endif %}
$('#collapseAllClose').click(function(){
$('.collapse').collapse('hide');
$('#collapseAllClose').hide();
$('#collapseAllOpen').show();
});
editorTutor.setSize(600, 500);
$('#assign_full_score').click(function(){
$('#id_score')[0].value = {{ feedback.of_submission.type.full_score }};
})
});
var studentTextArea = document.getElementById('student_text');
var editorStudent = CodeMirror.fromTextArea(studentTextArea, {
lineNumbers: true,
readOnly: true,
});
editorStudent.setSize(600, 500);
var tutorTextArea = document.getElementById('id_text');
var editorTutor = CodeMirror.fromTextArea(tutorTextArea, {
lineNumbers: true,
{% if not feedback.final %}
keyMap: "vim",
{% else %}
readOnly: true,
{% endif %}
});
editorTutor.setSize(600, 500);
</script>
{% endblock script_block %}
......@@ -5,18 +5,18 @@
{% block nav_title %} Ready for an exam, commander? {% endblock nav_title %}
{% block body_block %}
<div class="row-md-auto m-4 page-header">
<div class="row-md-auto my-4 page-header">
{% if feedback_list|length == 0 %}
<h2>You havn't provided any feedback yet. Sad. Get to work!</h2>
{% else %}
{% if feedback_list|length == 1 %}
<h2>So far you have provieded one constribution </h2>
{% else %}
<h2>So far you have provided {{feedback_list|length}} constributions.</h2>
<h2>So far you have provided {{feedback_list|length}} constributions</h2>
{% endif %}
</div>
<div class="row-md-auto my-2">
<div class="row my-2">
<table class="table">
<thead>
<tr>
......@@ -46,7 +46,7 @@
{% endif %}
<div class="row-md-auto my-4">
<div class="row-md-auto my-2">
<a role="button" class="btn btn-danger btn-xl" href="{% url 'FeedbackCreate' %}">Give me work</a>
</div>
{% endblock body_block %}
......@@ -122,12 +122,14 @@ def delete_feedback(request, feedback_slug):
return HttpResponseRedirect(reverse('start'))
@group_required('Reviewers')
def markfinal_feedback(request, feedback_slug):
instance = Feedback.objects.get(slug=feedback_slug)
instance.finalize_feedback(request.user)
return HttpResponseRedirect(reverse('start'))
@group_required('Reviewers')
def markunfinal_feedback(request, feedback_slug):
instance = Feedback.objects.get(slug=feedback_slug)
instance.unfinalize_feedback()
......@@ -161,7 +163,7 @@ class FeedbackEdit(UpdateView):
"""
If the form is valid, redirect to the supplied URL.
"""
if form.is_valid() and not form.instance.final:
if form.is_valid():
form.instance.empty = False
form.save()
return HttpResponseRedirect(self.get_success_url())
......
Django~=1.10.6
django-extensions~=1.7.7
gunicorn~=19.7.0
psycopg2~=2.7.1
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment