Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java =================================================================== diff -u -r9d47641d6f9dc421a253351549dc6fe532694589 -rea6095ed8109b6425e527f5a7df4e4810bb3e518 --- lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java (.../EditQbQuestionController.java) (revision 9d47641d6f9dc421a253351549dc6fe532694589) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java (.../EditQbQuestionController.java) (revision ea6095ed8109b6425e527f5a7df4e4810bb3e518) @@ -124,7 +124,8 @@ boolean editingAllowed = userManagementService.isUserSysAdmin() || qbService.isQuestionInPublicCollection(qbQuestion.getQuestionId()) || qbService.isQuestionInUserOwnCollection(qbQuestion.getQuestionId(), userId) - || qbService.isQuestionInUserSharedCollection(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"); Index: lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java =================================================================== diff -u -rf1da04a71e4b26ddae139a92a1af522cbb087000 -rea6095ed8109b6425e527f5a7df4e4810bb3e518 --- lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java (.../IQbDAO.java) (revision f1da04a71e4b26ddae139a92a1af522cbb087000) +++ lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java (.../IQbDAO.java) (revision ea6095ed8109b6425e527f5a7df4e4810bb3e518) @@ -89,6 +89,8 @@ boolean isQuestionInPublicCollection(int qbQuestionId); + boolean isQuestionInUserMonitoredOrganisationFolder(int qbQuestionId, int userId); + int mergeQuestions(long sourceQbQUestionUid, long targetQbQuestionUid); void removeAnswersByToolContentId(long toolContentId); Index: lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java =================================================================== diff -u -rf1da04a71e4b26ddae139a92a1af522cbb087000 -rea6095ed8109b6425e527f5a7df4e4810bb3e518 --- lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java (.../QbDAO.java) (revision f1da04a71e4b26ddae139a92a1af522cbb087000) +++ lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java (.../QbDAO.java) (revision ea6095ed8109b6425e527f5a7df4e4810bb3e518) @@ -23,6 +23,7 @@ import org.lamsfoundation.lams.qb.model.QbToolQuestion; import org.lamsfoundation.lams.tool.ToolContent; import org.lamsfoundation.lams.usermanagement.Role; +import org.lamsfoundation.lams.usermanagement.WorkspaceFolder; public class QbDAO extends LAMSBaseDAO implements IQbDAO { @@ -124,6 +125,17 @@ + "JOIN lams_qb_collection AS c ON cq.collection_uid = c.uid AND " + "c.user_id IS NULL AND cq.qb_question_id = :qbQuestionId"; + private static final String IS_QUESTION_IN_USER_MONITORED_ORGANISATION_FOLDER = "SELECT DISTINCT 1 FROM lams_qb_question AS q " + + "JOIN lams_qb_tool_question AS tq ON q.uid = tq.qb_question_uid AND q.question_id = :qbQuestionId " + + "JOIN lams_learning_activity AS a USING (tool_content_id) " + + "JOIN lams_learning_design AS ld USING (learning_design_id) " + + "JOIN lams_workspace_folder AS wf USING (workspace_folder_id)" + + "LEFT JOIN lams_user_organisation AS uo USING (organisation_id) " + + "LEFT JOIN lams_user_organisation_role AS uor USING (user_organisation_id) " + + "WHERE ld.removed = 0 AND (wf.user_id = :userId OR wf.lams_workspace_folder_type_id = " + + WorkspaceFolder.PUBLIC_SEQUENCES + " OR (uo.user_id = :userId AND uor.role_id = " + Role.ROLE_MONITOR + + "))"; + private static final String GENERATE_QUESTION_ID = "INSERT INTO lams_sequence_generator(lams_qb_question_question_id) VALUES (:qbQuestionId)"; private static final String MERGE_TOOL_QUESTIONS = "UPDATE QbToolQuestion SET qbQuestion.uid = :targetQbQuestionUid WHERE qbQuestion.uid = :sourceQbQuestionUid"; @@ -518,6 +530,12 @@ .setParameter("qbQuestionId", qbQuestionId).uniqueResult() != null; } + @Override + public boolean isQuestionInUserMonitoredOrganisationFolder(int qbQuestionId, int userId) { + return getSession().createNativeQuery(IS_QUESTION_IN_USER_MONITORED_ORGANISATION_FOLDER) + .setParameter("userId", userId).setParameter("qbQuestionId", qbQuestionId).uniqueResult() != null; + } + private boolean isQuestionInCollection(long collectionUid, int qbQuestionId) { return !getSession().createNativeQuery(IS_QUESTION_IN_COLLECTION).setParameter("collectionUid", collectionUid) .setParameter("qbQuestionId", qbQuestionId).getResultList().isEmpty(); Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java =================================================================== diff -u -rf1da04a71e4b26ddae139a92a1af522cbb087000 -rea6095ed8109b6425e527f5a7df4e4810bb3e518 --- lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision f1da04a71e4b26ddae139a92a1af522cbb087000) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision ea6095ed8109b6425e527f5a7df4e4810bb3e518) @@ -156,6 +156,8 @@ boolean isQuestionInPublicCollection(int qbQuestionId); + boolean isQuestionInUserMonitoredOrganisationFolder(int qbQuestionId, int userId); + void insertQuestion(QbQuestion qbQuestion); void prepareQuestionForExport(QbQuestion qbQuestion); Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java =================================================================== diff -u -rf1da04a71e4b26ddae139a92a1af522cbb087000 -rea6095ed8109b6425e527f5a7df4e4810bb3e518 --- lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision f1da04a71e4b26ddae139a92a1af522cbb087000) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision ea6095ed8109b6425e527f5a7df4e4810bb3e518) @@ -677,6 +677,15 @@ } /** + * Is the question in a learning design which is in user's private folder, public folder + * or a course folder where user is a monitor. + */ + @Override + public boolean isQuestionInUserMonitoredOrganisationFolder(int qbQuestionId, int userId) { + return qbDAO.isQuestionInUserMonitoredOrganisationFolder(qbQuestionId, userId); + } + + /** * Cascades in QbToolQuestion, QbQuestion and QbOptions do not seem to work on insert. * New QbQuestions need to be saved step by step. */