diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentScoreServiceImpl.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentScoreServiceImpl.java index ce1cf8e..eb20461 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentScoreServiceImpl.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AssignmentScoreServiceImpl.java @@ -19,6 +19,12 @@ class AssignmentScoreServiceImpl implements AssignmentScoreService{ @Transactional public void registerScore(Assignment assignment, ClassroomUser student, long score, long maxScore) { var studentAssignment = this.studentAssignmentRepository.findByAssignmentAndStudent(assignment, student); + + // increment retake count if needed + if(studentAssignment instanceof StudentQuizAssignment quizAssignment && quizAssignment.hasBeenSubmitted()){ + quizAssignment.setRetakes(quizAssignment.getRetakes() + 1); + } + studentAssignment.setScore(score); studentAssignment.setMaxScore(maxScore); studentAssignment.setSubmissionDate(ZonedDateTime.now()); diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/QuizAssignment.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/QuizAssignment.java index cbfd766..81bd49e 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/QuizAssignment.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/QuizAssignment.java @@ -10,6 +10,8 @@ public class QuizAssignment extends Assignment { @OneToOne private QuizEntity quiz; + private int maxRetakes = 0; + public QuizAssignment() { this.setType(AssignmentType.QUIZ); } @@ -21,4 +23,16 @@ public class QuizAssignment extends Assignment { public void setQuiz(QuizEntity quiz) { this.quiz = quiz; } + + public int getMaxRetakes() { + return maxRetakes; + } + + public void setMaxRetakes(int maxRetakes) { + this.maxRetakes = maxRetakes; + } + + public boolean allowRetakes(){ + return this.maxRetakes > 0; + } } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/StudentQuizAssignment.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/StudentQuizAssignment.java index d921f68..6f75c4c 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/StudentQuizAssignment.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/StudentQuizAssignment.java @@ -5,10 +5,25 @@ import jakarta.persistence.Entity; @Entity public class StudentQuizAssignment extends StudentAssignment { + private int retakes = 0; + + public int getRetakes() { + return retakes; + } + + public void setRetakes(int retakes) { + this.retakes = retakes; + } + @Override public void resetGrades() { this.setSubmissionDate(null); this.setScore(null); this.setMaxScore(null); } + + public boolean canRetake(){ + return this.retakes < ((QuizAssignment)this.getAssignment()).getMaxRetakes(); + } + } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizAnswerController.java b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizAnswerController.java index 5e33373..a562561 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizAnswerController.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizAnswerController.java @@ -3,6 +3,7 @@ package fr.univ_lille.gitlab.classrooms.quiz; import fr.univ_lille.gitlab.classrooms.assignments.AssignmentScoreService; import fr.univ_lille.gitlab.classrooms.assignments.AssignmentService; import fr.univ_lille.gitlab.classrooms.assignments.QuizAssignment; +import fr.univ_lille.gitlab.classrooms.assignments.StudentQuizAssignment; import fr.univ_lille.gitlab.classrooms.users.ClassroomUser; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -41,11 +42,20 @@ class QuizAnswerController { model.addAttribute("quiz", quiz); model.addAttribute("assignment", assignment); - var studentAssignment = this.assignmentService.getAssignmentResultsForStudent(assignment, student); + var studentAssignment = (StudentQuizAssignment)this.assignmentService.getAssignmentResultsForStudent(assignment, student); + if(studentAssignment.hasBeenSubmitted()){ - model.addAttribute("previousSubmission", studentAssignment); + // check if quiz can be retaken + if(studentAssignment.canRetake()) { + model.addAttribute("previousSubmission", studentAssignment); + // quiz can be retaken, showing answer form, with previous information + return "quiz/answer"; + } + // quiz cannot be retaken, showing results + return "quiz/results"; } + // quiz has not been submitted yet, showing answer form return "quiz/answer"; } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEntity.java b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEntity.java index aef7f09..8ebb881 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEntity.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/quiz/QuizEntity.java @@ -30,4 +30,5 @@ public class QuizEntity { public void setMarkdownContent(String markdownContent) { this.markdownContent = markdownContent; } + } diff --git a/src/main/resources/db/migration/V21__QUIZ_ASSIGNMENT_RETAKES.sql b/src/main/resources/db/migration/V21__QUIZ_ASSIGNMENT_RETAKES.sql new file mode 100644 index 0000000..d5521a0 --- /dev/null +++ b/src/main/resources/db/migration/V21__QUIZ_ASSIGNMENT_RETAKES.sql @@ -0,0 +1,17 @@ +ALTER TABLE quiz_assignment + ADD max_retakes INTEGER; + +UPDATE quiz_assignment +SET max_retakes = '0' +WHERE max_retakes IS NULL; +ALTER TABLE quiz_assignment + ALTER COLUMN max_retakes SET NOT NULL; + +ALTER TABLE student_quiz_assignment + ADD retakes INTEGER; + +UPDATE student_quiz_assignment +SET retakes = '0' +WHERE retakes IS NULL; +ALTER TABLE student_quiz_assignment + ALTER COLUMN retakes SET NOT NULL; \ No newline at end of file diff --git a/src/main/resources/templates/dashboard/student-dashboard.html b/src/main/resources/templates/dashboard/student-dashboard.html index 75895d0..b721163 100644 --- a/src/main/resources/templates/dashboard/student-dashboard.html +++ b/src/main/resources/templates/dashboard/student-dashboard.html @@ -78,7 +78,9 @@ -