Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix extra checks #455

Merged
merged 12 commits into from
May 23, 2024
56 changes: 18 additions & 38 deletions backend/api/serializers/course_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ class CourseSerializer(serializers.ModelSerializer):
read_only=True
)

faculty_id = serializers.PrimaryKeyRelatedField(
queryset=Faculty.objects.all(),
source="faculty",
write_only=True,
)

def validate(self, attrs: dict) -> dict:
"""Extra custom validation for course serializer"""
attrs = super().validate(attrs)
Expand All @@ -52,6 +58,17 @@ def validate(self, attrs: dict) -> dict:

return attrs

def create(self, validated_data):
# Create the course
course = super().create(validated_data)

# Compute the invitation link hash
course.invitation_link = hashlib.sha256(f'{course.id}{course.academic_startyear}'.encode()).hexdigest()
course.invitation_link_expires = timezone.now()
course.save()

return course

def to_representation(self, instance):
data = super().to_representation(instance)

Expand All @@ -73,6 +90,7 @@ class Meta:
"excerpt",
"description",
"faculty",
"faculty_id",
francisvaut marked this conversation as resolved.
Show resolved Hide resolved
"parent_course",
"private_course",
"teachers",
Expand All @@ -82,44 +100,6 @@ class Meta:
]


class CreateCourseSerializer(CourseSerializer):
faculty = serializers.PrimaryKeyRelatedField(
queryset=Faculty.objects.all(),
required=False,
allow_null=True,
)

def create(self, validated_data):
faculty = validated_data.pop('faculty', None)

# Create the course
course = super().create(validated_data)

# Compute the invitation link hash
course.invitation_link = hashlib.sha256(f'{course.id}{course.academic_startyear}'.encode()).hexdigest()
course.invitation_link_expires = timezone.now()

# Link the faculty, if specified
if faculty is not None:
course.faculty = faculty
course.save()

return course

def update(self, instance, validated_data):
faculty = validated_data.pop('faculty', None)

# Update the course
course = super().update(instance, validated_data)

# Link the faculty, if specified
if faculty is not None:
course.faculty = faculty
course.save()

return course


class CourseIDSerializer(serializers.Serializer):
student_id = serializers.PrimaryKeyRelatedField(
queryset=Course.objects.all()
Expand Down
2 changes: 1 addition & 1 deletion backend/api/tests/test_course.py
Original file line number Diff line number Diff line change
Expand Up @@ -783,7 +783,7 @@ def test_create_course(self):
"academic_startyear": 2022,
"excerpt": "Excerpt",
"description": "An introductory course on computer science.",
"faculty": faculty.id,
"faculty_id": faculty.id,
},
follow=True,
)
Expand Down
13 changes: 6 additions & 7 deletions backend/api/views/course_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
AssistantSerializer)
from api.serializers.course_serializer import (CourseCloneSerializer,
CourseSerializer,
CreateCourseSerializer,
SaveInvitationLinkSerializer,
StudentJoinSerializer,
StudentLeaveSerializer,
Expand Down Expand Up @@ -41,7 +40,7 @@ class CourseViewSet(viewsets.ModelViewSet):

def create(self, request: Request, *_):
"""Override the create method to add the teacher to the course"""
serializer = CreateCourseSerializer(data=request.data, context={"request": request})
serializer = CourseSerializer(data=request.data, context={"request": request})

if serializer.is_valid(raise_exception=True):
course = serializer.save()
Expand All @@ -55,7 +54,7 @@ def create(self, request: Request, *_):
def update(self, request: Request, *_, **__):
"""Override the update method to add the teacher to the course"""
course = self.get_object()
serializer = CreateCourseSerializer(course, data=request.data, partial=True, context={"request": request})
serializer = CourseSerializer(course, data=request.data, partial=True, context={"request": request})

if serializer.is_valid(raise_exception=True):
serializer.save()
Expand Down Expand Up @@ -198,8 +197,8 @@ def _add_student(self, request: Request, **_):
individual_projects = course.projects.filter(group_size=1)

for project in individual_projects:
# Check if the start date of the project is in the future
if project.start_date > timezone.now():
# Check if the deadline of the project is in the future
if project.deadline > timezone.now():
group = Group.objects.create(
project=project
)
Expand All @@ -212,8 +211,8 @@ def _add_student(self, request: Request, **_):
all_projects = course.projects.exclude(group_size=1)

for project in all_projects:
# Check if the start date of the project is in the future
if project.start_date > timezone.now():
# Check if the deadline of the project is in the future
if project.deadline > timezone.now():
number_groups = project.groups.count()

if project.group_size * number_groups < course.students.count():
Expand Down
12 changes: 8 additions & 4 deletions frontend/src/assets/lang/app/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,19 +59,20 @@
"noGroupMembers": "No group members",
"publishScores": "Publish scores",
"groupName": "Group name",
"groups": "Groups",
"groupPopulation": "Size",
"groupStatus": "Status",
"start": "Start date",
"submissionStatus": "Submission status",
"group": "Group",
"groups": "Groups",
"groupSize": "Individual | Groups of {count} people",
"noGroups": "No groups available",
"groupMembers": "Group members",
"chooseGroup": "Choose a group",
"joinGroup": "Join group",
"leaveGroup": "Leave group",
"create": "Create new project",
"save": "Save project",
"edit": "Save project",
"name": "Project name",
"description": "Description",
Expand All @@ -93,15 +94,17 @@
},
"extraChecks": {
"title": "Automatic checks on a submission",
"empty": "No checks addeed",
"empty": "No checks added",
"add": "New check",
"name": "Name",
"public": "Public",
"bashScript": "Bash script",
"dockerImage": "Docker image",
"deleteDockerImage": "Delete docker image",
"timeLimit": "Time limit for execution (in seconds)",
"memoryLimit": "Memory limit for execution (in MB)",
"showLog": "Make the extra logs of the docker container visible to the students"
"showLog": "Make the extra logs of the docker container visible to the students",
"showArtifact": "Make the artifacts visible to the students"
}
},
"submissions": {
Expand Down Expand Up @@ -336,7 +339,8 @@
"cloneCourse": "Are you sure you want to clone this coure? This will create the same course for the next academic year.",
"joinCourse": "Are you sure you want to enroll in this course? This will give you access to all projects, assignments, ...",
"leaveCourse": "Are you sure you want to leave this course? You will no longer have access to this course.",
"shareCourse": "By activating the invitation link, you allow students in possession of this link to enroll in this course. Please copy the generated link, only when you click on \"Activate invitation link\" will this link become active."
"shareCourse": "By activating the invitation link, you allow students in possession of this link to enroll in this course. Please copy the generated link, only when you click on \"Activate invitation link\" will this link become active.",
"deleteDockerImage": "Are you sure you want to delete this docker image? This will also remove all the checks that use this image."
},
"admin": {
"title": "Admin",
Expand Down
38 changes: 20 additions & 18 deletions frontend/src/assets/lang/app/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,21 @@
},
"calendar": {
"title": "Kalender",
"noProjects": "Geen projecten op geselecteerde datum. \uD83E\uDD73"
francisvaut marked this conversation as resolved.
Show resolved Hide resolved
"noProjects": "Geen projecten op geselecteerde datum."
},
"projects": {
"all": "Alle projecten",
"coming": "Aankomende deadlines",
"backToCourse": "Terug naar het vak",
"coming": "Aankomende deadlines",
"deadline": "Deadline",
"days": "Vandaag om {hour} | Morgen om {hour} | Over {count} dagen",
"ago": "1 dag geleden | {count} dagen geleden",
"chooseGroupMessage": "Kies een groep voor {0}",
"groupScore": "Groepsscore",
"noGroupScore": "Nog geen score",
"noGroupMembers": "Geen groepsleden",
"publishScores": "Publiceer scores",
"groupName": "Groepsnaam",
"noGroupMembers": "Geen groepsleden",
"groupPopulation": "Grootte",
"groupStatus": "Status",
"start": "Startdatum",
Expand Down Expand Up @@ -94,15 +94,17 @@
},
"extraChecks": {
"title": "Automatische checks op een indiening",
"add": "Nieuwe check",
"empty": "Nog geen extra checks toegevoegd",
"add": "Nieuwe check",
"name": "Naam",
"public": "Publiek",
"bashScript": "Bash script",
"dockerImage": "Docker image",
"deleteDockerImage": "Verwijder docker image",
"timeLimit": "Tijdslimiet voor de uitvoering (in seconden)",
"memoryLimit": "Geheugenlimiet voor de uitvoering (in MB)",
"showLog": "Maak de extra logs van de docker container zichtbaar voor de studenten"
"showLog": "Maak de extra logs van de docker container zichtbaar voor de studenten",
"showArtifact": "Maak de artefacten zichtbaar voor de studenten"
}
},
"submissions": {
Expand Down Expand Up @@ -165,7 +167,7 @@
"year": "Academiejaar",
"enroll": "Inschrijven",
"leave": "Uitschrijven",
"noProjects": "Geen projecten beschikbaar voor dit vak \uD83D\uDE2D",
"noProjects": "Geen projecten beschikbaar voor dit vak",
"teachersAndAssistants": {
"title": "Lesgevers",
"enroll": "Voeg toe als {0}",
Expand All @@ -177,7 +179,7 @@
"noRole": "Geen",
"placeholder": "Zoek een gebruiker op naam",
"title": "Zoek gebuikers om aan dit vak toe te voegen",
"results": "\uD83D\uDD0E 1 gebruiker gevonden voor ingestelde filters | \uD83D\uDD0E {count} gebruikers gevonden voor ingestelde filters"
"results": "1 gebruiker gevonden voor ingestelde filters | {count} gebruikers gevonden voor ingestelde filters"
}
},
"search": {
Expand All @@ -186,7 +188,7 @@
"year": "Academiejaar",
"placeholder": "Zoek een vak op naam",
"title": "Zoek een vak",
"results": "\uD83D\uDD0E 1 vak gevonden voor ingestelde filters | \uD83D\uDD0E {count} vakken gevonden voor ingestelde filters"
"results": "1 vak gevonden voor ingestelde filters | {count} vakken gevonden voor ingestelde filters"
},
"share": {
"title": "Activeer invitatielink",
Expand Down Expand Up @@ -225,7 +227,7 @@
"card": {
"open": "Details",
"newProject": "Nieuw project",
"noSubmissions": "Dit project heeft geen indieningen \uD83D\uDE2D",
"noSubmissions": "Dit project heeft geen indieningen",
"submissions": "Indiening | Indieningen",
"groups": "Groep | Groepen",
"structureTestsSucceed": "Geslaagde structuur testen",
Expand All @@ -236,16 +238,15 @@
},
"list": {
"noProjects": {
"student": "Geen lopende projecten gevonden voor alle ingeschreven vakken \uD83D\uDE2D. Schrijf in op een openbaar vak met de zoekfunctie, of gebruik een uitnodiginslink van een lesgever.",
"teacher": "Geen lopende projecten gevonden voor de vakken waarvoor je lesgever bent . \uD83D\uDE2D. Maak een nieuw project voor een vak met onderstaande knop."
"student": "Geen lopende projecten gevonden voor alle ingeschreven vakken. Schrijf in op een openbaar vak met de zoekfunctie, of gebruik een uitnodiginslink van een lesgever.",
"teacher": "Geen lopende projecten gevonden voor de vakken waarvoor je lesgever bent. Maak een nieuw project voor een vak met onderstaande knop."
},
"noCourses": {
"student": "Geen vakken gevonden \uD83D\uDE2D. Schrijf in op een openbaar vak met de zoekfunctie, of gebruik een uitnodiginslink van een lesgever.",
"teacher": "Geen vakken gevonden \uD83D\uDE2D. Maak een vak aan met onderstaande knop.",
"search": "Geen vakken gevonden voor de gegeven zoekcriteria \uD83D\uDE2D."
"student": "Geen vakken gevonden. Schrijf in op een openbaar vak met de zoekfunctie, of gebruik een uitnodiginslink van een lesgever.",
"teacher": "Geen vakken gevonden. Maak een vak aan met onderstaande knop.",
"search": "Geen vakken gevonden voor de gegeven zoekcriteria."
},
"noResults": "Geen resultaten \uD83D\uDE2D.",
"noIncomingProjects": "Geen projecten met een deadline binnen de 7 dagen \uD83E\uDD73.",
"noIncomingProjects": "Geen projecten met een deadline binnen de 7 dagen.",
"selectCourse": "Selecteer het vak waarvoor je een project wil maken:",
"showPastProjects": "Projecten met verstreken deadline"
}
Expand Down Expand Up @@ -339,7 +340,8 @@
"cloneCourse": "Ben je zeker dat je dit vak wil klonen? Dit zal hetzelfde vak aanmaken voor het volgende academiejaar.",
"joinCourse": "Ben je zeker dat je jezelf wil inschrijven voor dit vak? Dit zal je toegang geven tot alle projecten, opdrachten, ...",
"leaveCourse": "Ben je zeker dat je dit vak wil verlaten? Je zal geen toegang meer hebben tot dit vak.",
"shareCourse": "Door het activeren van de invitatielink staat u studenten in bezit van deze link toe zich in te schrijven voor dit vak. Gelieve de gegenereerde link te kopiëren, pas wanneer u op \"Activeer invitatielink\" klikt zal deze link actief worden."
"shareCourse": "Door het activeren van de invitatielink staat u studenten in bezit van deze link toe zich in te schrijven voor dit vak. Gelieve de gegenereerde link te kopiëren, pas wanneer u op \"Activeer invitatielink\" klikt zal deze link actief worden.",
"deleteDockerImage": "Ben je zeker dat je deze docker image wil verwijderen? Dit zal alle checks die deze image gebruiken ook verwijderen."
},
"admin": {
"title": "Beheerder",
Expand Down Expand Up @@ -371,7 +373,7 @@
"owner": "Eigenaar ID",
"public": "Publiek"
},
"noneFound": "Geen overeenkomende data gevonden \uD83D\uDE2D.",
"noneFound": "Geen overeenkomende data gevonden.",
"loading": "Aan het laden. Wacht even aub.",
"safeGuard": "Bent u het zeker?"
},
Expand Down
Loading