diff --git a/core/models.py b/core/models.py index 8be60cc193a0d78425ab9bab416f18e00e3dc9a7..c791475106ae8c0c57a390024ce1c09aaa5a90de 100644 --- a/core/models.py +++ b/core/models.py @@ -43,6 +43,7 @@ from random import sample, randrange from string import ascii_lowercase +from collections import OrderedDict from django.contrib.auth.models import User from django.db import models @@ -50,6 +51,7 @@ from django.db.models import Q SLUG_LENGTH = 16 + def random_slug(): return ''.join(sample(ascii_lowercase, SLUG_LENGTH)) @@ -67,13 +69,13 @@ class SubmissionType(models.Model): possible_solution = models.TextField() correction_guideline = models.TextField() + def __str__(self): + return self.name + class Meta: verbose_name = "SubmissionType" verbose_name_plural = "SubmissionType Set" - def __str__(self): - return self.name - class Student(models.Model): # Fields @@ -86,17 +88,31 @@ class Student(models.Model): limit_choices_to={'groups__name': 'Students'}, ) + def score_per_submission(self): + if self.submissions.all(): + return OrderedDict({ + s.type : s.feedback.score if hasattr(s, 'feedback') else 0 + for s in self.submissions.all() + }) + else: + return OrderedDict({ + t.name : 0 for t in SubmissionType.objects.all() + }) + + def overall_score(self): + return sum(self.score_per_submission().values()) + def disable(self): self.has_logged_in = True self.save() + def __str__(self): + return self.user.username + class Meta: verbose_name = "Student" verbose_name_plural = "Student Set" - def __str__(self): - return self.user.username - class Submission(models.Model): @@ -111,7 +127,11 @@ class Submission(models.Model): ) text = models.TextField(blank=True) pre_corrections = models.TextField(blank=True) - student = models.ForeignKey(Student, on_delete=models.CASCADE) + student = models.ForeignKey( + Student, + on_delete=models.CASCADE, + related_name='submissions' + ) class Meta: verbose_name = "Submission" @@ -145,7 +165,7 @@ class Submission(models.Model): candidates = cls.objects.filter( ( - Q(feedback__isnull=True) + Q(feedback__isnull=True) | Q(feedback__origin=Feedback.DID_NOT_COMPILE) | Q(feedback__origin=Feedback.COULD_NOT_LINK) ) @@ -161,7 +181,8 @@ class Submission(models.Model): return False submission = candidates[0] - feedback = submission.feedback if hasattr(submission, 'feedback') else Feedback() + feedback = submission.feedback if hasattr( + submission, 'feedback') else Feedback() feedback.origin = Feedback.MANUAL feedback.status = Feedback.EDITABLE feedback.of_tutor = tutor diff --git a/core/serializers.py b/core/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..9323508eaaf0eb21b1b2f2eb3fa8dcd1355778f0 --- /dev/null +++ b/core/serializers.py @@ -0,0 +1,49 @@ + +from rest_framework import serializers + +from core.models import SubmissionType, Student +from django.contrib.auth.models import User + + +class SubmissionTypeSerializer(serializers.ModelSerializer): + + def create(self, validated_data): + return SubmissionType(**validated_data) + + class Meta: + model = SubmissionType + exclude = ('slug', 'correction_guideline',) + + +class CreateStudentSerializer(serializers.ModelSerializer): + + username = serializers.CharField(source='user.username') + email = serializers.CharField(source='user.email') + password = serializers.CharField(source='user.password') + + class Meta: + model = Student + fields = ('username', 'name', 'email', 'matrikel_no', 'password') + extra_kwargs = {'password': {'write_only': True}} + + def to_representation(self, obj): + return { + 'username' : obj.user.username, + 'name' : obj.name, + 'matrikel_no' : obj.matrikel_no, + } + + def create(self, validated_data): + user = User( + email=validated_data['email'], + username=validated_data['username'] + ) + user.set_password(validated_data['password']) + + student = Student( + name=validated_data['name'], + matrikel_no=validated_data['matrikel_no'], + user=user, + ) + + return student diff --git a/core/views/export_csv.py b/core/views/export_csv.py index 3606541433009a0b9ddd26a528cfb9e35e820995..93dbffda982558fb661d244a1fc38e6dacb38ae9 100644 --- a/core/views/export_csv.py +++ b/core/views/export_csv.py @@ -1,7 +1,7 @@ import csv from django.http import HttpResponse -from core.models import Student, SubmissionType, Submission +from core.models import Student, SubmissionType from core.custom_annotations import group_required @@ -16,16 +16,12 @@ def export_csv(request): [s.name for s in SubmissionType.objects.all().order_by('name')]) for student in Student.objects.all(): - submissions = Submission.objects.filter(student=student) - score_list = [s.feedback.score if hasattr(s, 'feedback') else 0 for s in submissions.order_by('type__name')] - if not score_list: - score_list = [0] * SubmissionType.objects.count() writer.writerow([ student.matrikel_no, student.user.username, student.name, - sum(score_list), - *score_list + student.overall_score(), + *student.score_per_submission().values() ]) return response