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