diff --git a/api/base_templates/file_name.sh b/api/base_templates/file_name.sh new file mode 100755 index 00000000..1fc87ab5 --- /dev/null +++ b/api/base_templates/file_name.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +#@param +# Vul hieronder de namen van de bestanden in die je in de gezipte folder wilt vinden. +file_name="verslag.pdf" + + +if [ -e "$file_name" ]; then + echo "$file_name present: OK" +else + echo "$file_name not present: FAIL" +fi \ No newline at end of file diff --git a/api/base_templates/zip_contains_files.sh b/api/base_templates/zip_contains_files.sh new file mode 100755 index 00000000..99180ea9 --- /dev/null +++ b/api/base_templates/zip_contains_files.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +#@param +# Vul hieronder de namen van de bestanden in die je in de gezipte folder wilt vinden. +file_names=( "testfile1.txt" "testfile2.txt" ) + +#@param +# Vul hieronder de naam van het zip bestand waarin je de files wil vinden +zip_file_name="file.zip" + + +for file_name in "${file_names[@]}"; do + unzip -l $zip_file_name | grep -q $file_name; + if [ "$?" == "0" ] + then + echo "$file_name present: OK" + else + echo "$file_name not present: FAIL" + fi; +done \ No newline at end of file diff --git a/api/middleware.py b/api/middleware.py index ccfb6a28..5c1cd207 100644 --- a/api/middleware.py +++ b/api/middleware.py @@ -3,7 +3,10 @@ from django.contrib.auth.models import User from api.models.gebruiker import Gebruiker from api.serializers.gebruiker import GebruikerSerializer +from api.serializers.template import TemplateSerializer +from django.core.files import File import requests +import os URL = "https://graph.microsoft.com/v1.0/me" @@ -59,6 +62,16 @@ def __call__(self, request): try: Gebruiker.objects.get(pk=request.user.id) except Gebruiker.DoesNotExist: + directory_path = "api/base_templates" + for filename in os.listdir(directory_path): + file_path = os.path.join(directory_path, filename) + with open(file_path, "rb") as f: + django_file = File(f) + template_data = {"user": request.user.id, "bestand": django_file} + serializer = TemplateSerializer(data=template_data) + if serializer.is_valid(): + serializer.save() + gebruiker_post_data = { "user": request.user.id, "subjects": [], diff --git a/api/models/gebruiker.py b/api/models/gebruiker.py index 3f42db52..5566d050 100644 --- a/api/models/gebruiker.py +++ b/api/models/gebruiker.py @@ -12,6 +12,9 @@ class Gebruiker(models.Model): 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. + gepinde_vakken (ManyToManyField): Een veld dat verwijst naar het Vak model met een + veel-op-veel-relatie, om de vakken die de gebruiker heeft gepind op te slaan. + Dit veld is optioneel (mag leeg zijn). Methods: __str__(): Geeft een representatie van het model als een string terug, diff --git a/api/models/groep.py b/api/models/groep.py index 971a305a..b1074b4e 100644 --- a/api/models/groep.py +++ b/api/models/groep.py @@ -10,6 +10,7 @@ class Groep(models.Model): 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. + Dit veld is optioneel (mag leeg zijn). project (ForeignKey): Een ForeignKey relatie met het 'Project' model, waarmee wordt aangegeven tot welk project deze groep behoort. Als het bijbehorende project wordt verwijderd, diff --git a/api/models/indiening.py b/api/models/indiening.py index 59ed23d8..5190e4f2 100644 --- a/api/models/indiening.py +++ b/api/models/indiening.py @@ -20,7 +20,7 @@ def upload_to(instance, filename): """ - Functie om het pad te genereren waar het bestand wordt opgeslagen. + Genereert het pad waar het bestand wordt opgeslagen. Args: instance: De huidige instantie van het model. @@ -48,11 +48,16 @@ class Indiening(models.Model): indieningen verwijderd. tijdstip (DateTimeField): Een veld dat automatisch het tijdstip registreert waarop de indiening is aangemaakt. + bestand (FileField): Een veld voor het uploaden van het bestand, + met een dynamisch gegenereerd pad. status (IntegerField): Een veld dat de status van de testen zal bijhouden. result (TextField): Een veld dat het resultaat van de uitgevoerde testen zal bijhouden. + artefacten (FileField): Een optioneel veld voor het uploaden van extra artefacten. Methods: - __str__(): Geeft een representatie van het model als een string terug, die de ID van de indiening bevat. + __str__(): Geeft een representatie van het model als een string terug, + die de ID van de indiening bevat. + save(*args, **kwargs): Overschrijft de standaard opslaanmethode om het pad van het bestand bij te werken. """ indiening_id = models.AutoField(primary_key=True) @@ -82,7 +87,7 @@ def save(self, *args, **kwargs): def run_tests_async(instance): """ - Voert tests uit op een asynchrone manier en werkt de status en resultaat van de indiening bij. + Voert tests uit op een asynchrone manier en werkt de status en het resultaat van de indiening bij. Args: instance: Het instantie-object van de indiening. @@ -105,7 +110,7 @@ def run_tests_async(instance): def indiening_post_init(sender, instance, created, **kwargs): """ Een signaalhandler die wordt geactiveerd na het maken van een nieuwe indiening. - Start een asynchrone thread om de tests uit te voeren. + Start een asynchrone thread om de tests uit te voeren of werkt de status bij indien er geen restricties zijn. Args: sender: De verzender van het signaal. diff --git a/api/models/project.py b/api/models/project.py index a86e379e..6cf3b282 100644 --- a/api/models/project.py +++ b/api/models/project.py @@ -4,7 +4,7 @@ def upload_to(instance, filename): """ - Functie om het pad te genereren waar het opgavebestand wordt opgeslagen. + Genereert het pad waar het opgavebestand wordt opgeslagen. Args: instance: De huidige instantie van het model. @@ -26,28 +26,26 @@ class Project(models.Model): 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. + 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). + Kan optioneel zijn (null=True, blank=True). extra_deadline (DateTimeField): Een extra veld voor het instellen van een extra deadline voor het project. - Kan optioneel zijn (null=True). + Kan optioneel zijn (null=True, blank=True). max_score (IntegerField): Een veld voor het instellen van de maximale score voor het project. - Standaard ingesteld op 20. - max_groep_grootte (IntegerField): Een veld voor het instellen van de max grootte van de groep voor het project. - Standaard ingesteld op 1. - student_groep (BooleanField): Een veld om aan te geven of de studenten hun eigen groep mogen kiezen. - Standaard ingesteld of False. + Standaard ingesteld op 20. + max_groep_grootte (IntegerField): Een veld voor het instellen van de maximale grootte van de groep + voor het project. Standaard ingesteld op 1. + student_groep (BooleanField): Een veld om aan te geven of het een individueel project is of niet. + Standaard ingesteld op False. zichtbaar (BooleanField): Een veld om aan te geven of het project zichtbaar is of niet. - Standaard ingesteld op True. + Standaard ingesteld op True. gearchiveerd (BooleanField): Een veld om aan te geven of het project gearchiveerd is of niet. - Standaard ingesteld op False. + Standaard ingesteld op False. Methoden: - __str__(): Geeft een representatie van het model als een string terug, - die de titel van het project bevat. + __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) diff --git a/api/models/restrictie.py b/api/models/restrictie.py index 990e8395..f2341d94 100644 --- a/api/models/restrictie.py +++ b/api/models/restrictie.py @@ -4,7 +4,7 @@ def upload_to(instance, filename): """ - Functie om het pad te genereren waar het opgavebestand wordt opgeslagen. + Genereert het pad waar het opgavebestand wordt opgeslagen. Args: instance: De huidige instantie van het model. @@ -24,15 +24,15 @@ class Restrictie(models.Model): Velden: restrictie_id (AutoField): Automatisch gegenereerd veld dat fungeert als primaire sleutel voor de restrictie. project (ForeignKey): Een ForeignKey relatie met het 'Project' model, - waarmee wordt aangegeven welk project deze restrictie betreft. + waarmee wordt aangegeven welk project deze restrictie betreft. Als het bijbehorende project wordt verwijderd, worden ook de bijbehorende restricties verwijderd. script (FileField): Een veld voor het uploaden van het script van de restrictie/test. moet_slagen (BooleanField): Een veld om aan te geven of de inzending aan de restrictie/test moet voldoen. - Standaard ingesteld op False. + Standaard ingesteld op False. Methoden: __str__(): Geeft een representatie van het model als een string terug, - die het titel van het bijbehorende project en de beschrijving van de restrictie bevat. + die de titel van het bijbehorende project en de beschrijving van de restrictie bevat. """ restrictie_id = models.AutoField(primary_key=True) diff --git a/api/models/score.py b/api/models/score.py index ab3166f2..c296e02f 100644 --- a/api/models/score.py +++ b/api/models/score.py @@ -14,7 +14,8 @@ class Score(models.Model): wordt ook de bijbehorende score verwijderd. Methods: - __str__(): Geeft een representatie van het model als een string terug, die de score-ID bevat. + __str__(): Geeft een representatie van het model als een string terug, + die de score-ID bevat. """ score_id = models.AutoField(primary_key=True) diff --git a/api/models/template.py b/api/models/template.py index 4b7aac6e..962b4d4d 100644 --- a/api/models/template.py +++ b/api/models/template.py @@ -4,7 +4,7 @@ def upload_to(instance, filename): """ - Functie om het pad te genereren waar het bestand wordt opgeslagen. + Genereert het pad waar het bestand wordt opgeslagen. Args: instance: De huidige instantie van het model. @@ -17,6 +17,21 @@ def upload_to(instance, filename): class Template(models.Model): + """ + Model voor het bijhouden van templates geüpload door gebruikers. + + Velden: + template_id (AutoField): Een automatisch gegenereerd veld dat fungeert als de primaire sleutel + voor de template. + user (ForeignKey): Een ForeignKey relatie met het 'User' model, + waarmee wordt aangegeven welke gebruiker de template heeft geüpload. + bestand (FileField): Een veld voor het uploaden van de template, + met een dynamisch gegenereerd pad. + + Methoden: + __str__(): Geeft een representatie van het model als een string terug, + die de bestandsnaam van de template bevat. + """ template_id = models.AutoField(primary_key=True) user = models.ForeignKey( diff --git a/api/models/vak.py b/api/models/vak.py index 8e79d91c..48f0124b 100644 --- a/api/models/vak.py +++ b/api/models/vak.py @@ -10,13 +10,11 @@ class Vak(models.Model): 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. jaartal (IntegerField): Een veld om het jaartal van het vak op te slaan. (voor 2024-2025 zou je 2025 opslaan) - gearchiveerd (BooleanField): Een veld om aan te geven als het vak gearchiveerd is. + gearchiveerd (BooleanField): Een veld om aan te geven of het vak gearchiveerd is. Standaard ingesteld op False. studenten (ManyToManyField): Een Many-to-Many relatie met het 'Gebruiker' model, - waarmee meerdere gebruikers aan het vak kunnen worden gekoppeld als studenten. + 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. - invited (ManyToManyField): Een Many-To-Many relatie met het 'Gebruiker' model, - waarmee meerdere gebruikers aan het vak kunenn worden gekoppeld als geinviteerde. + 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. diff --git a/api/serializers/gebruiker.py b/api/serializers/gebruiker.py index f2ed060d..00b024b3 100644 --- a/api/serializers/gebruiker.py +++ b/api/serializers/gebruiker.py @@ -7,12 +7,12 @@ class GebruikerSerializer(serializers.ModelSerializer): """ Serializer voor het serialiseren en deserialiseren van Gebruiker objecten. - Fields: + Velden: Meta.model (Gebruiker): Het model waarop de serializer is gebaseerd. - Meta.fields (tuple): De velden die moeten worden opgenomen in de serializer. + Meta.fields (list): De velden die moeten worden opgenomen in de serializer. Hier wordt '__all__' gebruikt om alle velden op te nemen. - Methods: + Methoden: 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. """ @@ -34,6 +34,8 @@ class Meta: def create(self, validated_data): """ + Maakt een nieuwe gebruiker aan. + Args: validated_data (dict): Gevalideerde gegevens over de gebruiker. @@ -50,6 +52,8 @@ def create(self, validated_data): def update(self, instance, validated_data): """ + Werkt een bestaande gebruiker bij. + Args: instance (Gebruiker): De gebruiker die moet worden bijgewerkt. validated_data (dict): Gevalideerde gegevens over de gebruiker. diff --git a/api/serializers/template.py b/api/serializers/template.py index 717d32d6..7df17a50 100644 --- a/api/serializers/template.py +++ b/api/serializers/template.py @@ -4,12 +4,11 @@ class TemplateSerializer(serializers.ModelSerializer): """ - Serializer voor het serialiseren en deserialiseren van IndieningBestand objecten. + Serializer voor het serialiseren en deserialiseren van Template objecten. Fields: - Meta.model (IndieningBestand): Het model waarop de serializer is gebaseerd. + Meta.model (Template): 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: diff --git a/api/utils.py b/api/utils.py index a2ba3f24..9bebbff7 100644 --- a/api/utils.py +++ b/api/utils.py @@ -118,6 +118,12 @@ def get_gebruiker(user): def send_indiening_confirmation_mail(indiening): + """ + Verstuurt een bevestigingsmail naar alle studenten in de groep voor een specifieke indiening. + + Args: + indiening (Indiening): De indiening waarvoor de bevestigingsmail verstuurd moet worden. + """ project = indiening.groep.project project_url = f"https://sel2-4.ugent.be/course/{project.vak.vak_id}/assignment/{project.project_id}" diff --git a/api/views/template.py b/api/views/template.py index 564551c7..52508e7d 100644 --- a/api/views/template.py +++ b/api/views/template.py @@ -94,7 +94,7 @@ def template_detail(request, id, format=None): @api_view(["GET"]) def template_detail_bestand(request, id, format=None): """ - Een view om het bestand van een specifieke tempalte te downloaden of de content in JSON-formaat te krijgen. + Een view om het bestand van een specifieke template te downloaden of de content in JSON-formaat te krijgen. Args: id (int): De primaire sleutel van de template.