diff --git a/api/middleware.py b/api/middleware.py index 150bc458..47d922db 100644 --- a/api/middleware.py +++ b/api/middleware.py @@ -3,6 +3,18 @@ from django.urls import reverse class RedirectAnonymousUserMiddleware: + """ + Middleware die anonieme gebruikers omleidt naar de inlogpagina. + Deze middleware controleert of de gebruiker anoniem is en of het huidige pad niet de inlogpagina is. + Als dit het geval is, wordt de gebruiker omgeleid naar de inlogpagina die is geconfigureerd in de instellingen. + + Args: + get_response (function): De functie die wordt aangeroepen om het verzoek te verwerken. + + Returns: + HttpResponse: Een HTTP-omleiding naar de inlogpagina als de gebruiker anoniem is en het huidige pad niet de inlogpagina is. + Anders wordt het verzoek verder verwerkt door de volgende middleware of de weergavefunctie. + """ def __init__(self, get_response): self.get_response = get_response diff --git a/api/models/gebruiker.py b/api/models/gebruiker.py index 8b26f94b..96766053 100644 --- a/api/models/gebruiker.py +++ b/api/models/gebruiker.py @@ -3,6 +3,16 @@ class Gebruiker(models.Model): + """ + Model voor een gebruiker, dat zich uitbreidt op het standaardgebruikermodel van Django. + + Fields: + user (OneToOneField): Een veld dat verwijst naar het standaardgebruikermodel van Django met een één-op-één-relatie. Dit veld fungeert als het primaire sleutelveld. + is_lesgever (BooleanField): Een boolean veld dat aangeeft of de gebruiker een lesgever is of niet. Standaard ingesteld op False. + + Methods: + __str__(): Geeft een representatie van het model als een string terug, die de voornaam en achternaam van de gebruiker bevat. + """ user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) is_lesgever = models.BooleanField(default=False) diff --git a/api/models/groep.py b/api/models/groep.py index 79f44a83..67bf6a00 100644 --- a/api/models/groep.py +++ b/api/models/groep.py @@ -2,6 +2,17 @@ class Groep(models.Model): + """ + Model voor een groep van studenten voor een project. + + Fields: + groep_id (AutoField): Een automatisch gegenereerd veld dat fungeert als de primaire sleutel voor de groep. + studenten (ManyToManyField): Een Many-to-Many relatie met het 'Gebruiker' model, waarmee meerdere gebruikers aan een groep kunnen worden gekoppeld. + project (ForeignKey): Een ForeignKey relatie met het 'Project' model, waarmee wordt aangegeven tot welk project deze groep behoort. Als het bijbehorende project wordt verwijderd, worden ook de bijbehorende groepen verwijderd. + + Methods: + __str__(): Geeft een representatie van het model als een string terug, die de groeps-ID bevat. + """ groep_id = models.AutoField(primary_key=True) studenten = models.ManyToManyField('Gebruiker', related_name='groep_studenten', blank=True) project = models.ForeignKey('Project', on_delete=models.CASCADE) diff --git a/api/models/indiening.py b/api/models/indiening.py index 5c1b1097..ecdc4efe 100644 --- a/api/models/indiening.py +++ b/api/models/indiening.py @@ -2,9 +2,30 @@ def upload_to(instance, filename): + """ + Functie om het pad te genereren waar het bestand wordt opgeslagen. + + Args: + instance: De huidige instantie van het model. + filename (str): De oorspronkelijke bestandsnaam. + + Returns: + str: Het pad waar het bestand moet worden opgeslagen. + """ return f'data/indieningen/indiening_{instance.indiening_id}/{filename}' class Indiening(models.Model): + """ + Model voor een indiening van een groep. + + Fields: + indiening_id (AutoField): Een automatisch gegenereerd veld dat fungeert als de primaire sleutel voor de indiening. + groep (ForeignKey): Een ForeignKey relatie met het 'Groep' model, waarmee wordt aangegeven tot welke groep deze indiening behoort. Als de bijbehorende groep wordt verwijderd, worden ook de bijbehorende indieningen verwijderd. + tijdstip (DateTimeField): Een veld dat automatisch het tijdstip registreert waarop de indiening is aangemaakt. + + Methods: + __str__(): Geeft een representatie van het model als een string terug, die de ID van de indiening bevat. + """ indiening_id = models.AutoField(primary_key=True) groep = models.ForeignKey('Groep', on_delete=models.CASCADE) tijdstip = models.DateTimeField(auto_now_add=True) @@ -14,6 +35,17 @@ def __str__(self): class IndieningBestand(models.Model): + """ + Model voor een bestand dat aan een indiening is gekoppeld. + + Fields: + indiening_bestand_id (AutoField): Een automatisch gegenereerd veld dat fungeert als de primaire sleutel voor het bestand. + indiening (ForeignKey): Een ForeignKey relatie met het 'Indiening' model, waarmee wordt aangegeven tot welke indiening dit bestand behoort. Als de bijbehorende indiening wordt verwijderd, wordt ook het bijbehorende bestand verwijderd. + bestand (FileField): Een veld voor het uploaden van het bestand. + + Methods: + __str__(): Geeft een representatie van het model als een string terug, die de bestandsnaam bevat. + """ indiening_bestand_id = models.AutoField(primary_key=True) indiening = models.ForeignKey('Indiening', on_delete=models.CASCADE) bestand = models.FileField(upload_to=upload_to) diff --git a/api/models/project.py b/api/models/project.py index 58016522..a9b0e18b 100644 --- a/api/models/project.py +++ b/api/models/project.py @@ -2,11 +2,37 @@ from .vak import Vak 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. + """ vak_id = instance.vak.vak_id return f'data/opgaves/vak_{vak_id}/{filename}' class Project(models.Model): + """ + Model voor een project binnen een vak. + + Fields: + project_id (AutoField): Een automatisch gegenereerd veld dat fungeert als de primaire sleutel voor het project. + titel (CharField): Titel van het project. + beschrijving (TextField): Beschrijving van het project. + opgave_bestand (FileField): Een veld voor het uploaden van het opgavebestand voor het project. (eventueel uit te breiden tot meerdere bestanden mogelijk) + vak (ForeignKey): Een ForeignKey relatie met het 'Vak' model, waarmee wordt aangegeven tot welk vak dit project behoort. Als het bijbehorende vak wordt verwijderd, worden ook de bijbehorende projecten verwijderd. + deadline (DateTimeField): Een veld voor het instellen van de deadline voor het project. Kan optioneel zijn (null=True). + max_score (IntegerField): Een veld voor het instellen van de maximale score voor het project. Standaard ingesteld op 20. + # indiening restricties (TODO): Restricties/tests bij indiening moeten nog toegevoegd worden. + + Methods: + __str__(): Geeft een representatie van het model als een string terug, die de titel van het project bevat. + """ project_id = models.AutoField(primary_key=True) titel = models.CharField(max_length=100) beschrijving = models.TextField() diff --git a/api/models/score.py b/api/models/score.py index ca160dda..74f96ffc 100644 --- a/api/models/score.py +++ b/api/models/score.py @@ -2,6 +2,17 @@ class Score(models.Model): + """ + Model voor het bijhouden van scores voor indieningen. + + Fields: + score_id (AutoField): Een automatisch gegenereerd veld dat fungeert als de primaire sleutel voor de score. + score (SmallIntegerField): Een veld om de scorewaarde op te slaan. + indiening (ForeignKey): Een ForeignKey relatie met het 'Indiening' model, waarmee wordt aangegeven tot welke indiening deze score behoort. Als de bijbehorende indiening wordt verwijderd, wordt ook de bijbehorende score verwijderd. + + Methods: + __str__(): Geeft een representatie van het model als een string terug, die de score-ID bevat. + """ score_id = models.AutoField(primary_key=True) score = models.SmallIntegerField() indiening = models.ForeignKey('Indiening', on_delete=models.CASCADE) diff --git a/api/models/vak.py b/api/models/vak.py index 77f05be6..7be7b8d5 100644 --- a/api/models/vak.py +++ b/api/models/vak.py @@ -2,6 +2,18 @@ class Vak(models.Model): + """ + Model voor een vak. + + Fields: + vak_id (AutoField): Een automatisch gegenereerd veld dat fungeert als de primaire sleutel voor het vak. + naam (CharField): Een veld om de naam van het vak op te slaan. + studenten (ManyToManyField): Een Many-to-Many relatie met het 'Gebruiker' model, waarmee meerdere gebruikers aan het vak kunnen worden gekoppeld als studenten. + lesgevers (ManyToManyField): Een Many-to-Many relatie met het 'Gebruiker' model, waarmee meerdere gebruikers aan het vak kunnen worden gekoppeld als lesgevers. + + Methods: + __str__(): Geeft een representatie van het model als een string terug, die de naam van het vak bevat. + """ vak_id = models.AutoField(primary_key=True) naam = models.CharField(max_length=100) studenten = models.ManyToManyField('Gebruiker', related_name='vak_gebruikers', blank=True) diff --git a/api/serializers/gebruiker.py b/api/serializers/gebruiker.py index d03ff176..768831a4 100644 --- a/api/serializers/gebruiker.py +++ b/api/serializers/gebruiker.py @@ -3,15 +3,41 @@ class GebruikerSerializer(serializers.ModelSerializer): + """ + Serializer voor het serialiseren en deserialiseren van Gebruiker objecten. + + Fields: + Meta.model (Gebruiker): Het model waarop de serializer is gebaseerd. + Meta.fields (tuple): De velden die moeten worden opgenomen in de serializer. Hier wordt '__all__' gebruikt om alle velden op te nemen. + + Methods: + create(self, validated_data): Maakt een nieuwe gebruiker aan en voegt deze toe aan de database. + update(self, instance, validated_data): Werkt een bestaande gebruiker bij in de database. + """ class Meta: model = Gebruiker fields = '__all__' def create(self, validated_data): + """ + Args: + validated_data (dict): Gevalideerde gegevens over de gebruiker. + + Returns: + Gebruiker: De aangemaakte gebruiker. + """ instance = Gebruiker.objects.create(**validated_data) return instance def update(self, instance, validated_data): + """ + Args: + instance (Gebruiker): De gebruiker die moet worden bijgewerkt. + validated_data (dict): Gevalideerde gegevens over de gebruiker. + + Returns: + Gebruiker: De bijgewerkte gebruiker. + """ instance.is_lesgever = validated_data.pop('is_lesgever') instance.save() - return instance \ No newline at end of file + return instance diff --git a/api/serializers/groep.py b/api/serializers/groep.py index f728467c..1ed9e978 100644 --- a/api/serializers/groep.py +++ b/api/serializers/groep.py @@ -3,23 +3,48 @@ class GroepSerializer(serializers.ModelSerializer): + """ + Serializer voor het serialiseren en deserialiseren van Groep objecten. + + Fields: + Meta.model (Groep): Het model waarop de serializer is gebaseerd. + Meta.fields (tuple): De velden die moeten worden opgenomen in de serializer. Hier wordt '__all__' gebruikt om alle velden op te nemen. + + Methods: + create(self, validated_data): Maakt een nieuwe groep aan en voegt deze toe aan de database. + update(self, instance, validated_data): Werkt een bestaande groep bij in de database. + """ class Meta: model = Groep fields = '__all__' def create(self, validated_data): + """ + Args: + validated_data (dict): Gevalideerde gegevens over de groep. + + Returns: + Groep: De aangemaakte groep. + """ students_data = validated_data.pop('studenten') validate_students(students_data, validated_data['project']) - + instance = Groep.objects.create(**validated_data) instance.studenten.set(students_data) return instance - + def update(self, instance, validated_data): + """ + Args: + instance (Groep): De groep die moet worden bijgewerkt. + validated_data (dict): Gevalideerde gegevens over de groep. + + Returns: + Groep: De bijgewerkte groep. + """ students_data = validated_data.pop('studenten') validate_students(students_data, validated_data['project']) - super().update(instance=instance, validated_data=validated_data) instance.studenten.set(students_data) instance.save() @@ -29,12 +54,22 @@ def update(self, instance, validated_data): def validate_students(students_data, project): + """ + Controleert of de opgegeven gebruikers studenten zijn en of ze al in een andere groep voor dit project zitten. + + Args: + students_data (list): Een lijst met gebruikers die aan de groep moeten worden toegevoegd. + project (Project): Het project waartoe de groep behoort. + + Raises: + serializers.ValidationError: Als een gebruiker geen student is of al in een andere groep voor dit project zit. + """ groepen = Groep.objects.filter(project=project) - + for student in students_data: if student.is_lesgever: raise serializers.ValidationError("Alle gebruikers in 'studenten' moeten studenten zijn!") - + for groep in groepen: if groep.studenten.contains(student): - raise serializers.ValidationError(f"Gebruiker {student.user.id} zit al in een groep voor dit project") \ No newline at end of file + raise serializers.ValidationError(f"Gebruiker {student.user.id} zit al in een groep voor dit project") diff --git a/api/serializers/indiening.py b/api/serializers/indiening.py index 7f4f94be..c53dd8be 100644 --- a/api/serializers/indiening.py +++ b/api/serializers/indiening.py @@ -3,12 +3,28 @@ class IndieningSerializer(serializers.ModelSerializer): + """ + Serializer voor het serialiseren en deserialiseren van Indiening objecten. + + Fields: + Meta.model (Indiening): Het model waarop de serializer is gebaseerd. + Meta.fields (tuple): De velden die moeten worden opgenomen in de serializer. Hier worden alle velden opgenomen. + + """ class Meta: model = Indiening fields = ('__all__') class IndieningBestandSerializer(serializers.ModelSerializer): + """ + Serializer voor het serialiseren en deserialiseren van IndieningBestand objecten. + + Fields: + Meta.model (IndieningBestand): Het model waarop de serializer is gebaseerd. + Meta.fields (tuple): De velden die moeten worden opgenomen in de serializer. Hier worden alle velden opgenomen. + + """ class Meta: model = IndieningBestand fields = ('__all__') \ No newline at end of file diff --git a/api/serializers/project.py b/api/serializers/project.py index 33484740..df8de252 100644 --- a/api/serializers/project.py +++ b/api/serializers/project.py @@ -4,11 +4,29 @@ class ProjectSerializer(serializers.ModelSerializer): + """ + Serializer voor het serialiseren en deserialiseren van Project objecten. + + Fields: + Meta.model (Project): Het model waarop de serializer is gebaseerd. + Meta.fields (tuple): De velden die moeten worden opgenomen in de serializer. Hier wordt '__all__' gebruikt om alle velden op te nemen. + + Methods: + create(self, validated_data): Maakt een nieuw project aan en voegt deze toe aan de database. + update(self, instance, validated_data): Werkt een bestaand project bij in de database. + """ class Meta: model = Project fields = '__all__' def create(self, validated_data): + """ + Args: + validated_data (dict): Gevalideerde gegevens over het project. + + Returns: + Project: Het aangemaakte project. + """ deadline = validated_data.pop('deadline') validate_deadline(deadline) @@ -16,8 +34,16 @@ def create(self, validated_data): project.deadline = deadline project.save() return project - + def update(self, instance, validated_data): + """ + Args: + instance (Project): Het project dat moet worden bijgewerkt. + validated_data (dict): Gevalideerde gegevens over het project. + + Returns: + Project: Het bijgewerkte project. + """ deadline = validated_data.pop('deadline') validate_deadline(deadline) @@ -25,8 +51,17 @@ def update(self, instance, validated_data): instance.deadline = deadline instance.save() return instance - + def validate_deadline(deadline): + """ + Controleert of de opgegeven deadline in de toekomst ligt. + + Args: + deadline (datetime): De deadline van het project. + + Raises: + serializers.ValidationError: Als de deadline in het verleden ligt. + """ if deadline <= timezone.now(): - raise serializers.ValidationError("Deadline moet in de toekomst liggen") \ No newline at end of file + raise serializers.ValidationError("Deadline moet in de toekomst liggen") diff --git a/api/serializers/score.py b/api/serializers/score.py index ca13ff08..2d80e260 100644 --- a/api/serializers/score.py +++ b/api/serializers/score.py @@ -3,29 +3,74 @@ class ScoreSerializer(serializers.ModelSerializer): + """ + Serializer voor het serialiseren en deserialiseren van Score objecten. + + Fields: + Meta.model (Score): Het model waarop de serializer is gebaseerd. + Meta.fields (tuple): De velden die moeten worden opgenomen in de serializer. Hier wordt '__all__' gebruikt om alle velden op te nemen. + + Methods: + create(self, validated_data): Maakt een nieuwe score aan en voegt deze toe aan de database. + update(self, instance, validated_data): Werkt een bestaande score bij in de database. + """ class Meta: model = Score fields = '__all__' def create(self, validated_data): + """ + Args: + validated_data (dict): Gevalideerde gegevens over de score. + + Returns: + Score: De aangemaakte score. + """ if Score.objects.filter(indiening=validated_data.get('indiening')).exists(): raise serializers.ValidationError("Deze indiening heeft al een bestaande score") validate_score(validated_data) return Score.objects.create(**validated_data) - + def update(self, instance, validated_data): + """ + Args: + instance (Score): De score die moet worden bijgewerkt. + validated_data (dict): Gevalideerde gegevens over de score. + + Returns: + Score: De bijgewerkte score. + """ validate_score(validated_data) validate_indiening(instance, validated_data) super().update(instance=instance, validated_data=validated_data) instance.save() return instance - + def validate_score(data): + """ + Controleert of de opgegeven score niet hoger is dan de maximale score van het bijbehorende project. + + Args: + data (dict): Gevalideerde gegevens over de score. + + Raises: + serializers.ValidationError: Als de score hoger is dan de maximale score van het bijbehorende project. + """ max_score = data.get('indiening').groep.project.max_score if data['score'] > max_score: raise serializers.ValidationError(f'Score kan niet hoger zijn dan de maximale score van {max_score}') - + def validate_indiening(instance, data): + """ + 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. + """ if instance.indiening != data.get('indiening'): raise serializers.ValidationError('indiening_id kan niet aangepast worden') diff --git a/api/serializers/vak.py b/api/serializers/vak.py index 14426212..98b7f13c 100644 --- a/api/serializers/vak.py +++ b/api/serializers/vak.py @@ -3,14 +3,32 @@ class VakSerializer(serializers.ModelSerializer): + """ + Serializer voor het serialiseren en deserialiseren van Vak objecten. + + Fields: + Meta.model (Vak): Het model waarop de serializer is gebaseerd. + Meta.fields (tuple): De velden die moeten worden opgenomen in de serializer. Hier wordt '__all__' gebruikt om alle velden op te nemen. + + Methods: + create(self, validated_data): Maakt een nieuw vak aan en voegt deze toe aan de database. + update(self, instance, validated_data): Werkt een bestaand vak bij in de database. + """ class Meta: model = Vak fields = '__all__' - + def create(self, validated_data): + """ + Args: + validated_data (dict): Gevalideerde gegevens over het vak. + + Returns: + Vak: Het aangemaakte vak. + """ students_data = validated_data.pop('studenten') teachers_data = validated_data.pop('lesgevers') - + validate_students_teachers(students_data, teachers_data) vak = Vak.objects.create(**validated_data) @@ -20,6 +38,14 @@ def create(self, validated_data): return vak def update(self, instance, validated_data): + """ + Args: + instance (Vak): Het vak dat moet worden bijgewerkt. + validated_data (dict): Gevalideerde gegevens over het vak. + + Returns: + Vak: Het bijgewerkte vak. + """ students_data = validated_data.pop('studenten', []) teachers_data = validated_data.pop('lesgevers', []) @@ -31,12 +57,22 @@ def update(self, instance, validated_data): instance.save() return instance - + def validate_students_teachers(students_data, teachers_data): + """ + Controleert of alle gebruikers in 'studenten' studenten zijn en alle gebruikers in 'lesgevers' lesgevers zijn. + + Args: + students_data (list): Een lijst met gebruikers die aan het vak moeten worden toegevoegd als studenten. + teachers_data (list): Een lijst met gebruikers die aan het vak moeten worden toegevoegd als lesgevers. + + Raises: + serializers.ValidationError: Als een gebruiker in 'studenten' geen student is of een gebruiker in 'lesgevers' geen lesgever is. + """ for student in students_data: if student.is_lesgever: raise serializers.ValidationError("Alle gebruikers in 'studenten' moeten studenten zijn") for teacher in teachers_data: if not teacher.is_lesgever: - raise serializers.ValidationError("Alle gebruikers in 'lesgevers' moeten lesgevers zijn") \ No newline at end of file + raise serializers.ValidationError("Alle gebruikers in 'lesgevers' moeten lesgevers zijn") diff --git a/api/utils.py b/api/utils.py index f51ee762..7088d60b 100644 --- a/api/utils.py +++ b/api/utils.py @@ -36,14 +36,42 @@ def get_graph_token(): return None def is_lesgever(user): + """ + Controleert of de gebruiker een lesgever is. + + Args: + user (User): De gebruiker waarvan moet worden gecontroleerd of deze een lesgever is. + + Returns: + bool: True als de gebruiker een lesgever is, anders False. + """ if user.is_superuser: return True gebruiker = Gebruiker.objects.get(pk=user.id) return gebruiker.is_lesgever def contains(lijst, user): + """ + Controleert of de gebruiker aanwezig is in de gegeven lijst. + + Args: + lijst (QuerySet): De lijst waarin moet worden gecontroleerd. + user (User): De gebruiker waarvan moet worden gecontroleerd of deze aanwezig is in de lijst. + + Returns: + bool: True als de gebruiker aanwezig is in de lijst, anders False. + """ gebruiker = Gebruiker.objects.get(pk=user.id) return lijst.all().contains(gebruiker) def get_gebruiker(user): + """ + Haalt de Gebruiker-instantie op voor de gegeven gebruiker. + + Args: + user (User): De gebruiker waarvoor de Gebruiker-instantie moet worden opgehaald. + + Returns: + Gebruiker: De Gebruiker-instantie voor de gegeven gebruiker. + """ return Gebruiker.objects.get(pk=user.id) diff --git a/api/views/gebruiker.py b/api/views/gebruiker.py index 08cba371..d65ab422 100644 --- a/api/views/gebruiker.py +++ b/api/views/gebruiker.py @@ -12,6 +12,17 @@ @api_view(['GET']) def gebruiker_list(request): + """ + Een view om alle gebruikers op te halen. + + Als de gebruiker een lesgever is, worden alle gebruikers opgehaald. Als de gebruiker geen lesgever is, worden alleen de gegevens van de ingelogde gebruiker opgehaald. + + Optionele query parameters: + is_lesgever (bool): Filtert gebruikers op basis van of ze lesgevers zijn of niet. + + Returns: + Response: Een lijst van gebruikers. + """ if request.method == 'GET': if is_lesgever(request.user): gebruikers = Gebruiker.objects.all() @@ -29,6 +40,15 @@ def gebruiker_list(request): @api_view(['GET', 'PUT']) def gebruiker_detail(request, id): + """ + Een view om de gegevens van een specifieke gebruiker op te halen (GET) of bij te werken (PUT). + + Args: + id (int): De primaire sleutel van de gebruiker. + + Returns: + Response: Gegevens van de gebruiker of een foutmelding als de gebruiker niet bestaat of als er een ongeautoriseerde toegang is. + """ try: gebruiker = Gebruiker.objects.get(pk=id) except Gebruiker.DoesNotExist: diff --git a/api/views/groep.py b/api/views/groep.py index db7cffb6..3ff809d8 100644 --- a/api/views/groep.py +++ b/api/views/groep.py @@ -9,6 +9,22 @@ @api_view(['GET', 'POST']) def groep_list(request, format=None): + """ + Een view om een lijst van groepen op te halen of een nieuwe groep toe te voegen. + + GET: + Als de gebruiker een lesgever is, worden alle groepen opgehaald. Als de gebruiker geen lesgever is, worden alleen de groepen opgehaald waarin de ingelogde gebruiker zich bevindt. + + Optionele query parameters: + project (int): Filtert groepen op basis van project-ID. + student (int): Filtert groepen op basis van student-ID. + + POST: + Als de gebruiker een lesgever is, wordt een nieuwe groep toegevoegd. + + Returns: + Response: Een lijst van groepen of een nieuw aangemaakte groep. + """ if request.method == 'GET': if is_lesgever(request.user): groepen = Groep.objects.all() @@ -21,7 +37,7 @@ def groep_list(request, format=None): groepen = groepen.filter(project=project) except NameError: return Response(status=status.HTTP_400_BAD_REQUEST) - + if "student" in request.GET: try: student = eval(request.GET.get('student')) @@ -33,7 +49,6 @@ def groep_list(request, format=None): serializer = GroepSerializer(groepen, many=True) return Response(serializer.data) - elif request.method == 'POST': if is_lesgever(request.user): serializer = GroepSerializer(data=request.data) @@ -42,9 +57,19 @@ def groep_list(request, format=None): 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 groep_detail(request, id, format=None): +def groep_detail(request, id, format=None): + """ + Een view om de gegevens van een specifieke groep op te halen (GET), bij te werken (PUT) of te verwijderen (DELETE). + + Args: + id (int): De primaire sleutel van de groep. + + Returns: + Response: Gegevens van de groep of een foutmelding als de groep niet bestaat of als er een ongeautoriseerde toegang is. + """ try: groep = Groep.objects.get(pk=id) except Groep.DoesNotExist: @@ -66,4 +91,4 @@ def groep_detail(request, id, format=None): elif request.method == 'DELETE': groep.delete() return Response(status=status.HTTP_204_NO_CONTENT) - return Response(status=status.HTTP_403_FORBIDDEN) \ No newline at end of file + return Response(status=status.HTTP_403_FORBIDDEN) diff --git a/api/views/indiening.py b/api/views/indiening.py index 8fdc6a6c..b5f0316a 100644 --- a/api/views/indiening.py +++ b/api/views/indiening.py @@ -10,6 +10,21 @@ @api_view(['GET', 'POST']) def indiening_list(request, format=None): + """ + Een view om een lijst van indieningen op te halen of een nieuwe indiening toe te voegen. + + GET: + Als de gebruiker een lesgever is, worden alle indieningen opgehaald. Als de gebruiker geen lesgever is, worden alleen de indieningen opgehaald waarin de ingelogde gebruiker zich bevindt. + + Optionele query parameters: + groep (int): Filtert indieningen op basis van groep-ID. + + POST: + Voegt een nieuwe indiening toe. + + Returns: + Response: Een lijst van indieningen of een nieuw aangemaakte indiening. + """ if request.method == 'GET': if is_lesgever(request.user): indieningen = Indiening.objects.all() @@ -26,11 +41,11 @@ def indiening_list(request, format=None): serializer = IndieningSerializer(indieningen, many=True) return Response(serializer.data) - + elif request.method == 'POST': if 'indiening_bestanden' not in request.FILES: return Response({"indiening_bestanden":["This field is required."]}, status=status.HTTP_400_BAD_REQUEST) - + serializer = IndieningSerializer(data=request.data) if serializer.is_valid(): serializer.save() @@ -42,10 +57,19 @@ def indiening_list(request, format=None): IndieningBestand.objects.create(indiening = indiening, bestand = file) return Response(serializer.data, status=status.HTTP_201_CREATED) - - + + @api_view(['GET', 'DELETE']) -def indiening_detail(request, id, format=None): +def indiening_detail(request, id, format=None): + """ + Een view om de gegevens van een specifieke indiening op te halen (GET) of te verwijderen (DELETE). + + Args: + id (int): De primaire sleutel van de indiening. + + Returns: + Response: Gegevens van de indiening of een foutmelding als de indiening niet bestaat of als er een ongeautoriseerde toegang is. + """ try: indiening = Indiening.objects.get(pk=id) except Indiening.DoesNotExist: @@ -62,12 +86,22 @@ def indiening_detail(request, id, format=None): indiening.delete() return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_403_FORBIDDEN) - @api_view(['GET']) def indiening_bestand_list(request, format=None): + """ + Een view om een lijst van indieningbestanden op te halen (GET). + GET: + Als de gebruiker een lesgever is, worden alle indieningbestanden opgehaald. Als de gebruiker geen lesgever is, worden alleen de indieningbestanden opgehaald van de ingelogde gebruiker. + + Optionele query parameters: + indiening (int): Filtert indieningbestanden op basis van indiening-ID. + + Returns: + Response: Een lijst van indieningbestandgegevens. + """ if request.method == 'GET': if is_lesgever(request.user): indieningen_bestanden = IndieningBestand.objects.all() @@ -90,6 +124,15 @@ def indiening_bestand_list(request, format=None): @api_view(['GET']) def indiening_bestand_detail(request, id, format=None): + """ + Een view om de gegevens van een specifiek indieningbestand op te halen (GET). + + Args: + id (int): De primaire sleutel van het indieningbestand. + + Returns: + Response: Gegevens van het indieningbestand of een foutmelding als het indieningbestand niet bestaat of als er een ongeautoriseerde toegang is. + """ try: indiening_bestand = IndieningBestand.objects.get(pk=id) except IndieningBestand.DoesNotExist: diff --git a/api/views/project.py b/api/views/project.py index 5bd20d19..343cdf87 100644 --- a/api/views/project.py +++ b/api/views/project.py @@ -10,6 +10,21 @@ @api_view(['GET', 'POST']) def project_list(request, format=None): + """ + Een view om een lijst van projecten op te halen of een nieuw project toe te voegen. + + GET: + Als de gebruiker een lesgever is, worden alle projecten opgehaald. Als de gebruiker geen lesgever is, worden alleen de projecten opgehaald voor de vakken waarin de ingelogde gebruiker zich bevindt. + + Optionele query parameters: + vak (int): Filtert projecten op basis van vak-ID. + + POST: + Voegt een nieuw project toe. + + Returns: + Response: Een lijst van projecten of een nieuw aangemaakt project. + """ if request.method == 'GET': if is_lesgever(request.user): projects = Project.objects.all() @@ -26,7 +41,7 @@ def project_list(request, format=None): serializer = ProjectSerializer(projects, many=True) return Response(serializer.data) - + elif request.method == 'POST': if is_lesgever(request.user): serializer = ProjectSerializer(data=request.data) @@ -37,7 +52,16 @@ def project_list(request, format=None): return Response(status=status.HTTP_403_FORBIDDEN) @api_view(['GET', 'PUT', 'DELETE']) -def project_detail(request, id, format=None): +def project_detail(request, id, format=None): + """ + Een view om de gegevens van een specifiek project op te halen (GET), bij te werken (PUT) of te verwijderen (DELETE). + + Args: + id (int): De primaire sleutel van het project. + + Returns: + Response: Gegevens van het project of een foutmelding als het project niet bestaat of als er een ongeautoriseerde toegang is. + """ try: project = Project.objects.get(pk=id) except Project.DoesNotExist: diff --git a/api/views/score.py b/api/views/score.py index 97239c4e..d336fdf4 100644 --- a/api/views/score.py +++ b/api/views/score.py @@ -11,7 +11,21 @@ @api_view(['GET', 'POST']) def score_list(request, format=None): + """ + Een view om een lijst van scores op te halen of een nieuwe score toe te voegen. + GET: + Als de gebruiker een lesgever is, worden alle scores opgehaald. Als de gebruiker geen lesgever is, worden alleen de scores opgehaald van indieningen van groepen waarin de ingelogde gebruiker zich bevindt. + + Optionele query parameters: + indiening (int): Filtert scores op basis van indiening-ID. + + POST: + Voegt een nieuwe score toe. + + Returns: + Response: Een lijst van scores of een nieuwe aangemaakte score. + """ if request.method == 'GET': if is_lesgever(request.user): scores = Score.objects.all() @@ -29,7 +43,7 @@ def score_list(request, format=None): serializer = ScoreSerializer(scores, many=True) return Response(serializer.data) - + elif request.method == 'POST': if is_lesgever(request.user): serializer = ScoreSerializer(data=request.data) @@ -40,7 +54,16 @@ def score_list(request, format=None): return Response(status=status.HTTP_403_FORBIDDEN) @api_view(['GET', 'PUT', 'DELETE']) -def score_detail(request, id, format=None): +def score_detail(request, id, format=None): + """ + Een view om de gegevens van een specifieke score op te halen (GET), bij te werken (PUT) of te verwijderen (DELETE). + + Args: + id (int): De primaire sleutel van de score. + + Returns: + Response: Gegevens van de score of een foutmelding als de score niet bestaat of als er een ongeautoriseerde toegang is. + """ try: score = Score.objects.get(pk=id) except Score.DoesNotExist: diff --git a/api/views/vak.py b/api/views/vak.py index ab6561bd..e2dc7d21 100644 --- a/api/views/vak.py +++ b/api/views/vak.py @@ -11,7 +11,18 @@ @api_view(['GET', 'POST']) def vak_list(request, format=None): + """ + Een view om een lijst van vakken op te halen of een nieuw vak toe te voegen. + GET: + Als de gebruiker een lesgever is, worden alle vakken opgehaald. Als de gebruiker geen lesgever is, worden alleen de vakken opgehaald waarin de ingelogde gebruiker zich bevindt. + + POST: + Voegt een nieuw vak toe. + + Returns: + Response: Een lijst van vakken of een nieuw aangemaakt vak. + """ if request.method == 'GET': if is_lesgever(request.user): vakken = Vak.objects.all() @@ -20,7 +31,7 @@ def vak_list(request, format=None): serializer = VakSerializer(vakken, many=True) return Response(serializer.data) - + elif request.method == 'POST': if is_lesgever(request.user): serializer = VakSerializer(data=request.data) @@ -30,9 +41,18 @@ def vak_list(request, format=None): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(status=status.HTTP_403_FORBIDDEN) - + @api_view(['GET', 'PUT', 'DELETE']) def vak_detail(request, id, format=None): + """ + Een view om de gegevens van een specifiek vak op te halen (GET), bij te werken (PUT) of te verwijderen (DELETE). + + Args: + id (int): De primaire sleutel van het vak. + + Returns: + Response: Gegevens van het vak of een foutmelding als het vak niet bestaat of als er een ongeautoriseerde toegang is. + """ try: vak = Vak.objects.get(pk=id) except Vak.DoesNotExist: diff --git a/api/views/views.py b/api/views/views.py index ce5801b7..24565f06 100644 --- a/api/views/views.py +++ b/api/views/views.py @@ -7,6 +7,16 @@ def login_redirect(request): + """ + Een view die wordt gebruikt voor het verwerken van een login redirect. + Deze view controleert of de gebruiker is ingelogd, en maakt vervolgens een nieuwe gebruiker aan in het systeem voor de ingelogde gebruiker, indien deze nog niet bestaat. + + Args: + request (HttpRequest): Het HTTP-verzoek dat naar de view is gestuurd. + + Returns: + HttpResponseRedirect: Een HTTP-verzoek naar de startpagina na het verwerken van de login-redirect. + """ print(get_graph_token()) @@ -23,7 +33,25 @@ def login_redirect(request): @api_view(['GET']) def home(request): + """ + Een view die de startpagina van de API retourneert. + + Args: + request (HttpRequest): Het HTTP-verzoek dat naar de view is gestuurd. + + Returns: + Response: Een HTTP-respons met de URL's van de API. + """ return Response(data=API_URLS) def microsoft_association(request): + """ + Een view die wordt gebruikt om de associatie met Microsoft-applicaties te bevestigen. + + Args: + request (HttpRequest): Het HTTP-verzoek dat naar de view is gestuurd. + + Returns: + JsonResponse: Een JSON-respons met de geassocieerde applicaties. + """ return JsonResponse({"associatedApplications": [{ "applicationId": "239ce609-e362-4cf6-919f-97e6935ef5f5" }]})