diff --git a/src/homework/migrations/0004_auto_20180204_1209.py b/src/homework/migrations/0004_auto_20180204_1209.py new file mode 100644 index 0000000000000000000000000000000000000000..4a5edae2bf510af877be158eaf1179a88561f9ec --- /dev/null +++ b/src/homework/migrations/0004_auto_20180204_1209.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2018-02-04 11:09 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('homework', '0003_auto_20180124_1818'), + ] + + operations = [ + migrations.AlterField( + model_name='solution', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/src/homework/migrations/0005_auto_20180204_1525.py b/src/homework/migrations/0005_auto_20180204_1525.py new file mode 100644 index 0000000000000000000000000000000000000000..33d8e8b819be271f58c67f9fa6ef5fc023e30be0 --- /dev/null +++ b/src/homework/migrations/0005_auto_20180204_1525.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2018-02-04 14:25 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('homework', '0004_auto_20180204_1209'), + ] + + operations = [ + migrations.RenameField( + model_name='solution', + old_name='date', + new_name='alma', + ), + ] diff --git a/src/homework/migrations/0006_auto_20180204_1601.py b/src/homework/migrations/0006_auto_20180204_1601.py new file mode 100644 index 0000000000000000000000000000000000000000..f6bdbc058c2d151c208b0b03cddadb7cd7855e51 --- /dev/null +++ b/src/homework/migrations/0006_auto_20180204_1601.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2018-02-04 15:01 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('homework', '0005_auto_20180204_1525'), + ] + + operations = [ + migrations.RenameField( + model_name='solution', + old_name='alma', + new_name='date', + ), + ] diff --git a/src/homework/permissions.py b/src/homework/permissions.py index 8c1bc6a6dcca2ecdcfc18a7c12d47a80d3304861..659c3a60c87ea61abb684a8c0e6f91b568685431 100644 --- a/src/homework/permissions.py +++ b/src/homework/permissions.py @@ -27,3 +27,14 @@ class IsStaffOrReadOnlyForAuthenticated(BasePermission): """ def has_permission(self, request, view): return request.user.is_staff or request.method in SAFE_METHODS and request.user.is_authenticated + + +class IsStaffUser(BasePermission): + + """ + The request is authenticated as a staff + """ + + def has_permission(self, request, view): + return request.user.is_staff + \ No newline at end of file diff --git a/src/homework/serializers.py b/src/homework/serializers.py index d27ebf8cbaaded2b210af704aa9ec7a27b4f0444..4ce68b43063f2a4b52158fbc2e78a074333653b8 100644 --- a/src/homework/serializers.py +++ b/src/homework/serializers.py @@ -15,4 +15,13 @@ class SolutionSerializer(serializers.ModelSerializer): model = models.Solution read_only_fields = ('created_by', 'date' 'ready') extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}} - fields = '__all__' + fields = ('task', 'date', 'accepted', 'files', 'created_by') + + def validate(self, attrs): + task = attrs['task'] + date = attrs['date'] + + if task.deadline < date: + raise serializers.ValidationError("You cannot submit homework after the deadline") + + return attrs diff --git a/src/homework/urls.py b/src/homework/urls.py index b049f63b55b713070f71fd581696af0c728649ee..a77de30b08c47de0fb4942e0a71ea68002612ada 100644 --- a/src/homework/urls.py +++ b/src/homework/urls.py @@ -2,7 +2,7 @@ from rest_framework import routers from . import views router = routers.DefaultRouter() -router.register(r'tasks', views.TasksViewSet) -router.register(r'solutions', views.SolutionViewSet) +router.register(r'tasks', views.TasksViewSet, base_name='tasks') +router.register(r'solutions', views.SolutionsViewSet, base_name='solutions') urlpatterns = router.urls diff --git a/src/homework/views.py b/src/homework/views.py index 005d45349a77e4b97de29a4b90ed736430a9f4c2..e4da4efbfa3c5314db257b1695fd4a769403311d 100644 --- a/src/homework/views.py +++ b/src/homework/views.py @@ -1,11 +1,13 @@ from rest_framework import viewsets - +from rest_framework.response import Response +from rest_framework import status +from rest_framework.decorators import list_route +from django.http import Http404 +from django.shortcuts import get_object_or_404 from . import serializers from . import models from . import permissions -from rest_framework.response import Response -from rest_framework import status class TasksViewSet(viewsets.ModelViewSet): @@ -14,7 +16,7 @@ class TasksViewSet(viewsets.ModelViewSet): permission_classes = (permissions.IsStaffOrReadOnlyForAuthenticated, ) -class SolutionViewSet(viewsets.ModelViewSet): +class SolutionsViewSet(viewsets.ModelViewSet): serializer_class = serializers.SolutionSerializer queryset = models.Solution.objects.all() permission_classes = (permissions.IsStaffOrReadOnlyForAuthenticated, ) @@ -22,7 +24,21 @@ class SolutionViewSet(viewsets.ModelViewSet): def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) - serializer.validated_data['accepted'] = False - self.perform_create(serializer) + # serializer.validated_data['accepted'] = False + # task_id = serializer.validated_data.get('task') + # date = serializer.validated_data['date'] + # task = get_object_or_404(models.Task, pk=task_id) + # if task_id.deadline < date: + # return Http404("Deadline") headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + + def get_queryset(self): + user = self.request.user + if user.has_perm(permissions.IsStaffUser): + return models.Solution.objects.all() + + @list_route(methods=['get']) + def me(self, request): + serializer = self.serializer_class(request.user.profile) #request ? + return Response(serializer.data) \ No newline at end of file