Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml =================================================================== diff -u -r73c1472c62db79b6ec21be7a5cba1d901f193013 -r3446506b8acd4257a342ac698bede2317c3fcdda --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml (.../mcApplicationContext.xml) (revision 73c1472c62db79b6ec21be7a5cba1d901f193013) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/mcApplicationContext.xml (.../mcApplicationContext.xml) (revision 3446506b8acd4257a342ac698bede2317c3fcdda) @@ -85,6 +85,8 @@ + + Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java =================================================================== diff -u -r7fd19e98ed4243d9308a3de32c66c765dc78b886 -r3446506b8acd4257a342ac698bede2317c3fcdda --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision 7fd19e98ed4243d9308a3de32c66c765dc78b886) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision 3446506b8acd4257a342ac698bede2317c3fcdda) @@ -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. @@ -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 -rd5ad6adb4fbe6e3ddc3a6cda5f73a74ec4cd4f26 -r3446506b8acd4257a342ac698bede2317c3fcdda --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java (.../McServicePOJO.java) (revision d5ad6adb4fbe6e3ddc3a6cda5f73a74ec4cd4f26) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java (.../McServicePOJO.java) (revision 3446506b8acd4257a342ac698bede2317c3fcdda) @@ -58,9 +58,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; @@ -71,6 +76,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; @@ -98,6 +104,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; @@ -133,6 +142,8 @@ private IAuditService auditService; private IUserManagementService userManagementService; + private ILessonService lessonService; + private IActivityDAO activityDAO; private ILearnerService learnerService; private ILamsToolService toolService; private IToolContentHandler mcToolContentHandler = null; @@ -166,7 +177,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()); @@ -926,7 +937,95 @@ } } + + @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 { @@ -1375,7 +1474,7 @@ long defaultToolContentId = getToolDefaultContentIdBySignature(McAppConstants.MY_SIGNATURE); content = getMcContent(defaultToolContentId); } - return getMcOutputFactory().getToolOutputDefinitions(content, definitionType); + return mcOutputFactory.getToolOutputDefinitions(content, definitionType); } @Override @@ -1569,27 +1668,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. */ @@ -1598,13 +1676,6 @@ } /** - * @return Returns the mcOptionsContentDAO. - */ - public IMcOptionsContentDAO getMcOptionsContentDAO() { - return mcOptionsContentDAO; - } - - /** * @param mcOptionsContentDAO * The mcOptionsContentDAO to set. */ @@ -1613,13 +1684,6 @@ } /** - * @return Returns the mcQueContentDAO. - */ - public IMcQueContentDAO getMcQueContentDAO() { - return mcQueContentDAO; - } - - /** * @param mcQueContentDAO * The mcQueContentDAO to set. */ @@ -1628,13 +1692,6 @@ } /** - * @return Returns the mcSessionDAO. - */ - public IMcSessionDAO getMcSessionDAO() { - return mcSessionDAO; - } - - /** * @param mcSessionDAO * The mcSessionDAO to set. */ @@ -1643,13 +1700,6 @@ } /** - * @return Returns the mcUserDAO. - */ - public IMcUserDAO getMcUserDAO() { - return mcUserDAO; - } - - /** * @param mcUserDAO * The mcUserDAO to set. */ @@ -1658,13 +1708,6 @@ } /** - * @return Returns the mcUsrAttemptDAO. - */ - public IMcUsrAttemptDAO getMcUsrAttemptDAO() { - return mcUsrAttemptDAO; - } - - /** * @param mcUsrAttemptDAO * The mcUsrAttemptDAO to set. */ @@ -1675,19 +1718,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. */ @@ -1696,24 +1740,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; } @@ -1722,10 +1755,6 @@ this.gradebookService = gradebookService; } - public MCOutputFactory getMcOutputFactory() { - return mcOutputFactory; - } - public void setMcOutputFactory(MCOutputFactory mcOutputFactory) { this.mcOutputFactory = mcOutputFactory; } @@ -1977,7 +2006,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 3446506b8acd4257a342ac698bede2317c3fcdda) @@ -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 -r5e39743e8bd500d0e121cf4c95b9c9fc77eb80fc -r3446506b8acd4257a342ac698bede2317c3fcdda --- lams_tool_lamc/web/WEB-INF/web.xml (.../web.xml) (revision 5e39743e8bd500d0e121cf4c95b9c9fc77eb80fc) +++ lams_tool_lamc/web/WEB-INF/web.xml (.../web.xml) (revision 3446506b8acd4257a342ac698bede2317c3fcdda) @@ -123,6 +123,11 @@ exportPortfolio org.lamsfoundation.lams.tool.mc.web.ExportServlet + + + populateMarks + org.lamsfoundation.lams.tool.mc.web.PopulateMarksServlet + @@ -153,6 +158,11 @@ exportPortfolio /exportPortfolio/* + + + populateMarks + /populateMarks + Connector