Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java =================================================================== diff -u -rd9a9f033cd1e6050279d05ef7cbca24f243ecf6a -rd4198d73576015c08d18ebf55f3079c84fdf3415 --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java (.../Assessment.java) (revision d9a9f033cd1e6050279d05ef7cbca24f243ecf6a) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java (.../Assessment.java) (revision d4198d73576015c08d18ebf55f3079c84fdf3415) @@ -60,6 +60,7 @@ Set answers = null; // only used if type == 1 String uuid = null; // used when QTI gets imported and it contains QB question UUID List learningOutcomes; + Long collectionUid; public void setType(short type) { this.type = type; @@ -133,6 +134,14 @@ this.learningOutcomes = learningOutcomes; } + public Long getCollectionUid() { + return collectionUid; + } + + public void setCollectionUid(Long collectionUid) { + this.collectionUid = collectionUid; + } + public String getUuid() { return uuid; } @@ -165,6 +174,9 @@ if (learningOutcomes != null && !learningOutcomes.isEmpty()) { json.set(RestTags.LEARNING_OUTCOMES, JsonUtil.readArray(learningOutcomes)); } + if (collectionUid != null) { + json.put(RestTags.COLLECTION_UID, collectionUid); + } return json; } Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java =================================================================== diff -u -rd9a9f033cd1e6050279d05ef7cbca24f243ecf6a -rd4198d73576015c08d18ebf55f3079c84fdf3415 --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java (.../TBLTemplateController.java) (revision d9a9f033cd1e6050279d05ef7cbca24f243ecf6a) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java (.../TBLTemplateController.java) (revision d4198d73576015c08d18ebf55f3079c84fdf3415) @@ -437,7 +437,7 @@ Integer questionDisplayOrder = Integer.valueOf(name.substring(questionOffset, optionIndex)); Integer optionDisplayOrder = Integer.valueOf(name.substring(optionIndex + 6)); processTestQuestion(name, null, null, questionDisplayOrder, null, optionDisplayOrder, - getTrimmedString(request, name, true), null); + getTrimmedString(request, name, true), null, null); } else { int titleIndex = name.indexOf("title"); if (titleIndex > 0) { // question1title @@ -446,14 +446,17 @@ // get all learning outcomes straight away instead of iterating over them String[] learningOutcomes = request .getParameterValues("question" + questionDisplayOrder + "learningOutcome"); + Long collectionUid = WebUtil.readLongParam(request, + "question" + questionDisplayOrder + "collection", true); processTestQuestion(name, null, getTrimmedString(request, name, false), - questionDisplayOrder, null, null, null, learningOutcomes); - } else if (name.indexOf("uuid") < 0 && name.indexOf("learningOutcome") < 0) { + questionDisplayOrder, null, null, null, learningOutcomes, collectionUid); + } else if (name.indexOf("uuid") < 0 && name.indexOf("learningOutcome") < 0 + && name.indexOf("collection") < 0) { Integer questionDisplayOrder = Integer.valueOf(name.substring(questionOffset)); processTestQuestion(name, getTrimmedString(request, name, true), null, questionDisplayOrder, getTrimmedString(request, "question" + questionDisplayOrder + "uuid", false), - null, null, null); + null, null, null, null); } } } @@ -556,6 +559,7 @@ String questionUuid = getTrimmedString(request, assessmentPrefix + "uuid", false); String markAsString = getTrimmedString(request, assessmentPrefix + "mark", false); String[] learningOutcomes = request.getParameterValues(assessmentPrefix + "learningOutcome"); + String collectionUid = getTrimmedString(request, assessmentPrefix + "collection", false); Assessment assessment = new Assessment(); if (questionText != null) { assessment.setTitle(questionTitle); @@ -605,6 +609,10 @@ assessment.setLearningOutcomes(Arrays.asList(learningOutcomes)); } + if (collectionUid != null) { + assessment.setCollectionUid(Long.valueOf(collectionUid)); + } + applicationExercises.put(i, assessment); } } @@ -639,7 +647,8 @@ } void processTestQuestion(String name, String questionText, String questionTitle, Integer questionDisplayOrder, - String questionUuid, Integer optionDisplayOrder, String optionText, String[] learningOutcomes) { + String questionUuid, Integer optionDisplayOrder, String optionText, String[] learningOutcomes, + Long collectionUid) { ObjectNode question = testQuestions.get(questionDisplayOrder); if (question == null) { @@ -683,6 +692,10 @@ + question.get(RestTags.QUESTION_TITLE)); } } + + if (collectionUid != null) { + question.put(RestTags.COLLECTION_UID, collectionUid); + } } void updateCorrectAnswers(TreeMap correctAnswers) { Index: lams_central/web/authoring/template/tbl/tbl.jsp =================================================================== diff -u -r0e518f584efa4e32e8543163e92537911eddabcf -rd4198d73576015c08d18ebf55f3079c84fdf3415 --- lams_central/web/authoring/template/tbl/tbl.jsp (.../tbl.jsp) (revision 0e518f584efa4e32e8543163e92537911eddabcf) +++ lams_central/web/authoring/template/tbl/tbl.jsp (.../tbl.jsp) (revision d4198d73576015c08d18ebf55f3079c84fdf3415) @@ -46,6 +46,7 @@ // validate the main form var validator = $("#templateForm").validate({ + ignore : 'div.cke_editable', rules: { sequenceTitle: { required: true, Index: lams_central/web/authoring/template/tool/assessmentQTI.jsp =================================================================== diff -u -rd9a9f033cd1e6050279d05ef7cbca24f243ecf6a -rd4198d73576015c08d18ebf55f3079c84fdf3415 --- lams_central/web/authoring/template/tool/assessmentQTI.jsp (.../assessmentQTI.jsp) (revision d9a9f033cd1e6050279d05ef7cbca24f243ecf6a) +++ lams_central/web/authoring/template/tool/assessmentQTI.jsp (.../assessmentQTI.jsp) (revision d4198d73576015c08d18ebf55f3079c84fdf3415) @@ -21,6 +21,7 @@ + ${currentNumber + 1} Index: lams_central/web/authoring/template/tool/mcquestionQTI.jsp =================================================================== diff -u -rd9a9f033cd1e6050279d05ef7cbca24f243ecf6a -rd4198d73576015c08d18ebf55f3079c84fdf3415 --- lams_central/web/authoring/template/tool/mcquestionQTI.jsp (.../mcquestionQTI.jsp) (revision d9a9f033cd1e6050279d05ef7cbca24f243ecf6a) +++ lams_central/web/authoring/template/tool/mcquestionQTI.jsp (.../mcquestionQTI.jsp) (revision d4198d73576015c08d18ebf55f3079c84fdf3415) @@ -14,6 +14,7 @@ + Index: lams_common/src/java/org/lamsfoundation/lams/rest/RestTags.java =================================================================== diff -u -rd9a9f033cd1e6050279d05ef7cbca24f243ecf6a -rd4198d73576015c08d18ebf55f3079c84fdf3415 --- lams_common/src/java/org/lamsfoundation/lams/rest/RestTags.java (.../RestTags.java) (revision d9a9f033cd1e6050279d05ef7cbca24f243ecf6a) +++ lams_common/src/java/org/lamsfoundation/lams/rest/RestTags.java (.../RestTags.java) (revision d4198d73576015c08d18ebf55f3079c84fdf3415) @@ -59,10 +59,10 @@ public static String QUESTION_TEXT = "questionText"; public static String QUESTION_TITLE = "questionTitle"; public static String QUESTION_UUID = "questionUuid"; + public static String COLLECTION_UID = "collectionUid"; public static String ANSWERS = "answers"; public static String ANSWER_TEXT = "answerText"; public static String DISPLAY_ORDER = "displayOrder"; public static String CORRECT = "correct"; public static String LEARNING_OUTCOMES = "learningOutcomes"; - } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r24940cc694b5cab706055244b91904017b74ad54 -rd4198d73576015c08d18ebf55f3079c84fdf3415 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 24940cc694b5cab706055244b91904017b74ad54) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision d4198d73576015c08d18ebf55f3079c84fdf3415) @@ -3512,19 +3512,15 @@ } assessment.setCreatedBy(assessmentUser); - // **************************** Set the question bank ********************* - QbCollection collection = qbService.getUserPrivateCollection(userID); - Set collectionUUIDs = collection == null ? new HashSet<>() - : qbService.getCollectionQuestions(collection.getUid()).stream().filter(q -> q.getUuid() != null) - .collect(Collectors.mapping(q -> q.getUuid().toString(), Collectors.toSet())); ArrayNode questions = JsonUtil.optArray(toolContentJSON, "questions"); Set newQuestionSet = assessment.getQuestions(); // the Assessment constructor will set up the collection if (questions != null) { - for (JsonNode questionJSONData : questions) { - boolean addToCollection = collection != null; + QbCollection collection = null; + Set collectionUUIDs = null; + for (JsonNode questionJSONData : questions) { AssessmentQuestion question = new AssessmentQuestion(); Integer type = JsonUtil.optInt(questionJSONData, "type"); question.setToolContentId(toolContentID); @@ -3625,6 +3621,22 @@ qbQuestion.setQbOptions(optionList); } + Long collectionUid = JsonUtil.optLong(questionJSONData, RestTags.COLLECTION_UID); + boolean addToCollection = collectionUid != null; + if (addToCollection) { + // check if it is the same collection - there is a good chance it is + if (collection == null || collectionUid != collection.getUid()) { + collection = qbService.getCollection(collectionUid); + if (collection == null) { + addToCollection = false; + } else { + collectionUUIDs = qbService.getCollectionQuestions(collection.getUid()).stream() + .filter(q -> q.getUuid() != null) + .collect(Collectors.mapping(q -> q.getUuid().toString(), Collectors.toSet())); + } + } + } + if (isModification) { addToCollection &= !collectionUUIDs.contains(uuid); @@ -3681,7 +3693,7 @@ // all questions need to end up in user's private collection if (addToCollection) { - qbService.addQuestionToCollection(collection.getUid(), qbQuestion.getQuestionId(), false); + qbService.addQuestionToCollection(collectionUid, qbQuestion.getQuestionId(), false); collectionUUIDs.add(uuid); } } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r24940cc694b5cab706055244b91904017b74ad54 -rd4198d73576015c08d18ebf55f3079c84fdf3415 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 24940cc694b5cab706055244b91904017b74ad54) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision d4198d73576015c08d18ebf55f3079c84fdf3415) @@ -2720,14 +2720,12 @@ // Scratchie Items Set newItems = new TreeSet<>(); - QbCollection collection = qbService.getUserPrivateCollection(userID); - Set collectionUUIDs = collection == null ? new HashSet<>() - : qbService.getCollectionQuestions(collection.getUid()).stream().filter(q -> q.getUuid() != null) - .collect(Collectors.mapping(q -> q.getUuid().toString(), Collectors.toSet())); - + QbCollection collection = null; + Set collectionUUIDs = null; + ArrayNode questions = JsonUtil.optArray(toolContentJSON, RestTags.QUESTIONS); for (int i = 0; i < questions.size(); i++) { - boolean addToCollection = false; + ObjectNode questionData = (ObjectNode) questions.get(i); ScratchieItem item = new ScratchieItem(); @@ -2743,9 +2741,24 @@ qbQuestion = qbService.getQuestionByUUID(UUID.fromString(uuid)); } - if (qbQuestion == null) { - addToCollection = collection != null; + Long collectionUid = JsonUtil.optLong(questionData, RestTags.COLLECTION_UID); + boolean addToCollection = collectionUid != null; + if (addToCollection) { + // check if it is the same collection - there is a good chance it is + if (collection == null || collectionUid != collection.getUid()) { + collection = qbService.getCollection(collectionUid); + if (collection == null) { + addToCollection = false; + } else { + collectionUUIDs = qbService.getCollectionQuestions(collection.getUid()).stream() + .filter(q -> q.getUuid() != null) + .collect(Collectors.mapping(q -> q.getUuid().toString(), Collectors.toSet())); + } + } + } + + if (qbQuestion == null) { qbQuestion = new QbQuestion(); qbQuestion.setType(QbQuestion.TYPE_MULTIPLE_CHOICE); qbQuestion.setQuestionId(qbService.generateNextQuestionId()); @@ -2794,8 +2807,8 @@ userManagementService.save(outcomeMapping); } } - } else if (collection != null && !collectionUUIDs.contains(uuid)) { - addToCollection = true; + } else if (addToCollection && collectionUUIDs.contains(uuid)) { + addToCollection = false; } item.setQbQuestion(qbQuestion);