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

reviewer can cycle through review requests

parent 9a3d6c00
No related branches found
No related tags found
No related merge requests found
...@@ -24,3 +24,4 @@ data/ ...@@ -24,3 +24,4 @@ data/
raw/ raw/
testing_facility/ testing_facility/
login_data.csv login_data.csv
klausur_*
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
<div class="form-inline"> <div class="form-inline">
{# Score field #} {# Score field #}
<div class="input-group col-5 nopadding mr-1"> <div class="input-group col-5 nopadding mr-1 mb-1">
<span class="input-group-addon">Score:</span> <span class="input-group-addon">Score:</span>
<input <input
class="form-control" class="form-control"
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
{# status select #} {# status select #}
{% with form.fields.status as status %} {% with form.fields.status as status %}
<div class="form-group mr-1"> <div class="form-group mr-1 mb-1">
<select class="custom-select" id="id_status" name="status"> <select class="custom-select" id="id_status" name="status">
{% for val, name in status.choices %} {% for val, name in status.choices %}
<option value="{{val}}" {% if val == feedback.status %}selected{% endif %}> {{name}}</option> <option value="{{val}}" {% if val == feedback.status %}selected{% endif %}> {{name}}</option>
...@@ -94,18 +94,19 @@ ...@@ -94,18 +94,19 @@
</div> </div>
{% endwith %} {% endwith %}
<button type="submit" form="form1" class="btn btn-secondary mr-1" name="update" value="Submit">Submit</button> <button type="submit" form="form1" class="btn btn-secondary mr-1 mb-1" name="update" value="Submit">Submit</button>
{% if feedback.status != feedback.ACCEPTED and feedback.origin == feedback.MANUAL%} {# Beware! compares status and origin #}
<button type="submit" form="form1" class="btn btn-success mr-1" name="update" value="Next">Next</button> {% 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>
{% endif %} {% endif %}
{% if feedback.origin != feedback.MANUAL %} {% if feedback.origin != feedback.MANUAL %}
<a href="{% url 'FeedbackDelete' feedback.slug %}" class="btn btn-outline-danger" 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 %} {% endif %}
{% if feedback.status == feedback.ACCEPTED %} {% if feedback.status == feedback.ACCEPTED %}
<button class="btn btn-secondary mr-1" value="Submit" disabled>View is read only</button> <button class="btn btn-secondary mr-1 mb-1" value="Submit" disabled>View is read only</button>
{% endif %} {% endif %}
</div> </div>
</form> </form>
......
...@@ -67,7 +67,16 @@ class FeedbackEdit(UpdateView): ...@@ -67,7 +67,16 @@ class FeedbackEdit(UpdateView):
form.instance.finalize_feedback(self.request.user) form.instance.finalize_feedback(self.request.user)
else: else:
form.instance.unfinalize_feedback() form.instance.unfinalize_feedback()
if 'Next' in self.request.POST['update'] and not in_groups(self.request.user, ('Reviewers', )):
# ugly needs patch
if 'Next' in self.request.POST['update']:
if in_groups(self.request.user, ('Reviewers',)):
needs_review = Feedback.objects.filter(status=Feedback.NEEDS_REVIEW)
needs_review = needs_review[0] if needs_review else None
if needs_review:
return HttpResponseRedirect(reverse('FeedbackEdit', args=(needs_review.slug,)))
else:
return HttpResponseRedirect(self.get_success_url())
return HttpResponseRedirect(reverse('CreateFeedbackForType', args=(form.instance.of_submission.type.slug,))) return HttpResponseRedirect(reverse('CreateFeedbackForType', args=(form.instance.of_submission.type.slug,)))
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(self.get_success_url())
......
...@@ -39,7 +39,7 @@ def get_annotated_feedback_count(): ...@@ -39,7 +39,7 @@ def get_annotated_feedback_count():
return SubmissionType.objects.annotate( # to display only manual return SubmissionType.objects.annotate( # to display only manual
feedback_count=Count('submissions__feedback_list')).annotate( feedback_count=Count('submissions__feedback_list')).annotate(
submission_count=Count('submissions') submission_count=Count('submissions')
).all() ).all().order_by('name')
@group_required('Tutors') @group_required('Tutors')
def tutor_view(request): def tutor_view(request):
......
...@@ -10,8 +10,10 @@ import argparse ...@@ -10,8 +10,10 @@ import argparse
from collections import namedtuple from collections import namedtuple
django.setup() django.setup()
HTML_DIR = 'data/html' INFO = 0
SOLUTION_DIR = 'data/code/code-lsg'
HTML_DIR = 'html'
SOLUTION_DIR = 'code/code-lsg'
wordfile = xp.locate_wordfile() wordfile = xp.locate_wordfile()
wordlist = xp.generate_wordlist(wordfile=wordfile, min_length=5, max_length=8) wordlist = xp.generate_wordlist(wordfile=wordfile, min_length=5, max_length=8)
...@@ -21,6 +23,10 @@ from django.contrib.auth.models import Group, User ...@@ -21,6 +23,10 @@ from django.contrib.auth.models import Group, User
from core.models import Student, Submission, SubmissionType, Feedback from core.models import Student, Submission, SubmissionType, Feedback
if INFO:
info = print
else:
info = lambda _: 0
def parseme(): def parseme():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
...@@ -75,9 +81,9 @@ def add_submission_type(name, ...@@ -75,9 +81,9 @@ def add_submission_type(name,
task.correction_guideline = correction_guideline task.correction_guideline = correction_guideline
task.save() task.save()
if created: if created:
print(f"- Created Task {task.name}") info(f"- Created Task {task.name}")
else: else:
print(f"- Got Task {task.name}") info(f"- Got Task {task.name}")
return task return task
...@@ -97,12 +103,12 @@ def add_submission(type, text, student, compiler_output): ...@@ -97,12 +103,12 @@ def add_submission(type, text, student, compiler_output):
sub.pre_corrections = compiler_output sub.pre_corrections = compiler_output
sub.save() sub.save()
add_auto_feedback(sub, compiler_output) add_auto_feedback(sub, compiler_output)
print(f"- Created Submission of Type {sub.type}") info(f"- Created Submission of Type {sub.type}")
return sub return sub
def add_auto_feedback(submission, compiler_output): def add_auto_feedback(submission, compiler_output):
if not compiler_output: if submission.text and not compiler_output:
return # let the tutor do his job return # let the tutor do his job
def deduct_feedback_type() -> (str, str): def deduct_feedback_type() -> (str, str):
...@@ -112,18 +118,22 @@ def add_auto_feedback(submission, compiler_output): ...@@ -112,18 +118,22 @@ def add_auto_feedback(submission, compiler_output):
return Feedback.DID_NOT_COMPILE, Feedback.NEEDS_REVIEW return Feedback.DID_NOT_COMPILE, Feedback.NEEDS_REVIEW
elif compiler_output.endswith('COULD NOT LINK'): elif compiler_output.endswith('COULD NOT LINK'):
return Feedback.COULD_NOT_LINK, Feedback.NEEDS_REVIEW return Feedback.COULD_NOT_LINK, Feedback.NEEDS_REVIEW
else:
return None, None
auto_correct, _ = User.objects.get_or_create(username='auto_correct') auto_correct, _ = User.objects.get_or_create(username='auto_correct')
feedback = Feedback() feedback = Feedback()
feedback.text = "--- Was generated automatically ---" feedback.text = "--- Was generated automatically ---"
feedback.origin, feedback.status = deduct_feedback_type() feedback.origin, feedback.status = deduct_feedback_type()
if feedback.origin is None and feedback.status is None:
return
feedback.of_submission = submission feedback.of_submission = submission
feedback.of_tutor = auto_correct feedback.of_tutor = auto_correct
feedback.save() feedback.save()
if feedback.origin == Feedback.WAS_EMPTY: if feedback.origin == Feedback.WAS_EMPTY:
submission.final_feedback = feedback submission.final_feedback = feedback
submission.save() submission.save()
print(f"- Created {feedback.origin} Feedback for Submission {submission}") info(f"- Created {feedback.origin} Feedback for Submission {submission}")
return feedback return feedback
...@@ -148,17 +158,17 @@ def add_user(username, group): ...@@ -148,17 +158,17 @@ def add_user(username, group):
login_writer.writerow([username, password]) login_writer.writerow([username, password])
user.set_password(password) user.set_password(password)
group.user_set.add(user) group.user_set.add(user)
print(f"- Created user {user} and added him to group {group}") info(f"- Created user {user} and added him to group {group}")
user.save() user.save()
else: else:
print(f"- User {user} of group {group} was already created.") info(f"- User {user} of group {group} was already created.")
return user return user
def add_group(group_name): def add_group(group_name):
group, _ = Group.objects.get_or_create(name=group_name) group, _ = Group.objects.get_or_create(name=group_name)
print(f"- Created group {group}") info(f"- Created group {group}")
return group return group
...@@ -167,7 +177,7 @@ def create_superuser(): ...@@ -167,7 +177,7 @@ def create_superuser():
User.objects.create_superuser( User.objects.create_superuser(
username='doncamillo', password=getpass.getpass(), email='a@b.com') username='doncamillo', password=getpass.getpass(), email='a@b.com')
except Exception as e: except Exception as e:
print("- Superuser was already created.") info("- Superuser was already created.")
return return
...@@ -213,8 +223,8 @@ class PopulateDatabase: ...@@ -213,8 +223,8 @@ class PopulateDatabase:
self.type_dict = {} self.type_dict = {}
for t in types: for t in types:
with \ with \
open(os.path.join(SOLUTION_DIR, t.id + '-lsg.c' )) as lsg, \ open(os.path.join(self.args.DATADIR, SOLUTION_DIR, t.id + '-lsg.c' )) as lsg, \
open(os.path.join(HTML_DIR, t.id + '.html' )) as desc: open(os.path.join(self.args.DATADIR, HTML_DIR, t.id + '.html' )) as desc:
self.type_dict[t.id] = add_submission_type( self.type_dict[t.id] = add_submission_type(
f"[{t.id}] {t.name}", f"[{t.id}] {t.name}",
t.score, t.score,
......
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