From e0a49273c0d86644208425a18a85f865dcde1c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodor=20M=C3=A1t=C3=A9?= <bmate711@gmail.com> Date: Mon, 5 Feb 2018 16:32:09 +0100 Subject: [PATCH] update views & solution serializer --- .../migrations/0004_auto_20180204_1209.py | 22 +++++++++++++++ .../migrations/0005_auto_20180204_1525.py | 20 +++++++++++++ .../migrations/0006_auto_20180204_1601.py | 20 +++++++++++++ src/homework/permissions.py | 12 +++++++- src/homework/serializers.py | 11 +++++++- src/homework/urls.py | 4 +-- src/homework/views.py | 28 +++++++++++++++---- 7 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 src/homework/migrations/0004_auto_20180204_1209.py create mode 100644 src/homework/migrations/0005_auto_20180204_1525.py create mode 100644 src/homework/migrations/0006_auto_20180204_1601.py 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 0000000..4a5edae --- /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 0000000..33d8e8b --- /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 0000000..f6bdbc0 --- /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 a8d1ae6..061b11c 100644 --- a/src/homework/permissions.py +++ b/src/homework/permissions.py @@ -34,9 +34,19 @@ class IsStaffOrReadOnlyForAuthenticated(BasePermission): The request is authenticated as a staff, or is a read-only request for authenticated. """ - def has_object_permission(self, request, view): + 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 diff --git a/src/homework/serializers.py b/src/homework/serializers.py index d27ebf8..4ce68b4 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 b049f63..a77de30 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 005d453..6819a7d 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 -- GitLab