Skip to content

Commit

Permalink
Merge pull request #89 from SELab-2/restricties
Browse files Browse the repository at this point in the history
Restricties
  • Loading branch information
mathis2003 authored Mar 30, 2024
2 parents d0496a8 + c68fd3a commit 3c0371d
Show file tree
Hide file tree
Showing 14 changed files with 202 additions and 31 deletions.
Binary file modified .coverage
Binary file not shown.
11 changes: 0 additions & 11 deletions .coveragerc

This file was deleted.

4 changes: 2 additions & 2 deletions .github/workflows/django.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Django CI

on:
push:
branches: [ "develop", "tests" ]
branches: [ "develop", "tests", "restricties" ]
pull_request:
branches: [ "develop", "tests" ]
branches: [ "develop", "tests", "restricties" ]

jobs:
build:
Expand Down
2 changes: 2 additions & 0 deletions api/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from api.models.project import Project
from api.models.indiening import Indiening, IndieningBestand
from api.models.score import Score
from api.models.restrictie import Restrictie

admin.site.register(Gebruiker)
admin.site.register(Vak)
Expand All @@ -13,3 +14,4 @@
admin.site.register(Indiening)
admin.site.register(Score)
admin.site.register(IndieningBestand)
admin.site.register(Restrictie)
1 change: 0 additions & 1 deletion api/models/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ class Project(models.Model):
max_score = models.IntegerField(default=20)
zichtbaar = models.BooleanField(default=True, blank=True)
gearchiveerd = models.BooleanField(default=False, blank=True)
# indiening restricties

def __str__(self):
return self.titel
31 changes: 31 additions & 0 deletions api/models/restrictie.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from django.db import models
from api.models.project import Project


def upload_to(instance, filename):
"""
Functie om het pad te genereren waar het opgavebestand wordt opgeslagen.
Args:
instance: De huidige instantie van het model.
filename (str): De oorspronkelijke bestandsnaam.
Returns:
str: Het pad waar het opgavebestand moet worden opgeslagen.
"""
project_id = instance.project.project_id
return f"data/restricties/project_{project_id}/{filename}"


class Restrictie(models.Model):
"""
TODO
"""

restrictie_id = models.AutoField(primary_key=True)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
script = models.FileField(upload_to=upload_to)
moet_slagen = models.BooleanField(default=False, blank=True)

def __str__(self):
return self.project.titel + ', restrictie: ' + str(self.script)
10 changes: 6 additions & 4 deletions api/serializers/gebruiker.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,11 @@ def update(self, instance, validated_data):
def validate_lesgever_change(instance):
if instance.is_lesgever and Vak.objects.filter(lesgevers=instance):
raise serializers.ValidationError(
f"De lesgever {instance} moet eerst verwijderd worden als lesgever in zijn huidige vakken"
)
f"De lesgever {instance} moet eerst verwijderd worden \
als lesgever in zijn huidige vakken"
)
elif not instance.is_lesgever and Vak.objects.filter(studenten=instance):
raise serializers.ValidationError(
f"De student {instance} moet eerst verwijderd worden als student in zijn huidige vakken"
)
f"De student {instance} moet eerst verwijderd worden \
als student in zijn huidige vakken"
)
12 changes: 12 additions & 0 deletions api/serializers/groep.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,25 @@ def update(self, instance, validated_data):
validate_students(
students_data, validated_data["project"], current_group=instance
)
new_project = validated_data.get('project')
validate_project(instance, new_project)

super().update(instance=instance, validated_data=validated_data)
instance.studenten.set(students_data)
instance.save()

return instance


def validate_project(instance, new_project):
"""
TODO
"""

if instance.project != new_project:
raise serializers.ValidationError('Het project van een groep kan niet aangepast worden')


def validate_students(students_data, project, current_group=None):
"""
Controleert of de opgegeven gebruikers studenten zijn en of ze al in een andere groep voor dit project zitten.
Expand Down
20 changes: 19 additions & 1 deletion api/serializers/project.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from rest_framework import serializers
from api.models.project import Project
from django.utils import timezone
from api.serializers.restrictie import RestrictieSerializer


class ProjectSerializer(serializers.ModelSerializer):
Expand All @@ -17,9 +18,14 @@ class ProjectSerializer(serializers.ModelSerializer):
update(self, instance, validated_data): Werkt een bestaand project bij in de database.
"""

restricties = RestrictieSerializer(many=True, read_only=True)

class Meta:
model = Project
fields = "__all__"
fields = [
'project_id', 'titel', 'beschrijving', 'opgave_bestand', 'vak', 'deadline',
'extra_deadline', 'max_score', 'zichtbaar', 'gearchiveerd', 'restricties'
]

def create(self, validated_data):
"""
Expand Down Expand Up @@ -52,6 +58,9 @@ def update(self, instance, validated_data):
extra_deadline = validated_data.pop("extra_deadline")
validate_deadlines(deadline, extra_deadline)

new_vak = validated_data.get('vak')
validate_vak(instance, new_vak)

super().update(instance=instance, validated_data=validated_data)
instance.deadline = deadline
instance.extra_deadline = extra_deadline
Expand All @@ -76,3 +85,12 @@ def validate_deadlines(deadline, extra_deadline):
raise serializers.ValidationError(
"Extra deadline moet na de eerste deadline liggen"
)


def validate_vak(instance, new_vak):
"""
TODO
"""

if instance.vak != new_vak:
raise serializers.ValidationError('Het vak van een project kan niet aangepast worden')
45 changes: 45 additions & 0 deletions api/serializers/restrictie.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from rest_framework import serializers
from api.models.restrictie import Restrictie


class RestrictieSerializer(serializers.ModelSerializer):
"""
TODO
"""

class Meta:
model = Restrictie
fields = "__all__"

def create(self, validated_data):
"""
TODO
"""

validate_script(validated_data.get('script'))
return Restrictie.objects.create(**validated_data)

def update(self, instance, validated_data):
"""
TODO
"""
validate_project(instance, validated_data.get('project'))
validate_script(instance, validated_data.get('script'))

super().update(instance=instance, validated_data=validated_data)
instance.save()
return instance


def validate_script(new_script):
if not str(new_script).endswith('.sh') or not str(new_script).endswith('.py'):
raise serializers.ValidationError('Het restrictie script moet een Python of Shell script zijn')


def validate_project(instance, new_project):
"""
TODO
"""

if instance.project != new_project:
raise serializers.ValidationError('Het project van een restrictie kan niet aangepast worden')
17 changes: 5 additions & 12 deletions api/serializers/score.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def update(self, instance, validated_data):
Score: De bijgewerkte score.
"""
validate_score(validated_data)
validate_indiening(instance, validated_data)
validate_indiening(instance, validated_data.get('indiening'))
super().update(instance=instance, validated_data=validated_data)
instance.save()
return instance
Expand All @@ -69,16 +69,9 @@ def validate_score(data):
)


def validate_indiening(instance, data):
def validate_indiening(instance, new_indiening):
"""
Controleert of de indiening_id niet wordt aangepast.
Args:
instance (Score): De score die moet worden bijgewerkt.
data (dict): Gevalideerde gegevens over de score.
Raises:
serializers.ValidationError: Als de indiening_id wordt aangepast.
TODO
"""
if instance.indiening != data.get("indiening"):
raise serializers.ValidationError("indiening_id kan niet aangepast worden")
if instance.indiening != new_indiening:
raise serializers.ValidationError("De indiening van een score kan niet aangepast worden")
3 changes: 3 additions & 0 deletions api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from .views.indiening import indiening_list, indiening_detail
from .views.score import score_list, score_detail
from .views.groep import groep_list, groep_detail
from .views.restrictie import restrictie_list, restrictie_detail

urlpatterns = [
path(
Expand All @@ -49,6 +50,8 @@
path("api/scores/<int:id>/", score_detail, name="score_detail"),
path("api/groepen/", groep_list, name="groep_list"),
path("api/groepen/<int:id>/", groep_detail, name="groep_detail"),
path("api/restricties/", restrictie_list, name="restrictie_list"),
path("api/restricties/<int:id>/", restrictie_detail, name="restrictie_detail"),
]

urlpatterns = format_suffix_patterns(urlpatterns)
71 changes: 71 additions & 0 deletions api/views/restrictie.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

from api.models.restrictie import Restrictie
from api.serializers.restrictie import RestrictieSerializer
from api.utils import is_lesgever


@api_view(["GET", "POST"])
def restrictie_list(request, format=None):
"""
TODO
"""
if is_lesgever(request.user):
if request.method == "GET":
restricties = Restrictie.objects.all()

if "project" in request.GET:
try:
project = eval(request.GET.get("project"))
restricties = restricties.filter(project=project)
except NameError:
return Response(status=status.HTTP_400_BAD_REQUEST)

if "moet_slagen" in request.GET and request.GET.get("moet_slagen").lower() in [
"true",
"false",
]:
restricties = restricties.filter(
moet_slagen=(request.GET.get("moet_slagen").lower() == "true")
)

serializer = RestrictieSerializer(restricties, many=True)
return Response(serializer.data)

elif request.method == "POST":
serializer = RestrictieSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(status=status.HTTP_403_FORBIDDEN)


@api_view(["GET", "PUT", "DELETE"])
def restrictie_detail(request, id, format=None):
"""
TODO
"""
try:
restrictie = Restrictie.objects.get(pk=id)
except Restrictie.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)

if is_lesgever(request.user):
if request.method == "GET":
serializer = RestrictieSerializer(restrictie)
return Response(serializer.data)

if request.method == "PUT":
serializer = RestrictieSerializer(restrictie, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

elif request.method == "DELETE":
restrictie.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
return Response(status=status.HTTP_403_FORBIDDEN)
6 changes: 6 additions & 0 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 3c0371d

Please sign in to comment.