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