Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r846f7b4c76f01650ce4a2df946772bafc4228dcf -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeAction.java =================================================================== diff -u -r846f7b4c76f01650ce4a2df946772bafc4228dcf -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeAction.java (.../OutcomeAction.java) (revision 846f7b4c76f01650ce4a2df946772bafc4228dcf) +++ lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeAction.java (.../OutcomeAction.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.web.outcome; import java.util.Date; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -40,7 +41,10 @@ import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.apache.struts.actions.DispatchAction; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.outcome.Outcome; +import org.lamsfoundation.lams.outcome.OutcomeMapping; import org.lamsfoundation.lams.outcome.OutcomeScale; import org.lamsfoundation.lams.outcome.OutcomeScaleItem; import org.lamsfoundation.lams.outcome.service.IOutcomeService; @@ -83,7 +87,7 @@ return null; } } - List outcomes = getOutcomeService().getOutcomesForManagement(organisationId); + List outcomes = getOutcomeService().getOutcomes(organisationId); request.setAttribute("outcomes", outcomes); request.setAttribute("canManageGlobal", getUserManagementService().isUserSysAdmin()); @@ -123,7 +127,7 @@ outcomeForm.setScaleId(outcome.getScale().getScaleId()); } - List scales = getOutcomeService().getScalesForManagement(organisationId); + List scales = getOutcomeService().getScales(organisationId); request.setAttribute("scales", scales); request.setAttribute("canManageGlobal", getUserManagementService().isUserSysAdmin()); @@ -226,6 +230,146 @@ return outcomeManage(mapping, form, request, response); } + public ActionForward outcomeSearch(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + String search = WebUtil.readStrParam(request, "term", true); + String organisationIdString = WebUtil.readStrParam(request, "organisationIds", true); + Set organisationIds = null; + Integer userId = getUserDTO().getUserID(); + if (StringUtils.isNotBlank(organisationIdString)) { + String[] split = organisationIdString.split(","); + organisationIds = new HashSet(split.length); + for (String organisationId : split) { + organisationIds.add(Integer.valueOf(organisationId)); + } + } + if (organisationIds == null) { + if (!request.isUserInRole(Role.SYSADMIN) && !request.isUserInRole(Role.AUTHOR)) { + String error = "User " + userId + " is not sysadmin nor an author and can not search outcome"; + log.error(error); + throw new SecurityException(error); + } + } else { + for (Integer organisationId : organisationIds) { + getSecurityService().hasOrgRole(organisationId, userId, new String[] { Role.AUTHOR }, "search outcome", + true); + } + } + + List outcomes = getOutcomeService().getOutcomes(search, organisationIds); + JSONArray responseJSON = new JSONArray(); + for (Outcome outcome : outcomes) { + JSONObject outcomeJSON = new JSONObject(); + outcomeJSON.put("value", outcome.getOutcomeId()); + outcomeJSON.put("label", outcome.getName() + " (" + outcome.getCode() + ")"); + responseJSON.put(outcomeJSON); + } + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(responseJSON); + return null; + } + + public ActionForward outcomeMap(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + Long outcomeId = WebUtil.readLongParam(request, "outcomeId"); + Long lessonId = WebUtil.readLongParam(request, "lessonId", true); + Long toolContentId = WebUtil.readLongParam(request, "toolContentId", true); + if (lessonId == null && toolContentId == null) { + throw new IllegalArgumentException( + "Either lesson ID or tool content ID must not be null when creating an outcome mapping"); + } + Long itemId = WebUtil.readLongParam(request, "itemId", true); + + Outcome outcome = (Outcome) getUserManagementService().findById(Outcome.class, outcomeId); + Integer organisationId = outcome.getOrganisation() == null ? null + : outcome.getOrganisation().getOrganisationId(); + Integer userId = getUserDTO().getUserID(); + + if (organisationId == null) { + if (!request.isUserInRole(Role.SYSADMIN) && !request.isUserInRole(Role.AUTHOR)) { + String error = "User " + userId + " is not sysadmin nor an author and can not map outcome"; + log.error(error); + throw new SecurityException(error); + } + } else { + getSecurityService().hasOrgRole(organisationId, userId, new String[] { Role.AUTHOR }, "map outcome", true); + } + + List outcomeMappings = getOutcomeService().getOutcomeMappings(lessonId, toolContentId, itemId); + for (OutcomeMapping existingMapping : outcomeMappings) { + if (existingMapping.getOutcome().getOutcomeId().equals(outcome.getOutcomeId())) { + throw new IllegalArgumentException( + "Trying to map an already mapped outcome with ID " + outcome.getOutcomeId()); + } + } + + OutcomeMapping outcomeMapping = new OutcomeMapping(); + outcomeMapping.setOutcome(outcome); + outcomeMapping.setLessonId(lessonId); + outcomeMapping.setToolContentId(toolContentId); + outcomeMapping.setItemId(itemId); + getUserManagementService().save(outcomeMapping); + + response.setContentType("text/plain;charset=utf-8"); + response.getWriter().print(outcomeMapping.getMappingId()); + return null; + } + + public ActionForward outcomeGetMappings(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + + Long lessonId = WebUtil.readLongParam(request, "lessonId", true); + Long toolContentId = WebUtil.readLongParam(request, "toolContentId", true); + if (lessonId == null && toolContentId == null) { + throw new IllegalArgumentException( + "Either lesson ID or tool content ID must not be null when fetching outcome mappings"); + } + Long itemId = WebUtil.readLongParam(request, "itemId", true); + Integer userId = getUserDTO().getUserID(); + if (!request.isUserInRole(Role.SYSADMIN) && !request.isUserInRole(Role.AUTHOR)) { + String error = "User " + userId + " is not sysadmin nor an author and can not map outcome"; + log.error(error); + throw new SecurityException(error); + } + + List outcomeMappings = getOutcomeService().getOutcomeMappings(lessonId, toolContentId, itemId); + JSONArray responseJSON = new JSONArray(); + for (OutcomeMapping outcomeMapping : outcomeMappings) { + JSONObject outcomeJSON = new JSONObject(); + outcomeJSON.put("mappingId", outcomeMapping.getMappingId()); + outcomeJSON.put("outcomeId", outcomeMapping.getOutcome().getOutcomeId()); + outcomeJSON.put("label", + outcomeMapping.getOutcome().getName() + " (" + outcomeMapping.getOutcome().getCode() + ")"); + responseJSON.put(outcomeJSON); + } + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(responseJSON); + return null; + } + + public ActionForward outcomeRemoveMapping(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + Long mappingId = WebUtil.readLongParam(request, "mappingId"); + OutcomeMapping outcomeMapping = (OutcomeMapping) getUserManagementService().findById(OutcomeMapping.class, + mappingId); + Organisation organisation = outcomeMapping.getOutcome().getOrganisation(); + Integer organisationId = organisation == null ? null : organisation.getOrganisationId(); + Integer userId = getUserDTO().getUserID(); + if (organisationId == null) { + if (!request.isUserInRole(Role.SYSADMIN) && !request.isUserInRole(Role.AUTHOR)) { + String error = "User " + userId + + " is not sysadmin nor an author and can not remove an outcome mapping"; + log.error(error); + throw new SecurityException(error); + } + } else { + getSecurityService().hasOrgRole(organisationId, userId, new String[] { Role.AUTHOR }, + "remove outcome mapping", true); + } + getUserManagementService().delete(outcomeMapping); + return null; + } + public ActionForward scaleManage(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { Integer userId = getUserDTO().getUserID(); @@ -245,7 +389,7 @@ return null; } } - List scales = getOutcomeService().getScalesForManagement(organisationId); + List scales = getOutcomeService().getScales(organisationId); request.setAttribute("scales", scales); request.setAttribute("canManageGlobal", getUserManagementService().isUserSysAdmin()); Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/Outcome.hbm.xml =================================================================== diff -u -r313e29d4010a35282a7c56dd24971e40b442dfb0 -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/Outcome.hbm.xml (.../Outcome.hbm.xml) (revision 313e29d4010a35282a7c56dd24971e40b442dfb0) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/Outcome.hbm.xml (.../Outcome.hbm.xml) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -33,7 +33,8 @@ + class="org.lamsfoundation.lams.usermanagement.User" + not-null="false"> Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeMapping.hbm.xml =================================================================== diff -u --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeMapping.hbm.xml (revision 0) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeMapping.hbm.xml (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeResult.hbm.xml =================================================================== diff -u --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeResult.hbm.xml (revision 0) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeResult.hbm.xml (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeScale.hbm.xml =================================================================== diff -u -r846f7b4c76f01650ce4a2df946772bafc4228dcf -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeScale.hbm.xml (.../OutcomeScale.hbm.xml) (revision 846f7b4c76f01650ce4a2df946772bafc4228dcf) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeScale.hbm.xml (.../OutcomeScale.hbm.xml) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -29,12 +29,14 @@ + class="org.lamsfoundation.lams.usermanagement.User" + not-null="false"> + class="org.lamsfoundation.lams.usermanagement.Organisation" + not-null="false"> Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20180802.sql =================================================================== diff -u -r313e29d4010a35282a7c56dd24971e40b442dfb0 -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20180802.sql (.../patch20180802.sql) (revision 313e29d4010a35282a7c56dd24971e40b442dfb0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20180802.sql (.../patch20180802.sql) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -48,7 +48,32 @@ -- Do not remove outcomes when a scale gets removed. Programmer needs to do it manually to make sure it is the right step. CONSTRAINT FK_lams_outcome_2 FOREIGN KEY (scale_id) REFERENCES lams_outcome_scale (scale_id) ON UPDATE CASCADE ); + +CREATE TABLE lams_outcome_mapping ( + mapping_id BIGINT AUTO_INCREMENT, + outcome_id MEDIUMINT NOT NULL, + lesson_id BIGINT, + tool_content_id BIGINT, + item_id BIGINT, + PRIMARY KEY (mapping_id), + CONSTRAINT FK_lams_outcome_mapping_1 FOREIGN KEY (outcome_id) REFERENCES lams_outcome (outcome_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT FK_lams_outcome_mapping_2 FOREIGN KEY (lesson_id) REFERENCES lams_lesson (lesson_id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT FK_lams_outcome_mapping_3 FOREIGN KEY (tool_content_id) REFERENCES lams_tool_content (tool_content_id) ON DELETE CASCADE ON UPDATE CASCADE + ); +CREATE TABLE lams_outcome_result ( + result_id BIGINT AUTO_INCREMENT, + mapping_id BIGINT NOT NULL, + user_id BIGINT, + value TINYINT, + create_by BIGINT, + create_date_time DATETIME NOT NULL, + PRIMARY KEY (result_id), + CONSTRAINT FK_lams_outcome_result_1 FOREIGN KEY (mapping_id) REFERENCES lams_outcome_mapping (mapping_id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT FK_lams_outcome_result_2 FOREIGN KEY (user_id) REFERENCES lams_user (user_id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT FK_lams_outcome_result_3 FOREIGN KEY (create_by) REFERENCES lams_user (user_id) ON DELETE SET NULL ON UPDATE CASCADE + ); + ----------------------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/outcome/Outcome.java =================================================================== diff -u -r313e29d4010a35282a7c56dd24971e40b442dfb0 -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/src/java/org/lamsfoundation/lams/outcome/Outcome.java (.../Outcome.java) (revision 313e29d4010a35282a7c56dd24971e40b442dfb0) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/Outcome.java (.../Outcome.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -1,11 +1,14 @@ package org.lamsfoundation.lams.outcome; +import java.io.Serializable; import java.util.Date; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.User; -public class Outcome { +public class Outcome implements Serializable { + private static final long serialVersionUID = -7175245687448269571L; + private Long outcomeId; private Organisation organisation; private OutcomeScale scale; @@ -81,10 +84,10 @@ } public String getContentFolderId() { - return contentFolderId; + return contentFolderId; } public void setContentFolderId(String contentFolderId) { - this.contentFolderId = contentFolderId; + this.contentFolderId = contentFolderId; } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeMapping.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeMapping.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeMapping.java (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -0,0 +1,54 @@ +package org.lamsfoundation.lams.outcome; + +import java.io.Serializable; + +public class OutcomeMapping implements Serializable { + private static final long serialVersionUID = -2195345501533401085L; + + private Long mappingId; + private Outcome outcome; + private Long lessonId; + private Long toolContentId; + private Long itemId; + + public Long getMappingId() { + return mappingId; + } + + public void setMappingId(Long mappingId) { + this.mappingId = mappingId; + } + + public Outcome getOutcome() { + return outcome; + } + + public void setOutcome(Outcome outcome) { + this.outcome = outcome; + } + + public Long getLessonId() { + return lessonId; + } + + public void setLessonId(Long lessonId) { + this.lessonId = lessonId; + } + + public Long getToolContentId() { + return toolContentId; + } + + public void setToolContentId(Long toolContentId) { + this.toolContentId = toolContentId; + } + + public Long getItemId() { + return itemId; + } + + public void setItemId(Long itemId) { + this.itemId = itemId; + } + +} \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeResult.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeResult.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeResult.java (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -0,0 +1,65 @@ +package org.lamsfoundation.lams.outcome; + +import java.io.Serializable; +import java.util.Date; + +import org.lamsfoundation.lams.usermanagement.User; + +public class OutcomeResult implements Serializable { + private static final long serialVersionUID = 1703649292232336661L; + + private Long resultId; + private OutcomeMapping mapping; + private User user; + private Integer value; + private User createBy; + private Date createDateTime; + + public Long getResultId() { + return resultId; + } + + public void setResultId(Long resultId) { + this.resultId = resultId; + } + + public OutcomeMapping getMapping() { + return mapping; + } + + public void setMapping(OutcomeMapping mapping) { + this.mapping = mapping; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Integer getValue() { + return value; + } + + public void setValue(Integer value) { + this.value = value; + } + + public User getCreateBy() { + return createBy; + } + + public void setCreateBy(User createBy) { + this.createBy = createBy; + } + + public Date getCreateDateTime() { + return createDateTime; + } + + public void setCreateDateTime(Date createDateTime) { + this.createDateTime = createDateTime; + } +} \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeScale.java =================================================================== diff -u -r846f7b4c76f01650ce4a2df946772bafc4228dcf -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeScale.java (.../OutcomeScale.java) (revision 846f7b4c76f01650ce4a2df946772bafc4228dcf) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeScale.java (.../OutcomeScale.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -1,5 +1,6 @@ package org.lamsfoundation.lams.outcome; +import java.io.Serializable; import java.util.Arrays; import java.util.Date; import java.util.LinkedHashSet; @@ -10,7 +11,9 @@ import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.User; -public class OutcomeScale { +public class OutcomeScale implements Serializable { + private static final long serialVersionUID = 216274187123917942L; + private Long scaleId; private Organisation organisation; private String name; Index: lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeScaleItem.java =================================================================== diff -u -rf6222f18a5fc2d8d13d7514afadef0fb204fb968 -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeScaleItem.java (.../OutcomeScaleItem.java) (revision f6222f18a5fc2d8d13d7514afadef0fb204fb968) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/OutcomeScaleItem.java (.../OutcomeScaleItem.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -1,6 +1,10 @@ package org.lamsfoundation.lams.outcome; -public class OutcomeScaleItem { +import java.io.Serializable; + +public class OutcomeScaleItem implements Serializable { + private static final long serialVersionUID = -4386671601427980092L; + private Long itemId; private OutcomeScale scale; private Integer value; Index: lams_common/src/java/org/lamsfoundation/lams/outcome/dao/IOutcomeDAO.java =================================================================== diff -u -r846f7b4c76f01650ce4a2df946772bafc4228dcf -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/src/java/org/lamsfoundation/lams/outcome/dao/IOutcomeDAO.java (.../IOutcomeDAO.java) (revision 846f7b4c76f01650ce4a2df946772bafc4228dcf) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/dao/IOutcomeDAO.java (.../IOutcomeDAO.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -23,15 +23,23 @@ package org.lamsfoundation.lams.outcome.dao; import java.util.List; +import java.util.Set; import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.outcome.Outcome; +import org.lamsfoundation.lams.outcome.OutcomeMapping; import org.lamsfoundation.lams.outcome.OutcomeScale; public interface IOutcomeDAO extends IBaseDAO { String getContentFolderID(Integer organisationId); List getOutcomesSortedByName(Integer organisationId); + List getOutcomesSortedByName(String search, Set organisationIds); + + List getOutcomeMappings(Long lessonId, Long toolContentId, Long itemId); + List getScalesSortedByName(Integer organisationId); + + List getAuthorOrganisations(Integer userId); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/outcome/dao/hibernate/OutcomeDAO.java =================================================================== diff -u -r846f7b4c76f01650ce4a2df946772bafc4228dcf -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/src/java/org/lamsfoundation/lams/outcome/dao/hibernate/OutcomeDAO.java (.../OutcomeDAO.java) (revision 846f7b4c76f01650ce4a2df946772bafc4228dcf) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/dao/hibernate/OutcomeDAO.java (.../OutcomeDAO.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -22,13 +22,19 @@ package org.lamsfoundation.lams.outcome.dao.hibernate; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.commons.lang.StringUtils; import org.hibernate.Query; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.outcome.Outcome; +import org.lamsfoundation.lams.outcome.OutcomeMapping; import org.lamsfoundation.lams.outcome.OutcomeScale; import org.lamsfoundation.lams.outcome.dao.IOutcomeDAO; +import org.lamsfoundation.lams.usermanagement.Role; import org.springframework.stereotype.Repository; @Repository @@ -37,15 +43,18 @@ private static final String FIND_CONTENT_FOLDER_ID_BY_ORGANISATION = "SELECT * FROM (SELECT content_folder_id FROM lams_outcome WHERE organisation_id ? " + "UNION SELECT content_folder_id FROM lams_outcome_scale WHERE organisation_id ?) AS a WHERE content_folder_id IS NOT NULL LIMIT 1"; - private static final String FIND_OUTCOMES_SORTED_BY_NAME = "FROM Outcome o WHERE o.organisation IS NULL ? ORDER BY o.name, o.code"; + private static final String FIND_OUTCOMES_SORTED_BY_NAME = "FROM Outcome o WHERE (o.organisation IS NULL ?) ORDER BY o.name, o.code"; - private static final String FIND_SCALES_SORTED_BY_NAME = "FROM OutcomeScale o WHERE o.organisation IS NULL ? ORDER BY o.name, o.code"; + private static final String FIND_AUTHOR_ORGANISATIONS = "SELECT uor.userOrganisation.organisation.organisationId FROM UserOrganisationRole uor " + + "WHERE uor.userOrganisation.user.userId = ? AND uor.role.roleId = " + Role.ROLE_AUTHOR; + private static final String FIND_SCALES_SORTED_BY_NAME = "FROM OutcomeScale o WHERE (o.organisation IS NULL ?) ORDER BY o.name, o.code"; + /** * Finds an existing content folder ID for the given organisation outcomes or scales, or for global ones */ public String getContentFolderID(Integer organisationId) { - String queryString = FIND_CONTENT_FOLDER_ID_BY_ORGANISATION.replaceAll("\\?", + String queryString = FIND_CONTENT_FOLDER_ID_BY_ORGANISATION.replace("?", organisationId == null ? "IS NULL" : "=" + organisationId); Query query = getSession().createSQLQuery(queryString); return (String) query.uniqueResult(); @@ -56,18 +65,60 @@ */ @SuppressWarnings("unchecked") public List getOutcomesSortedByName(Integer organisationId) { - String queryString = FIND_OUTCOMES_SORTED_BY_NAME.replaceAll("\\?", + String queryString = FIND_OUTCOMES_SORTED_BY_NAME.replace("?", organisationId == null ? "" : "OR o.organisation.organisationId = " + organisationId); return find(queryString); } + @SuppressWarnings("unchecked") + public List getOutcomesSortedByName(String search, Set organisationIds) { + String queryString = FIND_OUTCOMES_SORTED_BY_NAME; + if (organisationIds != null && !organisationIds.isEmpty()) { + queryString = queryString.replace("?", "OR o.organisation.organisationId IN (:organisationIds)) ? "); + } + if (StringUtils.isNotBlank(search)) { + queryString = queryString.replace("?", "AND (o.name LIKE :search OR o.code LIKE :search)"); + } + queryString = queryString.replace("?", ""); + + Query query = getSession().createQuery(queryString); + if (organisationIds != null && !organisationIds.isEmpty()) { + query.setParameterList("organisationIds", organisationIds); + } + if (StringUtils.isNotBlank(search)) { + query.setString("search", "%" + search + "%"); + } + + return query.list(); + } + + @SuppressWarnings("unchecked") + public List getOutcomeMappings(Long lessonId, Long toolContentId, Long itemId) { + Map properties = new HashMap(); + if (lessonId != null) { + properties.put("lessonId", lessonId); + } + if (toolContentId != null) { + properties.put("toolContentId", toolContentId); + } + if (itemId != null) { + properties.put("itemId", itemId); + } + return findByProperties(OutcomeMapping.class, properties); + } + /** * Finds all global scales and ones for the given organisation */ @SuppressWarnings("unchecked") public List getScalesSortedByName(Integer organisationId) { - String queryString = FIND_SCALES_SORTED_BY_NAME.replaceAll("\\?", + String queryString = FIND_SCALES_SORTED_BY_NAME.replace("?", organisationId == null ? "" : "OR o.organisation.organisationId = " + organisationId); return find(queryString); } + + @SuppressWarnings("unchecked") + public List getAuthorOrganisations(Integer userId) { + return find(FIND_AUTHOR_ORGANISATIONS, new Object[] { userId }); + } } Index: lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java =================================================================== diff -u -r846f7b4c76f01650ce4a2df946772bafc4228dcf -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java (.../IOutcomeService.java) (revision 846f7b4c76f01650ce4a2df946772bafc4228dcf) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java (.../IOutcomeService.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -1,14 +1,20 @@ package org.lamsfoundation.lams.outcome.service; import java.util.List; +import java.util.Set; import org.lamsfoundation.lams.outcome.Outcome; +import org.lamsfoundation.lams.outcome.OutcomeMapping; import org.lamsfoundation.lams.outcome.OutcomeScale; public interface IOutcomeService { String getContentFolderId(Integer organisationId); - List getOutcomesForManagement(Integer organisationId); + List getOutcomes(Integer organisationId); - List getScalesForManagement(Integer organisationId); + List getOutcomes(String search, Set organisationIds); + + List getOutcomeMappings(Long lessonId, Long toolContentId, Long itemId); + + List getScales(Integer organisationId); } Index: lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java =================================================================== diff -u -r846f7b4c76f01650ce4a2df946772bafc4228dcf -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java (.../OutcomeService.java) (revision 846f7b4c76f01650ce4a2df946772bafc4228dcf) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java (.../OutcomeService.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -1,11 +1,19 @@ package org.lamsfoundation.lams.outcome.service; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import javax.servlet.http.HttpSession; + import org.lamsfoundation.lams.outcome.Outcome; +import org.lamsfoundation.lams.outcome.OutcomeMapping; import org.lamsfoundation.lams.outcome.OutcomeScale; import org.lamsfoundation.lams.outcome.dao.IOutcomeDAO; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.FileUtil; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; public class OutcomeService implements IOutcomeService { private IOutcomeDAO outcomeDAO; @@ -15,15 +23,32 @@ return contentFolderId == null ? FileUtil.generateUniqueContentFolderID() : contentFolderId; } - public List getOutcomesForManagement(Integer organisationId) { + public List getOutcomes(Integer organisationId) { return outcomeDAO.getOutcomesSortedByName(organisationId); } - public List getScalesForManagement(Integer organisationId) { + public List getScales(Integer organisationId) { return outcomeDAO.getScalesSortedByName(organisationId); } + public List getOutcomes(String search, Set organisationIds) { + if (organisationIds == null) { + Integer userId = getUserDTO().getUserID(); + organisationIds = new HashSet(outcomeDAO.getAuthorOrganisations(userId)); + } + return outcomeDAO.getOutcomesSortedByName(search, organisationIds); + } + + public List getOutcomeMappings(Long lessonId, Long toolContentId, Long itemId) { + return outcomeDAO.getOutcomeMappings(lessonId, toolContentId, itemId); + } + public void setOutcomeDAO(IOutcomeDAO outcomeDAO) { this.outcomeDAO = outcomeDAO; } + + private UserDTO getUserDTO() { + HttpSession ss = SessionManager.getSession(); + return (UserDTO) ss.getAttribute(AttributeNames.USER); + } } \ No newline at end of file Index: lams_tool_nb/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r500ae45f4243aa718eac7436bc903b4f137a3aa7 -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_tool_nb/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 500ae45f4243aa718eac7436bc903b4f137a3aa7) +++ lams_tool_nb/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -61,6 +61,8 @@ advanced.comment.header =Comments options label.activity.completion =End of activity advanced.enable.anonymous.posts =Enable anonymous posts - - +advanced.outcome.title =Learning outcomes +advanced.outcome.input =Add outcomes by name or code +advanced.outcome.existing =Added outcomes +advanced.outcome.existing.none =none #======= End labels: Exported 54 labels for en AU ===== Index: lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/web/action/NbAuthoringAction.java =================================================================== diff -u -r983160690fed1d94b51c2ea9206c58093a29040d -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/web/action/NbAuthoringAction.java (.../NbAuthoringAction.java) (revision 983160690fed1d94b51c2ea9206c58093a29040d) +++ lams_tool_nb/src/java/org/lamsfoundation/lams/tool/noticeboard/web/action/NbAuthoringAction.java (.../NbAuthoringAction.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -155,6 +155,7 @@ } request.setAttribute(FORM, nbForm); + request.setAttribute("outcomes", null); return mapping.findForward(NoticeboardConstants.AUTHOR_PAGE); } Index: lams_tool_nb/web/WEB-INF/tags/OutcomeAuthor.tag =================================================================== diff -u --- lams_tool_nb/web/WEB-INF/tags/OutcomeAuthor.tag (revision 0) +++ lams_tool_nb/web/WEB-INF/tags/OutcomeAuthor.tag (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -0,0 +1,139 @@ +<% + /** + * Outcome.tag + * Author: Marcin Cieslak + * Description: Outcome selection in authoring + */ + %> +<%@ tag body-content="scriptless" %> +<%@ taglib uri="tags-core" prefix="c" %> +<%@ taglib uri="tags-fmt" prefix="fmt" %> +<%@ taglib uri="tags-html" prefix="html" %> +<%@ taglib uri="tags-lams" prefix="lams"%> +<%@ taglib uri="tags-function" prefix="fn" %> + + +<%-- Optional attributes. Must provide at either lessonId or toolContentId --%> +<%@ attribute name="lessonId" required="false" rtexprvalue="true" %> +<%@ attribute name="toolContentId" required="false" rtexprvalue="true" %> +<%@ attribute name="itemId" required="false" rtexprvalue="true" %> + +<%-- Support for multiple tags on one page --%> + + +<%-- ---------------------------------------%> + + + + +
+ : +
\ No newline at end of file Index: lams_tool_nb/web/WEB-INF/tlds/lams/lams.tld =================================================================== diff -u -r60d9a173d5590295376322fc3e857ae2dca37717 -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_tool_nb/web/WEB-INF/tlds/lams/lams.tld (.../lams.tld) (revision 60d9a173d5590295376322fc3e857ae2dca37717) +++ lams_tool_nb/web/WEB-INF/tlds/lams/lams.tld (.../lams.tld) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -524,6 +524,10 @@ LeaderDisplay /WEB-INF/tags/LeaderDisplay.tag + + + OutcomeAuthor + /WEB-INF/tags/OutcomeAuthor.tag textarea Index: lams_tool_nb/web/authoring/advance.jsp =================================================================== diff -u -r6b4aed17af30b7410d1b0938a69b95b05ef2495d -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b --- lams_tool_nb/web/authoring/advance.jsp (.../advance.jsp) (revision 6b4aed17af30b7410d1b0938a69b95b05ef2495d) +++ lams_tool_nb/web/authoring/advance.jsp (.../advance.jsp) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) @@ -4,6 +4,8 @@ + +