Skip to content
Snippets Groups Projects
Commit 6006d129 authored by Bodor Máté's avatar Bodor Máté
Browse files

permissions & SolutionCreateViwe

parent b240772e
No related branches found
No related tags found
No related merge requests found
from django.contrib import admin from django.contrib import admin
from . import models
# Register your models here. # Register your models here.
admin.site.register(models.Solution)
admin.site.register(models.Task)
\ No newline at end of file
# -*- 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'),
),
]
# -*- 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',
),
]
# -*- 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),
),
]
...@@ -4,12 +4,11 @@ from django.core.exceptions import ValidationError ...@@ -4,12 +4,11 @@ from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils import timezone from django.utils import timezone
from django.core import validators from django.core import validators
from . import myfields # from . import myfields
# 5MB - 5242880 # 5MB - 5242880
MAX_UPLOAD_SIZE = 5242880 __MAX_UPLOAD_SIZE = 5242880
def validate_deadline(date): def validate_deadline(date):
...@@ -18,17 +17,22 @@ def validate_deadline(date): ...@@ -18,17 +17,22 @@ def validate_deadline(date):
# def validate_file_size(file): # def validate_file_size(file):
# if file._size > MAX_UPLOAD_SIZE: # if file._size > __MAX_UPLOAD_SIZE:
# raise ValidationError(_('Please keep filesize under' + MAX_UPLOAD_SIZE)) # raise ValidationError(_('Please keep filesize under' + __MAX_UPLOAD_SIZE))
class Task(models.Model): class Task(models.Model):
title = models.CharField(max_length=150) title = models.CharField(max_length=150, )
date = models.DateTimeField(auto_now_add=True, editable=False) date = models.DateTimeField(auto_now_add=True, editable=False, )
deadline = models.DateTimeField(validators=[validate_deadline]) deadline = models.DateTimeField(validators=[validate_deadline], )
text = models.TextField() text = models.TextField()
created_by = models.ForeignKey(User) created_by = models.ForeignKey(User, )
files = models.FileField(validators=[validators.FileExtensionValidator('image/png', 'image/jpeg', 'application/zip')], files = models.FileField(
blank=True, validators=[validators.FileExtensionValidator(
'image/png',
'image/jpeg',
'application/zip',
)],
blank=True,
) )
# files = myfields.RestrictedFileField( # files = myfields.RestrictedFileField(
# content_types=['image/png', 'image/jpeg', 'application/zip'], # content_types=['image/png', 'image/jpeg', 'application/zip'],
...@@ -38,28 +42,28 @@ class Task(models.Model): ...@@ -38,28 +42,28 @@ class Task(models.Model):
# ) # )
# solution_file = models.BooleanField() # solution_file = models.BooleanField()
# #
# # def clean(self):
# def deadline_clean(self): # if self.deadline <= timezone.now():
# if self.deadline <= timezone.now(): # raise ValidationError(_('Invalid date'), code='invalid')
# raise ValidationError(_('Invalid date'), code='invalid')
class Solution(models.Model): class Solution(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE,) task = models.ForeignKey(Task, related_name='task_solution', on_delete=models.CASCADE, )
date = models.DateTimeField(auto_now_add=True, editable=False) # student = models.ForeignKey(account.models.Profile, related_name='student_solution', on_delete=models.CASCADE)
ready = models.BooleanField() date = models.DateTimeField(auto_now_add=True, editable=False, )
files = models.FileField(validators=[ ready = models.BooleanField(default=False, ) #if(Soulution.date <= Task.deadline)
validators.FileExtensionValidator('image/png', 'image/jpeg', 'application/zip')], accepted = models.BooleanField(default=False, )
files = models.FileField(
validators=[validators.FileExtensionValidator(
'image/png',
'image/jpeg',
'application/zip',
)],
blank=True, blank=True,
) )
created_by = models.ForeignKey(User) created_by = models.ForeignKey(User, )
# files = myfields.RestrictedFileField( # files = myfields.RestrictedFileField(
# content_types=['image/png', 'image/jpeg', 'application/zip'], # content_types=['image/png', 'image/jpeg', 'application/zip'],
# max_upload_size=MAX_UPLOAD_SIZE, # max_upload_size=MAX_UPLOAD_SIZE,
# blank=True, # blank=True,
# ) # )
class Student(models.Model):
user = models.OneToOneField(User)
homework = models.ForeignKey(Solution, on_delete=models.CASCADE)
...@@ -26,3 +26,12 @@ class IsAuthenticatedOrReadOnly(BasePermission): ...@@ -26,3 +26,12 @@ class IsAuthenticatedOrReadOnly(BasePermission):
request.user and request.user and
request.user.is_authenticated 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
)
...@@ -5,20 +5,14 @@ from . import models ...@@ -5,20 +5,14 @@ from . import models
class TaskSerializer(serializers.ModelSerializer): class TaskSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.Task model = models.Task
fields = '__all__'
read_only_fields = ('created_by', 'date') read_only_fields = ('created_by', 'date')
extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}} extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}}
fields = '__all__'
class SolutionSerializer(serializers.ModelSerializer): class SolutionSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.Solution model = models.Solution
fields = '__all__' read_only_fields = ('created_by', 'date' 'ready')
read_only_fields = ('created_by', 'date')
extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}} extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}}
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Student
fields = '__all__' fields = '__all__'
...@@ -4,7 +4,5 @@ from . import views ...@@ -4,7 +4,5 @@ from . import views
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'tasks', views.TasksViewSet) router.register(r'tasks', views.TasksViewSet)
router.register(r'solutions', views.SolutionViewSet) router.register(r'solutions', views.SolutionViewSet)
router.register(r'students', views.StudentViewSet)
app_name = 'homework'
urlpatterns = router.urls urlpatterns = router.urls
...@@ -4,21 +4,25 @@ from rest_framework import viewsets ...@@ -4,21 +4,25 @@ from rest_framework import viewsets
from . import serializers from . import serializers
from . import models from . import models
from . import permissions from . import permissions
from rest_framework.response import Response
from rest_framework import status
class TasksViewSet(viewsets.ModelViewSet): class TasksViewSet(viewsets.ModelViewSet):
serializer_class = serializers.TaskSerializer serializer_class = serializers.TaskSerializer
queryset = models.Task.objects.all() queryset = models.Task.objects.all()
permission_classes = (permissions.IsStaffOrReadOnly,) permission_classes = (permissions.IsStaffOrReadOnly, )
class SolutionViewSet(viewsets.ModelViewSet): class SolutionViewSet(viewsets.ModelViewSet):
serializer_class = serializers.SolutionSerializer serializer_class = serializers.SolutionSerializer
queryset = models.Solution.objects.all() queryset = models.Solution.objects.all()
#permission_classes = () permission_classes = (permissions.SolutionPermission, )
def create(self, request, *args, **kwargs):
class StudentViewSet(viewsets.ModelViewSet): serializer = self.get_serializer(data=request.data)
serializer_class = serializers.StudentSerializer serializer.is_valid(raise_exception=True)
queryset = models.Student.objects.all() 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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment