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