Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml =================================================================== diff -u -ra6641bf9262a01d07740a517643f8fe187ec5b1f -r9e03de2ca9f74e42402a76b8d45e0a13b637d9de --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml (.../mcApplicationContext.xml) (revision a6641bf9262a01d07740a517643f8fe187ec5b1f) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml (.../mcApplicationContext.xml) (revision 9e03de2ca9f74e42402a76b8d45e0a13b637d9de) @@ -87,6 +87,8 @@ + + Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java =================================================================== diff -u -r5e63656a12c02f7476564e278b43ff4ce86ac930 -r9e03de2ca9f74e42402a76b8d45e0a13b637d9de --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision 5e63656a12c02f7476564e278b43ff4ce86ac930) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision 9e03de2ca9f74e42402a76b8d45e0a13b637d9de) @@ -44,6 +44,7 @@ import org.lamsfoundation.lams.tool.mc.pojos.McQueUsr; import org.lamsfoundation.lams.tool.mc.pojos.McSession; import org.lamsfoundation.lams.tool.mc.pojos.McUsrAttempt; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; /** * Interface that defines the contract that all MCQ service provider must follow. @@ -182,7 +183,7 @@ List buildLearnerAnswersDTOList(McContent mcContent, McQueUsr user); /** - * Returns userMarksDtos grouped by sessions. + * Returns userMarksDtos grouped by sessions. Used *only* for export portfolio. * * @param mcContent * @param isFullAttemptDetailsRequired @@ -207,7 +208,16 @@ List deletedQuestions); /** + * Recalculate mark for leader and sets it to all members of a group. Authentication check: user must be either + * lesson stuff or group manager. * + * @param requestUserDTO + * @param lessonId + */ + void recalculateMarkForLesson(UserDTO requestUserDTO, Long lessonId); + + /** + * * returns reflection data for all sessions * * @param mcContent Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java =================================================================== diff -u -r8be2bc782a2c7066c8c33f5605962584df7a2f9b -r9e03de2ca9f74e42402a76b8d45e0a13b637d9de --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java (.../McServicePOJO.java) (revision 8be2bc782a2c7066c8c33f5605962584df7a2f9b) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java (.../McServicePOJO.java) (revision 9e03de2ca9f74e42402a76b8d45e0a13b637d9de) @@ -56,9 +56,14 @@ import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; import org.lamsfoundation.lams.gradebook.service.IGradebookService; import org.lamsfoundation.lams.learning.service.ILearnerService; +import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService; import org.lamsfoundation.lams.learningdesign.service.ImportToolContentException; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; @@ -68,6 +73,7 @@ import org.lamsfoundation.lams.tool.ToolContentManager; import org.lamsfoundation.lams.tool.ToolOutput; import org.lamsfoundation.lams.tool.ToolOutputDefinition; +import org.lamsfoundation.lams.tool.ToolSession; import org.lamsfoundation.lams.tool.ToolSessionExportOutputData; import org.lamsfoundation.lams.tool.ToolSessionManager; import org.lamsfoundation.lams.tool.exception.DataMissingException; @@ -95,6 +101,9 @@ import org.lamsfoundation.lams.tool.mc.pojos.McUsrAttempt; import org.lamsfoundation.lams.tool.mc.util.McSessionComparator; import org.lamsfoundation.lams.tool.service.ILamsToolService; +import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.OrganisationType; +import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; @@ -127,6 +136,8 @@ private IAuditService auditService; private IUserManagementService userManagementService; + private ILessonService lessonService; + private IActivityDAO activityDAO; private ILearnerService learnerService; private ILamsToolService toolService; private IToolContentHandler mcToolContentHandler = null; @@ -160,7 +171,7 @@ // create new user in a DB if (leader == null) { McServicePOJO.logger.debug("creating new user with userId: " + leaderUserId); - User leaderDto = (User) getUserManagementService().findById(User.class, leaderUserId.intValue()); + User leaderDto = (User) userManagementService.findById(User.class, leaderUserId.intValue()); String userName = leaderDto.getLogin(); String fullName = leaderDto.getFirstName() + " " + leaderDto.getLastName(); leader = new McQueUsr(leaderUserId, userName, fullName, mcSession, new TreeSet()); @@ -196,7 +207,7 @@ leaderAttempt.isAttemptCorrect()); mcUsrAttemptDAO.saveMcUsrAttempt(userAttempt); - // if it's been changed by the leader + // if it's been changed by the leader } else if (leaderAttempt.getAttemptTime().compareTo(userAttempt.getAttemptTime()) != 0) { userAttempt.setMcOptionsContent(leaderAttempt.getMcOptionsContent()); userAttempt.setAttemptTime(leaderAttempt.getAttemptTime()); @@ -516,7 +527,7 @@ learnerAnswersDTOList.add(learnerAnswersDTO); } - //populate answers + // populate answers if (user != null) { for (McLearnerAnswersDTO learnerAnswersDTO : learnerAnswersDTOList) { @@ -526,7 +537,7 @@ if (dbAttempt != null) { Long selectedOptionUid = dbAttempt.getMcOptionsContent().getUid(); - //mark selected option as selected + // mark selected option as selected for (McOptsContent option : learnerAnswersDTO.getOptions()) { if (selectedOptionUid.equals(option.getUid())) { option.setSelected(true); @@ -795,9 +806,9 @@ public void recalculateUserAnswers(McContent content, Set oldQuestions, List questionDTOs, List deletedQuestions) { - //create list of modified questions + // create list of modified questions List modifiedQuestions = new ArrayList(); - //create list of modified question marks + // create list of modified question marks List modifiedQuestionsMarksOnly = new ArrayList(); for (McQueContent oldQuestion : oldQuestions) { for (McQuestionDTO questionDTO : questionDTOs) { @@ -806,17 +817,17 @@ boolean isQuestionModified = false; boolean isQuestionMarkModified = false; - //question is different + // question is different if (!oldQuestion.getQuestion().equals(questionDTO.getQuestion())) { isQuestionModified = true; } - //mark is different + // mark is different if (oldQuestion.getMark().intValue() != (new Integer(questionDTO.getMark())).intValue()) { isQuestionMarkModified = true; } - //options are different + // options are different Set oldOptions = oldQuestion.getMcOptionsContents(); List optionDTOs = questionDTO.getListCandidateAnswersDTO(); for (McOptsContent oldOption : oldOptions) { @@ -851,7 +862,7 @@ final int oldTotalMark = mcUsrAttemptDAO.getUserTotalMark(user.getUid()); int newTotalMark = oldTotalMark; - //get all finished user results + // get all finished user results List userAttempts = getFinalizedUserAttempts(user); Iterator iter = userAttempts.iterator(); while (iter.hasNext()) { @@ -922,6 +933,94 @@ } @Override + public void recalculateMarkForLesson(UserDTO requestUserDTO, Long lessonId) { + + User requestUser = userManagementService.getUserByLogin(requestUserDTO.getLogin()); + Lesson lesson = lessonService.getLesson(lessonId); + Organisation organisation = lesson.getOrganisation(); + + // skip doing anything if the user doesn't have permission + Integer organisationToCheckPermission = (organisation.getOrganisationType().getOrganisationTypeId() + .equals(OrganisationType.COURSE_TYPE)) ? organisation.getOrganisationId() + : organisation.getParentOrganisation().getOrganisationId(); + boolean isGroupManager = userManagementService.isUserInRole(requestUser.getUserId(), organisationToCheckPermission, + Role.GROUP_MANAGER); + if (!(lesson.getLessonClass().isStaffMember(requestUser) || isGroupManager)) { + return; + } + + // get all lesson activities + Set lessonActivities = new TreeSet(); + /* + * Hibernate CGLIB is failing to load the first activity in the sequence as a ToolActivity for some mysterious + * reason Causes a ClassCastException when you try to cast it, even if it is a ToolActivity. + * + * THIS IS A HACK to retrieve the first tool activity manually so it can be cast as a ToolActivity - if it is + * one + */ + Activity firstActivity = activityDAO + .getActivityByActivityId(lesson.getLearningDesign().getFirstActivity().getActivityId()); + lessonActivities.add(firstActivity); + lessonActivities.addAll(lesson.getLearningDesign().getActivities()); + + // iterate through all assessment activities in the lesson + for (Activity activity : lessonActivities) { + + // check if it's assessment activity + if ((activity instanceof ToolActivity) && ((ToolActivity) activity).getTool().getToolSignature() + .equals(McAppConstants.MY_SIGNATURE)) { + ToolActivity mcqActivity = (ToolActivity) activity; + + for (ToolSession toolSession : (Set) mcqActivity.getToolSessions()) { + Long toolSessionId = toolSession.getToolSessionId(); + McSession mcSession = getMcSessionById(toolSessionId); + McContent mcContent = mcSession.getMcContent(); + + if (mcContent.isUseSelectLeaderToolOuput()) { + + McQueUsr leader = mcSession.getGroupLeader(); + //if there is no leader yet or leader hasn't submitted any attempts - no point in updating gradebook marks + if (leader == null || (leader.getNumberOfAttempts() == 0)) { + continue; + } + + final Double leaderMark = new Double(leader.getLastAttemptTotalMark()); + + // update marks for all learners in a group + Set users = mcSession.getMcQueUsers(); + for (McQueUsr user : users) { + copyAnswersFromLeader(user, leader); + + // propagade total mark to Gradebook + gradebookService.updateActivityMark(leaderMark, null, user.getQueUsrId().intValue(), toolSessionId, + false); + } + } else { + + // update marks for all learners in a group + Set users = mcSession.getMcQueUsers(); + for (McQueUsr user : users) { + + // if leader hasn't submitted any attempts - no point in updating gradebook marks + if (user.getNumberOfAttempts() == 0) { + continue; + } + + final Double userMark = new Double(user.getLastAttemptTotalMark()); + + // propagade total mark to Gradebook + gradebookService.updateActivityMark(userMark, null, user.getQueUsrId().intValue(), toolSessionId, + false); + } + } + + } + } + } + + } + + @Override public byte[] prepareSessionDataSpreadsheet(McContent mcContent) throws IOException { Set questions = mcContent.getMcQueContents(); @@ -1091,7 +1190,7 @@ rowCount++; } - //ave + // ave row = sheet.createRow(rowCount++); count = 1; cell = row.createCell(count++); @@ -1101,7 +1200,7 @@ cell.setCellValue(((numberOfCorrectAnswers * 100) / totalPercentList.size()) + "%"); } - //class mean + // class mean Integer[] totalPercents = totalPercentList.toArray(new Integer[0]); Arrays.sort(totalPercents); int sum = 0; @@ -1369,7 +1468,7 @@ long defaultToolContentId = getToolDefaultContentIdBySignature(McAppConstants.MY_SIGNATURE); content = getMcContent(defaultToolContentId); } - return getMcOutputFactory().getToolOutputDefinitions(content, definitionType); + return mcOutputFactory.getToolOutputDefinitions(content, definitionType); } @Override @@ -1417,7 +1516,7 @@ McContent mcContent = mcContentDAO.findMcContentById(toolContentId); - //create a new a new tool session if it does not already exist in the tool session table + // create a new a new tool session if it does not already exist in the tool session table if (!existsSession(toolSessionId)) { try { McSession mcSession = new McSession(toolSessionId, new Date(System.currentTimeMillis()), @@ -1575,27 +1674,6 @@ } /** - * @return Returns the toolService. - */ - public ILamsToolService getToolService() { - return toolService; - } - - /** - * @return Returns the userManagementService. - */ - public IUserManagementService getUserManagementService() { - return userManagementService; - } - - /** - * @return Returns the mcContentDAO. - */ - public IMcContentDAO getMcContentDAO() { - return mcContentDAO; - } - - /** * @param mcContentDAO * The mcContentDAO to set. */ @@ -1604,13 +1682,6 @@ } /** - * @return Returns the mcOptionsContentDAO. - */ - public IMcOptionsContentDAO getMcOptionsContentDAO() { - return mcOptionsContentDAO; - } - - /** * @param mcOptionsContentDAO * The mcOptionsContentDAO to set. */ @@ -1619,13 +1690,6 @@ } /** - * @return Returns the mcQueContentDAO. - */ - public IMcQueContentDAO getMcQueContentDAO() { - return mcQueContentDAO; - } - - /** * @param mcQueContentDAO * The mcQueContentDAO to set. */ @@ -1634,13 +1698,6 @@ } /** - * @return Returns the mcSessionDAO. - */ - public IMcSessionDAO getMcSessionDAO() { - return mcSessionDAO; - } - - /** * @param mcSessionDAO * The mcSessionDAO to set. */ @@ -1649,13 +1706,6 @@ } /** - * @return Returns the mcUserDAO. - */ - public IMcUserDAO getMcUserDAO() { - return mcUserDAO; - } - - /** * @param mcUserDAO * The mcUserDAO to set. */ @@ -1664,13 +1714,6 @@ } /** - * @return Returns the mcUsrAttemptDAO. - */ - public IMcUsrAttemptDAO getMcUsrAttemptDAO() { - return mcUsrAttemptDAO; - } - - /** * @param mcUsrAttemptDAO * The mcUsrAttemptDAO to set. */ @@ -1681,19 +1724,20 @@ public void setUserManagementService(IUserManagementService userManagementService) { this.userManagementService = userManagementService; } + + public void setLessonService(ILessonService lessonService) { + this.lessonService = lessonService; + } + public void setActivityDAO(IActivityDAO activityDAO) { + this.activityDAO = activityDAO; + } + public void setToolService(ILamsToolService toolService) { this.toolService = toolService; } /** - * @return Returns the mcToolContentHandler. - */ - public IToolContentHandler getMcToolContentHandler() { - return mcToolContentHandler; - } - - /** * @param mcToolContentHandler * The mcToolContentHandler to set. */ @@ -1702,24 +1746,13 @@ } /** - * @return Returns the learnerService. - */ - public ILearnerService getLearnerService() { - return learnerService; - } - - /** * @param learnerService * The learnerService to set. */ public void setLearnerService(ILearnerService learnerService) { this.learnerService = learnerService; } - public IExportToolContentService getExportContentService() { - return exportContentService; - } - public void setExportContentService(IExportToolContentService exportContentService) { this.exportContentService = exportContentService; } @@ -1728,10 +1761,6 @@ this.gradebookService = gradebookService; } - public MCOutputFactory getMcOutputFactory() { - return mcOutputFactory; - } - public void setMcOutputFactory(MCOutputFactory mcOutputFactory) { this.mcOutputFactory = mcOutputFactory; } @@ -1858,7 +1887,7 @@ @Override public Class[] getSupportedToolOutputDefinitionClasses(int definitionType) { - return getMcOutputFactory().getSupportedDefinitionClasses(definitionType); + return mcOutputFactory.getSupportedDefinitionClasses(definitionType); } // ****************** REST methods ************************* Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/PopulateMarksServlet.java =================================================================== diff -u --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/PopulateMarksServlet.java (revision 0) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/PopulateMarksServlet.java (revision 9e03de2ca9f74e42402a76b8d45e0a13b637d9de) @@ -0,0 +1,53 @@ +package org.lamsfoundation.lams.tool.mc.web; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.tool.mc.service.IMcService; +import org.lamsfoundation.lams.tool.mc.service.McServiceProxy; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; + +public class PopulateMarksServlet extends HttpServlet { + + private static final long serialVersionUID = 121580330937986546L; + private static Logger log = Logger.getLogger(PopulateMarksServlet.class); + + private IMcService service; + + @Override + public void init() throws ServletException { + service = McServiceProxy.getMcService(getServletContext()); + super.init(); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + PrintWriter out = response.getWriter(); + Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + + HttpSession ss = SessionManager.getSession(); + UserDTO userDTO = (UserDTO) ss.getAttribute(AttributeNames.USER); + + service.recalculateMarkForLesson(userDTO, lessonId); + log.debug("recalculateMarkForLesson lessonId:" + lessonId); + out.println("recalculateMarkForLesson uid:" + lessonId); + + out.println("OK. User marks have been updated."); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { + doGet(request, response); + } + +} Index: lams_tool_lamc/web/WEB-INF/web.xml =================================================================== diff -u -r5e63656a12c02f7476564e278b43ff4ce86ac930 -r9e03de2ca9f74e42402a76b8d45e0a13b637d9de --- lams_tool_lamc/web/WEB-INF/web.xml (.../web.xml) (revision 5e63656a12c02f7476564e278b43ff4ce86ac930) +++ lams_tool_lamc/web/WEB-INF/web.xml (.../web.xml) (revision 9e03de2ca9f74e42402a76b8d45e0a13b637d9de) @@ -110,6 +110,11 @@ 3 + + + populateMarks + org.lamsfoundation.lams.tool.mc.web.PopulateMarksServlet + @@ -136,8 +141,12 @@ download /download/* + + + populateMarks + /populateMarks + - Connector /ckeditor/filemanager/browser/default/connectors/jsp/connector