diff --git a/src/homework/admin.py b/src/homework/admin.py index 8c38f3f3dad51e4585f3984282c2a4bec5349c1e..38fed616d8ac56d7290d795fd12ada5d18b4fadd 100644 --- a/src/homework/admin.py +++ b/src/homework/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from . import models # Register your models here. +admin.site.register(models.Solution) +admin.site.register(models.Task) \ No newline at end of file diff --git a/src/homework/migrations/0001_initial.py b/src/homework/migrations/0001_initial.py new file mode 100644 index 0000000000000000000000000000000000000000..57b9c1f5cea623dae04423523f427ff85e27bdc3 --- /dev/null +++ b/src/homework/migrations/0001_initial.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2018-01-24 12:09 +from __future__ import unicode_literals + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import homework.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Solution', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateTimeField(auto_now_add=True)), + ('ready', models.BooleanField()), + ('files', models.FileField(blank=True, upload_to='', validators=[django.core.validators.FileExtensionValidator('image/png', 'image/jpeg', 'application/zip')])), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Student', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('homework', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='homework.Solution')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Task', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=150)), + ('date', models.DateTimeField(auto_now_add=True)), + ('deadline', models.DateTimeField(validators=[homework.models.validate_deadline])), + ('text', models.TextField()), + ('files', models.FileField(blank=True, upload_to='', validators=[django.core.validators.FileExtensionValidator('image/png', 'image/jpeg', 'application/zip')])), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.AddField( + model_name='solution', + name='task', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='homework.Task'), + ), + ] diff --git a/src/homework/migrations/0002_auto_20180124_1453.py b/src/homework/migrations/0002_auto_20180124_1453.py new file mode 100644 index 0000000000000000000000000000000000000000..597c83e833b380d48452111a0e35eafaaa16969a --- /dev/null +++ b/src/homework/migrations/0002_auto_20180124_1453.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2018-01-24 13:53 +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', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='student', + name='homework', + ), + migrations.RemoveField( + model_name='student', + name='user', + ), + migrations.AddField( + model_name='solution', + name='accepted', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='solution', + name='created_by', + field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='solution', + name='ready', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='solution', + name='task', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='task_solution', to='homework.Task'), + ), + migrations.AlterField( + model_name='task', + name='created_by', + field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.DeleteModel( + name='Student', + ), + ] diff --git a/src/homework/migrations/0003_auto_20180124_1818.py b/src/homework/migrations/0003_auto_20180124_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..1fcd873a015a4518dc233d5a7071279bd0fe7165 --- /dev/null +++ b/src/homework/migrations/0003_auto_20180124_1818.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2018-01-24 17:18 +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', '0002_auto_20180124_1453'), + ] + + operations = [ + migrations.AlterField( + model_name='task', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/src/homework/models.py b/src/homework/models.py index 0ea978653e30d95254dd3b5ad4e4d4b31a8014ce..0e94c27c497efe4e6dd8eed001356a8b5b0a27b5 100644 --- a/src/homework/models.py +++ b/src/homework/models.py @@ -4,12 +4,11 @@ from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from django.core import validators -from . import myfields - +# from . import myfields # 5MB - 5242880 -MAX_UPLOAD_SIZE = 5242880 +__MAX_UPLOAD_SIZE = 5242880 def validate_deadline(date): @@ -18,17 +17,22 @@ def validate_deadline(date): # def validate_file_size(file): -# if file._size > MAX_UPLOAD_SIZE: -# raise ValidationError(_('Please keep filesize under' + MAX_UPLOAD_SIZE)) +# if file._size > __MAX_UPLOAD_SIZE: +# raise ValidationError(_('Please keep filesize under' + __MAX_UPLOAD_SIZE)) class Task(models.Model): - title = models.CharField(max_length=150) - date = models.DateTimeField(auto_now_add=True, editable=False) - deadline = models.DateTimeField(validators=[validate_deadline]) + title = models.CharField(max_length=150, ) + date = models.DateTimeField(auto_now_add=True, editable=False, ) + deadline = models.DateTimeField(validators=[validate_deadline], ) text = models.TextField() - created_by = models.ForeignKey(User) - files = models.FileField(validators=[validators.FileExtensionValidator('image/png', 'image/jpeg', 'application/zip')], - blank=True, + created_by = models.ForeignKey(User, ) + files = models.FileField( + validators=[validators.FileExtensionValidator( + 'image/png', + 'image/jpeg', + 'application/zip', + )], + blank=True, ) # files = myfields.RestrictedFileField( # content_types=['image/png', 'image/jpeg', 'application/zip'], @@ -38,28 +42,28 @@ class Task(models.Model): # ) # solution_file = models.BooleanField() # -# - # def deadline_clean(self): - # if self.deadline <= timezone.now(): - # raise ValidationError(_('Invalid date'), code='invalid') +# def clean(self): +# if self.deadline <= timezone.now(): +# raise ValidationError(_('Invalid date'), code='invalid') class Solution(models.Model): - task = models.ForeignKey(Task, on_delete=models.CASCADE,) - date = models.DateTimeField(auto_now_add=True, editable=False) - ready = models.BooleanField() - files = models.FileField(validators=[ - validators.FileExtensionValidator('image/png', 'image/jpeg', 'application/zip')], + task = models.ForeignKey(Task, related_name='task_solution', on_delete=models.CASCADE, ) + # student = models.ForeignKey(account.models.Profile, related_name='student_solution', on_delete=models.CASCADE) + date = models.DateTimeField(auto_now_add=True, editable=False, ) + ready = models.BooleanField(default=False, ) #if(Soulution.date <= Task.deadline) + accepted = models.BooleanField(default=False, ) + files = models.FileField( + validators=[validators.FileExtensionValidator( + 'image/png', + 'image/jpeg', + 'application/zip', + )], blank=True, ) - created_by = models.ForeignKey(User) + created_by = models.ForeignKey(User, ) # files = myfields.RestrictedFileField( # content_types=['image/png', 'image/jpeg', 'application/zip'], # max_upload_size=MAX_UPLOAD_SIZE, # blank=True, # ) - - -class Student(models.Model): - user = models.OneToOneField(User) - homework = models.ForeignKey(Solution, on_delete=models.CASCADE) diff --git a/src/homework/permissions.py b/src/homework/permissions.py index 190743e7269715043e31f591240efb4fab77c2ec..762faedb33fa88dc0dbe620325847a39bd1809ce 100644 --- a/src/homework/permissions.py +++ b/src/homework/permissions.py @@ -26,3 +26,12 @@ class IsAuthenticatedOrReadOnly(BasePermission): request.user and request.user.is_authenticated ) + + +class IsStaffOrReadOnlyForAuthenticated(BasePermission): + + def has_object_permission(self, request, view, obj): + return (request.user.is_staff or + request.method in SAFE_METHODS and + request.user.is_authenticated + ) diff --git a/src/homework/serializers.py b/src/homework/serializers.py index 4ca1c9a52c6122926751602a53571ad23fbcc7e1..d27ebf8cbaaded2b210af704aa9ec7a27b4f0444 100644 --- a/src/homework/serializers.py +++ b/src/homework/serializers.py @@ -5,20 +5,14 @@ from . import models class TaskSerializer(serializers.ModelSerializer): class Meta: model = models.Task - fields = '__all__' read_only_fields = ('created_by', 'date') extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}} + fields = '__all__' class SolutionSerializer(serializers.ModelSerializer): class Meta: model = models.Solution - fields = '__all__' - read_only_fields = ('created_by', 'date') + read_only_fields = ('created_by', 'date' 'ready') extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}} - - -class StudentSerializer(serializers.ModelSerializer): - class Meta: - model = models.Student fields = '__all__' diff --git a/src/homework/urls.py b/src/homework/urls.py index 1fe81c80ffd12d0934235950a68785ae9b67bcfb..b049f63b55b713070f71fd581696af0c728649ee 100644 --- a/src/homework/urls.py +++ b/src/homework/urls.py @@ -4,7 +4,5 @@ from . import views router = routers.DefaultRouter() router.register(r'tasks', views.TasksViewSet) router.register(r'solutions', views.SolutionViewSet) -router.register(r'students', views.StudentViewSet) -app_name = 'homework' urlpatterns = router.urls diff --git a/src/homework/views.py b/src/homework/views.py index 548bab0f4ad5d5244e8ba5f2d0585ae36bd9c062..2d0344bd9b35109ba97288633535d3bfa4c0921e 100644 --- a/src/homework/views.py +++ b/src/homework/views.py @@ -4,21 +4,25 @@ from rest_framework import viewsets from . import serializers from . import models from . import permissions +from rest_framework.response import Response +from rest_framework import status class TasksViewSet(viewsets.ModelViewSet): serializer_class = serializers.TaskSerializer queryset = models.Task.objects.all() - permission_classes = (permissions.IsStaffOrReadOnly,) + permission_classes = (permissions.IsStaffOrReadOnly, ) class SolutionViewSet(viewsets.ModelViewSet): serializer_class = serializers.SolutionSerializer queryset = models.Solution.objects.all() - #permission_classes = () - - -class StudentViewSet(viewsets.ModelViewSet): - serializer_class = serializers.StudentSerializer - queryset = models.Student.objects.all() - + permission_classes = (permissions.SolutionPermission, ) + + 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) + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)