diff --git a/core/migrations/0007_auto_20170522_1827.py b/core/migrations/0007_auto_20170522_1827.py new file mode 100644 index 0000000000000000000000000000000000000000..f69800a37fe4bdb41c7f1d037dc4d2eb2e077b7a --- /dev/null +++ b/core/migrations/0007_auto_20170522_1827.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-05-22 18:27 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0006_auto_20170413_1102'), + ] + + operations = [ + migrations.AlterField( + model_name='submission', + name='student', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submissions', to='core.Student'), + ), + migrations.AlterUniqueTogether( + name='submission', + unique_together=set([('type', 'student')]), + ), + ] diff --git a/core/migrations/0008_auto_20170522_1834.py b/core/migrations/0008_auto_20170522_1834.py new file mode 100644 index 0000000000000000000000000000000000000000..7eb42fad8d01012fdfeba12b7f068dde59af52fe --- /dev/null +++ b/core/migrations/0008_auto_20170522_1834.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-05-22 18:34 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0007_auto_20170522_1827'), + ] + + operations = [ + migrations.RenameField( + model_name='submission', + old_name='seen', + new_name='seen_by_student', + ), + migrations.RemoveField( + model_name='submissiontype', + name='correction_guideline', + ), + ] diff --git a/core/models.py b/core/models.py index c791475106ae8c0c57a390024ce1c09aaa5a90de..8f217892b9bbe75103c1004368eae692fb995916 100644 --- a/core/models.py +++ b/core/models.py @@ -62,12 +62,12 @@ def random_matrikel_no(): class SubmissionType(models.Model): # Fields - name = models.CharField(max_length=50, unique=True) - slug = models.SlugField(editable=False, unique=True, default=random_slug) - full_score = models.PositiveIntegerField(default=0) - task_description = models.TextField() + name = models.CharField(max_length=50, unique=True) + full_score = models.PositiveIntegerField(default=0) + task_description = models.TextField() possible_solution = models.TextField() - correction_guideline = models.TextField() + slug = models.SlugField( + editable=False, unique=True, default=random_slug) def __str__(self): return self.name @@ -79,10 +79,11 @@ class SubmissionType(models.Model): class Student(models.Model): # Fields + has_logged_in = models.BooleanField(default=False) + name = models.CharField(max_length=50, default="__no_name__") + matrikel_no = models.CharField( unique=True, max_length=8, default=random_matrikel_no) - has_logged_in = models.BooleanField(default=False) - name = models.CharField(max_length=50, default="__no_name__") user = models.OneToOneField( User, on_delete=models.CASCADE, limit_choices_to={'groups__name': 'Students'}, @@ -92,7 +93,7 @@ class Student(models.Model): if self.submissions.all(): return OrderedDict({ s.type : s.feedback.score if hasattr(s, 'feedback') else 0 - for s in self.submissions.all() + for s in self.submissions.all() }) else: return OrderedDict({ @@ -117,25 +118,25 @@ class Student(models.Model): class Submission(models.Model): # Fields - slug = models.SlugField(editable=False, unique=True, default=random_slug) - - # This indicates that the student has seen his feedback - seen = models.BooleanField(default=False) - type = models.ForeignKey( - SubmissionType, - related_name='submissions' - ) - text = models.TextField(blank=True) + seen_by_student = models.BooleanField(default=False) + text = models.TextField(blank=True) pre_corrections = models.TextField(blank=True) - student = models.ForeignKey( + slug = models.SlugField( + editable=False, + unique=True, + default=random_slug) + type = models.ForeignKey( + SubmissionType, + related_name='submissions') + student = models.ForeignKey( Student, on_delete=models.CASCADE, - related_name='submissions' - ) + related_name='submissions') class Meta: verbose_name = "Submission" verbose_name_plural = "Submission Set" + unique_together = (('type', 'student'),) def __str__(self): return "Submission of type '{}' from Student '{}'".format( @@ -201,21 +202,17 @@ class Feedback(models.Model): slug = models.SlugField( editable=False, unique=True, - default=random_slug - ) + default=random_slug) of_submission = models.OneToOneField( Submission, related_name='feedback', - blank=False, null=False - ) + blank=False, null=False) of_tutor = models.ForeignKey( - User, related_name='corrected_submissions', - ) + User, related_name='corrected_submissions',) of_reviewer = models.ForeignKey( User, related_name='reviewed_submissions', - blank=True, null=True - ) + blank=True, null=True) # what is the current status of our feedback ( diff --git a/core/serializers.py b/core/serializers.py index 9323508eaaf0eb21b1b2f2eb3fa8dcd1355778f0..baa9bf28f3105696d0f752a5dca7af2411042aa5 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -1,7 +1,7 @@ from rest_framework import serializers -from core.models import SubmissionType, Student +from core.models import SubmissionType, Student, Submission from django.contrib.auth.models import User @@ -40,10 +40,30 @@ class CreateStudentSerializer(serializers.ModelSerializer): ) user.set_password(validated_data['password']) - student = Student( + return Student.objects.create( name=validated_data['name'], matrikel_no=validated_data['matrikel_no'], user=user, ) - return student +class CreateSubmissionSerializer(serializers.ModelSerializer): + + type = serializers.SlugRelatedField( + queryset=SubmissionType.objects.all(), + slug_field='name' + ) + + student = serializers.SlugRelatedField( + queryset=User.objects.all(), + slug_field='username' + ) + + class Meta: + model = Submission + fields = ('type', 'text', 'pre_corrections', 'student') + + def create(self, validated_data): + validated_data['student'] = validated_data['student'].student + return Submission.objects.create(**validated_data) + + diff --git a/core/templates/core/s/student_startpage.html b/core/templates/core/s/student_startpage.html index ca5a7f723c14abdcf7244beeedf3af11925638dc..9ee3bb14f84c78314c88b3265fb712efc1e1aa84 100644 --- a/core/templates/core/s/student_startpage.html +++ b/core/templates/core/s/student_startpage.html @@ -24,7 +24,7 @@ {% for submission in submission_list %} <tr class="align-middle"> <td class="align-middle"> - {% if submission.seen %} + {% if submission.seen_by_student %} <span class="badge badge-success">Seen</span> {% endif %} </td> diff --git a/core/views/submission.py b/core/views/submission.py index 99d4b13c3fb70592a19c7c503bf1497d8c9ecd52..2b93d90c3d2d209ee3f44f86d4073e47f69a5d91 100644 --- a/core/views/submission.py +++ b/core/views/submission.py @@ -20,7 +20,7 @@ class SubmissionViewStudent(DetailView): def get_object(self): obj = Submission.objects.get(slug=self.kwargs['slug']) if in_groups(self.request.user, ('Students', )) and hasattr(obj, 'feedback') and obj.feedback.status == Feedback.ACCEPTED: - obj.seen = True + obj.seen_by_student = True obj.save() return obj