Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java =================================================================== diff -u -r6f0f844e82f555e8dc0df6916226fac35a2a7c36 -rb8e5c281efce81034ea2675a610ba3ea8faa41fb --- lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java (.../ICommonAssessmentService.java) (revision 6f0f844e82f555e8dc0df6916226fac35a2a7c36) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java (.../ICommonAssessmentService.java) (revision b8e5c281efce81034ea2675a610ba3ea8faa41fb) @@ -35,5 +35,5 @@ */ Map countCorrectAnswers(long toolContentId); - boolean recalculateMarksForVsaQuestion(Long qbQuestionUid, String answer); + boolean recalculateMarksForVsaQuestion(Long toolQuestionUid, String answer); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java =================================================================== diff -u -rf6247c953cc7bf9a17d4025ea8e8728ae55c11ed -rb8e5c281efce81034ea2675a610ba3ea8faa41fb --- lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java (.../LamsToolService.java) (revision f6247c953cc7bf9a17d4025ea8e8728ae55c11ed) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java (.../LamsToolService.java) (revision b8e5c281efce81034ea2675a610ba3ea8faa41fb) @@ -554,25 +554,23 @@ @Override public boolean recalculateMarksForVsaQuestion(Long toolQuestionUid, String answer) { - QbToolQuestion toolQuestion = activityDAO.find(QbToolQuestion.class, toolQuestionUid); - Long qbQuestionUid = toolQuestion.getQbQuestion().getUid(); - boolean answerFoundInLearnerResults = recalculateAssessmentMarksForVsaQuestion(qbQuestionUid, answer); - answerFoundInLearnerResults |= recalculateScratchieMarksForVsaQuestion(qbQuestionUid, answer); + boolean answerFoundInLearnerResults = recalculateAssessmentMarksForVsaQuestion(toolQuestionUid, answer); + answerFoundInLearnerResults |= recalculateScratchieMarksForVsaQuestion(toolQuestionUid, answer); return answerFoundInLearnerResults; } - private boolean recalculateAssessmentMarksForVsaQuestion(Long qbQuestionUid, String answer) { + private boolean recalculateAssessmentMarksForVsaQuestion(Long toolQuestionUid, String answer) { Tool assessmentTool = toolDAO.getToolBySignature(CommonConstants.TOOL_SIGNATURE_ASSESSMENT); ICommonAssessmentService sessionManager = (ICommonAssessmentService) lamsCoreToolService .findToolService(assessmentTool); - return sessionManager.recalculateMarksForVsaQuestion(qbQuestionUid, answer); + return sessionManager.recalculateMarksForVsaQuestion(toolQuestionUid, answer); } - private boolean recalculateScratchieMarksForVsaQuestion(Long qbQuestionUid, String answer) { + private boolean recalculateScratchieMarksForVsaQuestion(Long toolQuestionUid, String answer) { Tool scratchieTool = toolDAO.getToolBySignature(CommonConstants.TOOL_SIGNATURE_SCRATCHIE); ICommonScratchieService sessionManager = (ICommonScratchieService) lamsCoreToolService .findToolService(scratchieTool); - return sessionManager.recalculateMarksForVsaQuestion(qbQuestionUid, answer); + return sessionManager.recalculateMarksForVsaQuestion(toolQuestionUid, answer); } @Override Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java =================================================================== diff -u -rbb6788de1fe910e6ab6fb14bb54b5e21551392de -rb8e5c281efce81034ea2675a610ba3ea8faa41fb --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision b8e5c281efce81034ea2675a610ba3ea8faa41fb) @@ -33,7 +33,7 @@ List getAssessmentResults(Long assessmentUid, Long userId); - List getAssessmentResultsByQbQuestionAndAnswer(Long qbQuestionUid, String answer); + List getAssessmentResultsByQbToolQuestionAndAnswer(Long toolQuestionUid, String answer); List getAssessmentResultsBySession(Long sessionId, Long userId); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -r3085af1c7e3e6c3496af23a748d998886d7168fd -rb8e5c281efce81034ea2675a610ba3ea8faa41fb --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 3085af1c7e3e6c3496af23a748d998886d7168fd) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision b8e5c281efce81034ea2675a610ba3ea8faa41fb) @@ -31,13 +31,17 @@ import org.hibernate.query.NativeQuery; import org.hibernate.query.Query; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; +import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.qb.QbUtils; +import org.lamsfoundation.lams.qb.model.QbToolQuestion; import org.lamsfoundation.lams.tool.assessment.dao.AssessmentResultDAO; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO; import org.lamsfoundation.lams.tool.assessment.model.Assessment; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; +import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.OrganisationType; import org.lamsfoundation.lams.usermanagement.User; import org.springframework.stereotype.Repository; @@ -146,23 +150,41 @@ } @Override - public List getAssessmentResultsByQbQuestionAndAnswer(Long qbQuestionUid, String answer) { - String FIND_BY_QBQUESTION = "SELECT r FROM " + AssessmentQuestionResult.class.getName() + " AS q, " - + AssessmentResult.class.getName() + " AS r " - + " WHERE q.assessmentResult.uid = r.uid AND q.qbToolQuestion.qbQuestion.uid =:qbQuestionUid "; - if (StringUtils.isNotBlank(answer)) { + public List getAssessmentResultsByQbToolQuestionAndAnswer(Long toolQuestionUid, String answer) { + if (StringUtils.isBlank(answer)) { + return List.of(); + } - FIND_BY_QBQUESTION += "AND REGEXP_REPLACE(q.answer, '" + QbUtils.VSA_ANSWER_NORMALISE_SQL_REG_EXP - + "', '') = :answer"; + QbToolQuestion qbToolQuestion = find(QbToolQuestion.class, toolQuestionUid); + ToolActivity toolActivity = findByProperty(ToolActivity.class, "toolContentId", + qbToolQuestion.getToolContentId()).get(0); + Organisation organisation = toolActivity.getLearningDesign().getLessons().iterator().next().getOrganisation(); + Organisation parentOrganisation = organisation.getParentOrganisation(); + if (parentOrganisation != null && parentOrganisation.getOrganisationType().getOrganisationTypeId() + .equals(OrganisationType.ROOT_TYPE)) { + parentOrganisation = null; } - FIND_BY_QBQUESTION += " ORDER BY r.startDate ASC"; + String FIND_BY_QBQUESTION = "SELECT r FROM " + AssessmentQuestionResult.class.getName() + " AS qr, " + + AssessmentResult.class.getName() + " AS r, " + ToolActivity.class.getName() + + " AS a JOIN a.learningDesign.lessons AS l " + + "WHERE qr.assessmentResult.uid = r.uid AND a.toolContentId = r.assessment.contentId " + + "AND (l.organisation.organisationId = :organisationId OR " + + " l.organisation.parentOrganisation.organisationId = :organisationId" + + (parentOrganisation == null ? "" + : " OR l.organisation.organisationId = :parentOrganisationId OR " + + "l.organisation.parentOrganisation.organisationId = :parentOrganisationId") + + ") AND qr.qbToolQuestion.qbQuestion.uid = :qbQuestionUid AND REGEXP_REPLACE(qr.answer, '" + + QbUtils.VSA_ANSWER_NORMALISE_SQL_REG_EXP + "', '') = :answer ORDER BY r.startDate ASC"; + Query q = getSession().createQuery(FIND_BY_QBQUESTION, AssessmentResult.class); - q.setParameter("qbQuestionUid", qbQuestionUid); - if (StringUtils.isNotBlank(answer)) { - String normalisedAnswer = QbUtils.normaliseVSAnswer(answer); - q.setParameter("answer", normalisedAnswer); + q.setParameter("qbQuestionUid", qbToolQuestion.getQbQuestion().getUid()); + q.setParameter("organisationId", organisation.getOrganisationId()); + if (parentOrganisation != null) { + q.setParameter("parentOrganisationId", parentOrganisation.getOrganisationId()); } + String normalisedAnswer = QbUtils.normaliseVSAnswer(answer); + q.setParameter("answer", normalisedAnswer); return q.list(); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rb0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e -rb8e5c281efce81034ea2675a610ba3ea8faa41fb --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision b0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision b8e5c281efce81034ea2675a610ba3ea8faa41fb) @@ -1458,10 +1458,12 @@ } @Override - public boolean recalculateMarksForVsaQuestion(Long qbQuestionUid, String answer) { + public boolean recalculateMarksForVsaQuestion(Long toolQuestionUid, String answer) { // get all user results List assessmentResults = assessmentResultDao - .getAssessmentResultsByQbQuestionAndAnswer(qbQuestionUid, answer); + .getAssessmentResultsByQbToolQuestionAndAnswer(toolQuestionUid, answer); + QbToolQuestion toolQuestion = assessmentResultDao.find(QbToolQuestion.class, toolQuestionUid); + Long qbQuestionUid = toolQuestion.getQbQuestion().getUid(); //stores userId->lastFinishedAssessmentResult Map assessmentResultsMap = new LinkedHashMap<>(); for (AssessmentResult assessmentResult : assessmentResults) { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieSessionDAO.java =================================================================== diff -u -r682279f3b246b3293dd9a4b550a06767949499ac -rb8e5c281efce81034ea2675a610ba3ea8faa41fb --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieSessionDAO.java (.../ScratchieSessionDAO.java) (revision 682279f3b246b3293dd9a4b550a06767949499ac) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieSessionDAO.java (.../ScratchieSessionDAO.java) (revision b8e5c281efce81034ea2675a610ba3ea8faa41fb) @@ -48,6 +48,6 @@ /** * Returns all session ids where specified qbQuestionUid is used with the given answer */ - List getSessionIdsByQbQuestion(Long qbQuestionUid, String answer); + List getSessionIdsByQbToolQuestion(Long toolQuestionUid, String answer); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieSessionDAOHibernate.java =================================================================== diff -u -r2188972474f8d186d6811e3dea2e4136be669335 -rb8e5c281efce81034ea2675a610ba3ea8faa41fb --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieSessionDAOHibernate.java (.../ScratchieSessionDAOHibernate.java) (revision 2188972474f8d186d6811e3dea2e4136be669335) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieSessionDAOHibernate.java (.../ScratchieSessionDAOHibernate.java) (revision b8e5c281efce81034ea2675a610ba3ea8faa41fb) @@ -28,15 +28,20 @@ import java.util.Set; import java.util.TreeSet; +import org.apache.commons.lang.StringUtils; import org.hibernate.query.NativeQuery; import org.hibernate.query.Query; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; +import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.qb.model.QbToolQuestion; import org.lamsfoundation.lams.tool.scratchie.dao.ScratchieSessionDAO; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswerVisitLog; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieItem; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieSession; import org.lamsfoundation.lams.tool.scratchie.service.IScratchieService; import org.lamsfoundation.lams.tool.scratchie.util.ScratchieSessionComparator; +import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.OrganisationType; import org.springframework.stereotype.Repository; @Repository @@ -91,16 +96,41 @@ } @Override - public List getSessionIdsByQbQuestion(Long qbQuestionUid, String answer) { + public List getSessionIdsByQbToolQuestion(Long toolQuestionUid, String answer) { + if (StringUtils.isBlank(answer)) { + return List.of(); + } + + QbToolQuestion qbToolQuestion = find(QbToolQuestion.class, toolQuestionUid); + ToolActivity toolActivity = findByProperty(ToolActivity.class, "toolContentId", + qbToolQuestion.getToolContentId()).get(0); + Organisation organisation = toolActivity.getLearningDesign().getLessons().iterator().next().getOrganisation(); + Organisation parentOrganisation = organisation.getParentOrganisation(); + if (parentOrganisation != null && parentOrganisation.getOrganisationType().getOrganisationTypeId() + .equals(OrganisationType.ROOT_TYPE)) { + parentOrganisation = null; + } + final String FIND_BY_QBQUESTION_AND_FINISHED = "SELECT DISTINCT session.sessionId FROM " + ScratchieItem.class.getName() + " AS item, " + ScratchieSession.class.getName() + " AS session, " - + ScratchieAnswerVisitLog.class.getName() - + " AS visitLog WHERE session.scratchie.uid = item.scratchieUid AND item.qbQuestion.uid =:qbQuestionUid" - + " AND session.sessionId = visitLog.sessionId AND REGEXP_REPLACE(visitLog.answer, '" + + ScratchieAnswerVisitLog.class.getName() + " AS visitLog, " + ToolActivity.class.getName() + + " AS a JOIN a.learningDesign.lessons AS l " + + "WHERE session.scratchie.uid = item.scratchieUid AND a.toolContentId = session.scratchie.contentId " + + "AND (l.organisation.organisationId = :organisationId OR " + + " l.organisation.parentOrganisation.organisationId = :organisationId" + + (parentOrganisation == null ? "" + : " OR l.organisation.organisationId = :parentOrganisationId OR " + + "l.organisation.parentOrganisation.organisationId = :parentOrganisationId") + + ") AND item.qbQuestion.uid =:qbQuestionUid " + + "AND session.sessionId = visitLog.sessionId AND REGEXP_REPLACE(visitLog.answer, '" + IScratchieService.VSA_ANSWER_NORMALISE_SQL_REG_EXP + "', '') = :answer"; Query q = getSession().createQuery(FIND_BY_QBQUESTION_AND_FINISHED, Long.class); - q.setParameter("qbQuestionUid", qbQuestionUid); + q.setParameter("qbQuestionUid", qbToolQuestion.getQbQuestion().getUid()); + q.setParameter("organisationId", organisation.getOrganisationId()); + if (parentOrganisation != null) { + q.setParameter("parentOrganisationId", parentOrganisation.getOrganisationId()); + } String normalisedAnswer = answer.replaceAll(IScratchieService.VSA_ANSWER_NORMALISE_JAVA_REG_EXP, ""); q.setParameter("answer", normalisedAnswer); return q.list(); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -rb0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e -rb8e5c281efce81034ea2675a610ba3ea8faa41fb --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision b0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision b8e5c281efce81034ea2675a610ba3ea8faa41fb) @@ -592,8 +592,8 @@ } @Override - public boolean recalculateMarksForVsaQuestion(Long qbQuestionUid, String answer) { - List sessionIds = scratchieSessionDao.getSessionIdsByQbQuestion(qbQuestionUid, answer); + public boolean recalculateMarksForVsaQuestion(Long toolQuestionUid, String answer) { + List sessionIds = scratchieSessionDao.getSessionIdsByQbToolQuestion(toolQuestionUid, answer); // recalculate marks if it's required for (Long sessionId : sessionIds) { recalculateMarkForSession(sessionId, true);