Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java =================================================================== diff -u -re7cbf85417c8226f95995e5adb34f7eeb386a98c -r84e266ca8a2c095d3a3e302242703502e2c5ccfb --- lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java (.../EditQbQuestionController.java) (revision e7cbf85417c8226f95995e5adb34f7eeb386a98c) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java (.../EditQbQuestionController.java) (revision 84e266ca8a2c095d3a3e302242703502e2c5ccfb) @@ -76,7 +76,8 @@ @RequestParam(required = false) Long collectionUid) throws ServletException, IOException { form.setUid(-1L);//which signifies it's a new question - form.setQuestionId(qbService.generateNextQuestionId()); // generate a new question ID right away, so another user won't "take it" + form.setQuestionId( + qbService.generateNextQuestionId()); // generate a new question ID right away, so another user won't "take it" form.setMaxMark(1); form.setPenaltyFactor("0"); @@ -124,11 +125,12 @@ throw new RuntimeException("QbQuestion with uid:" + qbQuestionUid + " was not found!"); } Integer userId = getUserId(); - boolean editingAllowed = securityService.isAppadmin(userId, null, true) - || qbService.isQuestionInPublicCollection(qbQuestion.getQuestionId()) - || qbService.isQuestionInUserOwnCollection(qbQuestion.getQuestionId(), userId) - || qbService.isQuestionInUserSharedCollection(qbQuestion.getQuestionId(), userId) - || qbService.isQuestionInUserMonitoredOrganisationFolder(qbQuestion.getQuestionId(), userId); + boolean editingAllowed = + securityService.isAppadmin(userId, null, true) || qbService.isQuestionInPublicCollection( + qbQuestion.getQuestionId()) || qbService.isQuestionInUserOwnCollection( + qbQuestion.getQuestionId(), userId) || qbService.isQuestionInUserSharedCollection( + qbQuestion.getQuestionId(), userId) || qbService.isQuestionInUserMonitoredOrganisationFolder( + qbQuestion.getQuestionId(), userId); if (!editingAllowed) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "The user does not have access to given QB question editing"); @@ -163,10 +165,9 @@ BeanUtils.copyProperties(form, qbQuestion); Integer questionType = qbQuestion.getType(); - if ((questionType == QbQuestion.TYPE_MULTIPLE_CHOICE) || (questionType == QbQuestion.TYPE_ORDERING) - || (questionType == QbQuestion.TYPE_MATCHING_PAIRS) - || (questionType == QbQuestion.TYPE_VERY_SHORT_ANSWERS) || (questionType == QbQuestion.TYPE_NUMERICAL) - || (questionType == QbQuestion.TYPE_MARK_HEDGING)) { + if ((questionType == QbQuestion.TYPE_MULTIPLE_CHOICE) || (questionType == QbQuestion.TYPE_ORDERING) || ( + questionType == QbQuestion.TYPE_MATCHING_PAIRS) || (questionType == QbQuestion.TYPE_VERY_SHORT_ANSWERS) + || (questionType == QbQuestion.TYPE_NUMERICAL) || (questionType == QbQuestion.TYPE_MARK_HEDGING)) { List optionList = qbQuestion.getQbOptions(); request.setAttribute(QbConstants.ATTR_OPTION_LIST, optionList); } @@ -216,21 +217,23 @@ // new version of the old question gets created qbQuestion = qbQuestion.clone(); qbQuestion.clearID(); + qbQuestion.setUuid((UUID) null); qbQuestion.setVersion(qbService.getMaxQuestionVersion(qbQuestion.getQuestionId()) + 1); qbQuestion.setCreateDate(new Date()); qbQuestion.setUuid(UUID.randomUUID()); } - break; + break; case IQbService.QUESTION_MODIFIED_ID_BUMP: { // new question gets created qbQuestion = qbQuestion.clone(); qbQuestion.clearID(); + qbQuestion.setUuid((UUID) null); qbQuestion.setVersion(1); qbQuestion.setCreateDate(new Date()); qbQuestion.setUuid(UUID.randomUUID()); // no need to bump question ID as the new question already has a new ID generated in initNewQuestion() } - break; + break; } userManagementService.save(qbQuestion); @@ -239,14 +242,14 @@ //take care about question's collections. add to collection first Long oldCollectionUid = form.getOldCollectionUid(); Long newCollectionUid = form.getNewCollectionUid(); - if (isAddingQuestion - || (isRequestCameFromTool && oldCollectionUid != null && !newCollectionUid.equals(oldCollectionUid))) { + if (isAddingQuestion || (isRequestCameFromTool && oldCollectionUid != null && !newCollectionUid.equals( + oldCollectionUid))) { qbService.addQuestionToCollection(newCollectionUid, qbQuestion.getQuestionId(), false); } //remove from the old collection, if needed and the question is in users' collections - if (!isAddingQuestion && isRequestCameFromTool && oldCollectionUid != null - && !newCollectionUid.equals(oldCollectionUid)) { + if (!isAddingQuestion && isRequestCameFromTool && oldCollectionUid != null && !newCollectionUid.equals( + oldCollectionUid)) { qbService.removeQuestionFromCollectionByQuestionId(oldCollectionUid, qbQuestion.getQuestionId(), false); } @@ -276,8 +279,8 @@ } QbQuestion qbQuestion = qbService.getQuestionByUid(form.getUid()); - return String.valueOf(qbService.extractFormToQbQuestion(qbQuestion, form, - request) >= IQbService.QUESTION_MODIFIED_VERSION_BUMP); + return String.valueOf(qbService.extractFormToQbQuestion(qbQuestion, form, request) + >= IQbService.QUESTION_MODIFIED_VERSION_BUMP); } @RequestMapping("/returnQuestionUid") Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20240216.sql =================================================================== diff -u -r6726b401c59323726beb691db2a294eb4cd15319 -r84e266ca8a2c095d3a3e302242703502e2c5ccfb --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20240216.sql (.../patch20240216.sql) (revision 6726b401c59323726beb691db2a294eb4cd15319) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20240216.sql (.../patch20240216.sql) (revision 84e266ca8a2c095d3a3e302242703502e2c5ccfb) @@ -3,14 +3,20 @@ SET FOREIGN_KEY_CHECKS=0; -- Put all sql statements below here --- LDEV-4746 Rewrite QB question insert trigger so it accepts existing UUID if it is provided +-- LDEV-5446 Rewrite QB question insert trigger so it accepts existing UUID if it is provided DROP TRIGGER IF EXISTS before_insert_qb_question; CREATE TRIGGER before_insert_qb_question BEFORE INSERT ON lams_qb_question FOR EACH ROW SET new.uuid = IFNULL(new.uuid, UUID_TO_BIN(UUID())); +-- Remove duplicate UUIDs and make sure they are unique in the future +UPDATE lams_qb_question AS q1, lams_qb_question AS q2 SET q2.uuid = UUID_TO_BIN(UUID()) +WHERE q1.uuid = q2.uuid AND q1.uid < q2.uid; + +ALTER TABLE lams_qb_question ADD CONSTRAINT UQ_uuid UNIQUE (uuid); + -- Put all sql statements above here -- If there were no errors, commit and restore autocommit to on Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java =================================================================== diff -u -rcb84acde58155494dc2cdf1bae82eac746dadfe2 -r84e266ca8a2c095d3a3e302242703502e2c5ccfb --- lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision cb84acde58155494dc2cdf1bae82eac746dadfe2) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 84e266ca8a2c095d3a3e302242703502e2c5ccfb) @@ -545,6 +545,7 @@ newQuestion.setVersion(1); newQuestion.setCreateDate(new Date()); newQuestion.clearID(); + newQuestion.setUuid((UUID) null); qbDAO.insert(newQuestion); } qbDAO.addCollectionQuestion(collectionUid, addQbQuestionId); Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/AuthoringController.java =================================================================== diff -u -r70a326811aab339193f6031102dfde367b21cc5c -r84e266ca8a2c095d3a3e302242703502e2c5ccfb --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 70a326811aab339193f6031102dfde367b21cc5c) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 84e266ca8a2c095d3a3e302242703502e2c5ccfb) @@ -418,6 +418,7 @@ // new version of the old question gets created updatedQuestion = qbQuestion.clone(); updatedQuestion.clearID(); + updatedQuestion.setUuid((UUID) null); updatedQuestion.setVersion(qbService.getMaxQuestionVersion(qbQuestion.getQuestionId()) + 1); updatedQuestion.setCreateDate(new Date()); updatedQuestion.setUuid(UUID.randomUUID()); @@ -427,6 +428,7 @@ // new question gets created updatedQuestion = qbQuestion.clone(); updatedQuestion.clearID(); + updatedQuestion.setUuid((UUID) null); updatedQuestion.setVersion(1); updatedQuestion.setCreateDate(new Date()); updatedQuestion.setUuid(UUID.randomUUID()); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java =================================================================== diff -u -rf993635c56cbdd4ee0d6e448e37302004adf3535 -r84e266ca8a2c095d3a3e302242703502e2c5ccfb --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision f993635c56cbdd4ee0d6e448e37302004adf3535) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 84e266ca8a2c095d3a3e302242703502e2c5ccfb) @@ -559,6 +559,7 @@ // new version of the old question gets created updatedQuestion = qbQuestion.clone(); updatedQuestion.clearID(); + updatedQuestion.setUuid((UUID) null); updatedQuestion.setVersion(qbService.getMaxQuestionVersion(qbQuestion.getQuestionId()) + 1); updatedQuestion.setCreateDate(new Date()); updatedQuestion.setUuid(UUID.randomUUID()); @@ -568,6 +569,7 @@ // new question gets created updatedQuestion = qbQuestion.clone(); updatedQuestion.clearID(); + updatedQuestion.setUuid((UUID) null); updatedQuestion.setQuestionId(qbService.generateNextQuestionId()); updatedQuestion.setVersion(1); updatedQuestion.setCreateDate(new Date());