Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20200129.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20200129.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20200129.sql (revision be35a3f2bf2414f299ca74f4ea8c3e2555b16d8e) @@ -0,0 +1,22 @@ +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS = 0; + +-- LDEV-4959 Prevent leader and non-leader from creating two GradebookUserLessons at the same time + +--Take care about potential duplicates. For this move all entries to tmp table first. +CREATE TABLE tmp_table SELECT * FROM lams_gradebook_user_lesson; +TRUNCATE TABLE lams_gradebook_user_lesson; +--Change key to unique +ALTER TABLE `lams_gradebook_user_lesson` + DROP FOREIGN KEY `FK_lams_gradebook_user_lesson_1`, + DROP INDEX `lesson_id`; +ALTER TABLE `lams_gradebook_user_lesson` + ADD UNIQUE INDEX `lesson_id` (`lesson_id`,`user_id`), + ADD CONSTRAINT `FK_lams_gradebook_user_lesson_1` FOREIGN KEY (`lesson_id`) REFERENCES `lams_lesson` (`lesson_id`); +--Move entries back to lams_gradebook_user_lesson +INSERT IGNORE INTO lams_gradebook_user_lesson SELECT * from tmp_table; +DROP TABLE tmp_table; + +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -rab88b7ff6a0dbd05c91a29e135b11f9596674f4c -rbe35a3f2bf2414f299ca74f4ea8c3e2555b16d8e --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision ab88b7ff6a0dbd05c91a29e135b11f9596674f4c) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision be35a3f2bf2414f299ca74f4ea8c3e2555b16d8e) @@ -836,9 +836,10 @@ // Now update the lesson mark if (gradebookUserLesson == null) { - gradebookUserLesson = new GradebookUserLesson(); - gradebookUserLesson.setLearner(learner); - gradebookUserLesson.setLesson(lesson); + gradebookUserLesson = new GradebookUserLesson(lesson, learner); + gradebookDAO.insertOrUpdate(gradebookUserLesson); + //flush the session to delay the same gradebookUserLesson from being inserted by another user (it primarily targets situation of leader updating marks for all non-leaders in a group) + gradebookDAO.flush(); } boolean isWeightedMarks = toolService.isWeightedMarks(lesson.getLearningDesign());