Skip to content

Commit

Permalink
Merge pull request #60 from SELab-2/comments
Browse files Browse the repository at this point in the history
added docstrings
  • Loading branch information
sPAICEcake authored Mar 14, 2024
2 parents dc621b0 + fd5f61a commit fff87ba
Show file tree
Hide file tree
Showing 21 changed files with 552 additions and 34 deletions.
12 changes: 12 additions & 0 deletions api/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
10 changes: 10 additions & 0 deletions api/models/gebruiker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
11 changes: 11 additions & 0 deletions api/models/groep.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
32 changes: 32 additions & 0 deletions api/models/indiening.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
26 changes: 26 additions & 0 deletions api/models/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
11 changes: 11 additions & 0 deletions api/models/score.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 12 additions & 0 deletions api/models/vak.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
28 changes: 27 additions & 1 deletion api/serializers/gebruiker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
return instance
47 changes: 41 additions & 6 deletions api/serializers/groep.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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")
raise serializers.ValidationError(f"Gebruiker {student.user.id} zit al in een groep voor dit project")
16 changes: 16 additions & 0 deletions api/serializers/indiening.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__')
41 changes: 38 additions & 3 deletions api/serializers/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,64 @@


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)

project = Project.objects.create(**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)

super().update(instance=instance, validated_data=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")
raise serializers.ValidationError("Deadline moet in de toekomst liggen")
Loading

0 comments on commit fff87ba

Please sign in to comment.