Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml
===================================================================
diff -u -rb298c498f26d7e881bc2a2064d62988c51be3b1a -r822c99a38640cc4b77403c28a5fbff8e431e3fd6
--- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml (.../gradebookApplicationContext.xml) (revision b298c498f26d7e881bc2a2064d62988c51be3b1a)
+++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml (.../gradebookApplicationContext.xml) (revision 822c99a38640cc4b77403c28a5fbff8e431e3fd6)
@@ -16,6 +16,7 @@
+
Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java
===================================================================
diff -u -rd0b6f213cba1026b0c9fdbdaa5dd44a49eddd3aa -r822c99a38640cc4b77403c28a5fbff8e431e3fd6
--- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision d0b6f213cba1026b0c9fdbdaa5dd44a49eddd3aa)
+++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 822c99a38640cc4b77403c28a5fbff8e431e3fd6)
@@ -66,6 +66,7 @@
import org.lamsfoundation.lams.lesson.LearnerProgress;
import org.lamsfoundation.lams.lesson.Lesson;
import org.lamsfoundation.lams.lesson.dao.ILearnerProgressDAO;
+import org.lamsfoundation.lams.lesson.dao.ILessonDAO;
import org.lamsfoundation.lams.lesson.service.ILessonService;
import org.lamsfoundation.lams.tool.ToolOutput;
import org.lamsfoundation.lams.tool.ToolOutputValue;
@@ -105,6 +106,7 @@
private ILamsCoreToolService toolService;
private IGradebookDAO gradebookDAO;
private ILearnerProgressDAO learnerProgressDAO;
+ private ILessonDAO lessonDAO;
private ILessonService lessonService;
private IUserManagementService userService;
private IBaseDAO baseDAO;
@@ -438,7 +440,54 @@
auditService.log(monitorUser, GradebookConstants.MODULE_NAME, message);
}
}
+
+ @Override
+ public void updateUserMarksForActivity(Activity activity) {
+ Long activityId = activity.getActivityId();
+ Lesson lesson = lessonDAO.getLessonForActivity(activityId);
+ if ((lesson == null) || (activity == null) || !(activity instanceof ToolActivity)
+ || (((ToolActivity) activity).getActivityEvaluations() == null)
+ || ((ToolActivity) activity).getActivityEvaluations().isEmpty()) {
+ return;
+ }
+ ToolActivity toolActivity = (ToolActivity) activity;
+
+ // Getting the first activity evaluation
+ ActivityEvaluation eval = toolActivity.getActivityEvaluations().iterator().next();
+ String toolOutputDefinition = eval.getToolOutputDefinition();
+
+ Map userToGradebookUserActivityMap = getUserToGradebookUserActivityMap(activity,
+ null);
+ Map userToGradebookUserLessonMap = getUserToGradebookUserLessonMap(lesson, null);
+ List toolOutputs = toolService.getOutputsFromTool(toolOutputDefinition, toolActivity);
+
+ //update for all users in activity
+ List users = learnerProgressDAO.getLearnersCompletedActivity(activity);
+ for (User user : users) {
+ //find according toolOutput
+ ToolOutput toolOutput = null;
+ for (ToolOutput toolOutputIter : toolOutputs) {
+ if (toolOutputIter.getUserId().equals(user.getUserId())) {
+ toolOutput = toolOutputIter;
+ }
+ }
+
+ //in case of toolOutput == null (which means no results in the tool but user nonetheless has finished activity), assign 0 as a result
+ Double outputDouble = (toolOutput == null || toolOutput.getValue() == null) ? null
+ : toolOutput.getValue().getDouble();
+
+ GradebookUserActivity gradebookUserActivity = userToGradebookUserActivityMap.get(user.getUserId());
+ GradebookUserLesson gradebookUserLesson = userToGradebookUserLessonMap.get(user.getUserId());
+
+ // Only set the mark if it hasnt previously been set by a teacher
+ if ((gradebookUserActivity == null) || !gradebookUserActivity.getMarkedInGradebook()) {
+ updateUserActivityGradebookMark(lesson, user, toolActivity, outputDouble, false, false,
+ gradebookUserActivity, gradebookUserLesson);
+ }
+ }
+ }
+
@Override
public void updateUserActivityGradebookMark(Lesson lesson, Activity activity, User learner) {
ToolSession toolSession = toolService.getToolSessionByLearner(learner, activity);
@@ -482,41 +531,55 @@
@Override
public void updateUserActivityGradebookMark(Lesson lesson, User learner, Activity activity, Double mark,
Boolean markedInGradebook, boolean isAuditLogRequired) {
+
+ GradebookUserActivity gradebookUserActivity = gradebookDAO
+ .getGradebookUserDataForActivity(activity.getActivityId(), learner.getUserId());
+
+ GradebookUserLesson gradebookUserLesson = gradebookDAO.getGradebookUserDataForLesson(lesson.getLessonId(),
+ learner.getUserId());
+
+ updateUserActivityGradebookMark(lesson, learner, activity, mark, markedInGradebook, isAuditLogRequired,
+ gradebookUserActivity, gradebookUserLesson);
+ }
+
+ /**
+ * It's the same method as above, it only also accepts gradebookUserActivity and gradebookUserLesson as parameters.
+ */
+ private void updateUserActivityGradebookMark(Lesson lesson, User learner, Activity activity, Double mark,
+ Boolean markedInGradebook, boolean isAuditLogRequired, GradebookUserActivity gradebookUserActivity,
+ GradebookUserLesson gradebookUserLesson) {
if ((lesson != null) && (activity != null) && (learner != null) && activity.isToolActivity()) {
// First, update the mark for the activity
- GradebookUserActivity gradebookUserActivity = gradebookDAO
- .getGradebookUserDataForActivity(activity.getActivityId(), learner.getUserId());
-
if (gradebookUserActivity == null) {
gradebookUserActivity = new GradebookUserActivity((ToolActivity) activity, learner);
}
String oldMark = (gradebookUserActivity.getMark() == null) ? "-"
: gradebookUserActivity.getMark().toString();
+ Double oldActivityMark = gradebookUserActivity.getMark();
gradebookUserActivity.setMark(mark);
gradebookUserActivity.setUpdateDate(new Date());
gradebookUserActivity.setMarkedInGradebook(markedInGradebook);
gradebookDAO.insertOrUpdate(gradebookUserActivity);
// Now update the lesson mark
- GradebookUserLesson gradebookUserLesson = gradebookDAO.getGradebookUserDataForLesson(lesson.getLessonId(),
- learner.getUserId());
if (gradebookUserLesson == null) {
gradebookUserLesson = new GradebookUserLesson();
gradebookUserLesson.setLearner(learner);
gradebookUserLesson.setLesson(lesson);
}
- aggregateTotalMarkForLesson(gradebookUserLesson);
+ aggregateTotalMarkForLesson(gradebookUserLesson, mark, oldActivityMark);
// audit log changed gradebook mark
if (isAuditLogRequired) {
UserDTO monitorUser = (UserDTO) SessionManager.getSession().getAttribute(AttributeNames.USER);
+ String markStr = mark == null ? "" : mark.toString();
String[] args = new String[] { learner.getLogin() + "(" + learner.getUserId() + ")",
activity.getActivityId().toString(), lesson.getLessonId().toString(), oldMark.toString(),
- mark.toString() };
+ markStr };
String message = messageService.getMessage("audit.activity.change.mark", args);
auditService.log(monitorUser, GradebookConstants.MODULE_NAME, message);
}
@@ -1354,9 +1417,17 @@
*
* @param gradebookUserLesson
*/
- private void aggregateTotalMarkForLesson(GradebookUserLesson gradebookUserLesson) {
- Double totalMark = gradebookDAO.getGradebookUserActivityMarkSum(gradebookUserLesson.getLesson().getLessonId(),
- gradebookUserLesson.getLearner().getUserId());
+ private void aggregateTotalMarkForLesson(GradebookUserLesson gradebookUserLesson, Double newActivityMark, Double oldActivityMark) {
+ newActivityMark = newActivityMark == null ? 0 : newActivityMark;
+
+ Double totalMark;
+ if (oldActivityMark == null || gradebookUserLesson.getMark() == null) {
+ totalMark = gradebookDAO.getGradebookUserActivityMarkSum(gradebookUserLesson.getLesson().getLessonId(),
+ gradebookUserLesson.getLearner().getUserId());
+ } else {
+ totalMark = gradebookUserLesson.getMark() - oldActivityMark + newActivityMark;
+ }
+
gradebookUserLesson.setMark(totalMark);
gradebookDAO.insertOrUpdate(gradebookUserLesson);
}
@@ -1684,6 +1755,10 @@
this.learnerProgressDAO = learnerProgressDAO;
}
+ public void setLessonDAO(ILessonDAO lessonDAO) {
+ this.lessonDAO = lessonDAO;
+ }
+
public ILessonService getLessonService() {
return lessonService;
}
Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java
===================================================================
diff -u -rd0b6f213cba1026b0c9fdbdaa5dd44a49eddd3aa -r822c99a38640cc4b77403c28a5fbff8e431e3fd6
--- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision d0b6f213cba1026b0c9fdbdaa5dd44a49eddd3aa)
+++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision 822c99a38640cc4b77403c28a5fbff8e431e3fd6)
@@ -117,6 +117,13 @@
String sortOrder, String searchString);
int getCountUsersByOrganisation(Integer orgId, String searchString);
+
+ /**
+ * Updates all user marks in specified activity. It recalculates all UserActivityGradebooks and UserLessonGradebooks.
+ *
+ * @param activity
+ */
+ void updateUserMarksForActivity(Activity activity);
/**
* Updates a user's lesson mark, this will make it desynchronised with the aggregated marks from the activities
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java
===================================================================
diff -u -r26ea61eae29934bddf4595c3c1aededeeeaca933 -r822c99a38640cc4b77403c28a5fbff8e431e3fd6
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 26ea61eae29934bddf4595c3c1aededeeeaca933)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 822c99a38640cc4b77403c28a5fbff8e431e3fd6)
@@ -25,6 +25,7 @@
import java.util.List;
+import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult;
public interface AssessmentResultDAO extends DAO {
@@ -40,12 +41,20 @@
AssessmentResult getLastFinishedAssessmentResult(Long assessmentUid, Long userId);
Float getLastTotalScoreByUser(Long assessmentUid, Long userId);
+
+ List getLastTotalScoresByContentId(Long assessmentUid);
Float getBestTotalScoreByUser(Long sessionId, Long userId);
+
+ List getBestTotalScoresByContentId(Long assessmentUid);
Float getFirstTotalScoreByUser(Long sessionId, Long userId);
+
+ List getFirstTotalScoresByContentId(Long assessmentUid);
Float getAvergeTotalScoreByUser(Long sessionId, Long userId);
+
+ List getAverageTotalScoresByContentId(Long assessmentUid);
Integer getLastFinishedAssessmentResultTimeTaken(Long assessmentUid, Long userId);
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java
===================================================================
diff -u -r26ea61eae29934bddf4595c3c1aededeeeaca933 -r822c99a38640cc4b77403c28a5fbff8e431e3fd6
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 26ea61eae29934bddf4595c3c1aededeeeaca933)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 822c99a38640cc4b77403c28a5fbff8e431e3fd6)
@@ -23,9 +23,11 @@
package org.lamsfoundation.lams.tool.assessment.dao.hibernate;
+import java.util.ArrayList;
import java.util.List;
import org.lamsfoundation.lams.tool.assessment.dao.AssessmentResultDAO;
+import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult;
public class AssessmentResultDAOHibernate extends BaseDAOHibernate implements AssessmentResultDAO {
@@ -55,21 +57,37 @@
+ AssessmentResult.class.getName()
+ " AS r WHERE r.user.userId=? AND r.assessment.uid=? AND (r.finishDate != null)";
- private static final String FIND_LAST_ASSESSMENT_RESULT_GRADE = "select r.grade FROM "
+ private static final String LAST_ASSESSMENT_RESULT_GRADE = "select r.grade FROM "
+ AssessmentResult.class.getName()
+ " AS r WHERE r.user.userId=? AND r.assessment.uid=? AND (r.finishDate != null) AND r.latest=1";
+
+ private static final String LAST_ASSESSMENT_RESULT_GRADES_BY_CONTENT_ID = "select r.user.userId, r.grade FROM "
+ + AssessmentResult.class.getName()
+ + " AS r WHERE r.assessment.contentId=? AND (r.finishDate != null) AND r.latest=1";
private static final String BEST_SCORE_BY_SESSION_AND_USER = "SELECT MAX(r.grade) FROM "
+ AssessmentResult.class.getName()
- + " AS r WHERE r.user.userId = ? AND r.sessionId=? AND (r.finishDate != null) ORDER BY r.startDate ASC";
+ + " AS r WHERE r.user.userId = ? AND r.sessionId=? AND (r.finishDate != null)";
+
+ private static final String BEST_SCORES_BY_CONTENT_ID = "SELECT r.user.userId, MAX(r.grade) FROM "
+ + AssessmentResult.class.getName()
+ + " AS r WHERE r.assessment.contentId=? AND (r.finishDate != null) GROUP BY r.user.userId";
private static final String FIRST_SCORE_BY_SESSION_AND_USER = "SELECT r.grade FROM "
+ AssessmentResult.class.getName()
+ " AS r WHERE r.user.userId = ? AND r.sessionId=? AND (r.finishDate != null) ORDER BY r.startDate ASC LIMIT 1";
+
+ private static final String FIRST_SCORES_BY_CONTENT_ID = "SELECT r.user.userId, r.grade FROM "
+ + AssessmentResult.class.getName()
+ + " AS r WHERE r.assessment.contentId=? AND (r.finishDate != null) GROUP BY r.user.userId ORDER BY r.startDate ASC LIMIT 1";
private static final String AVERAGE_SCORE_BY_SESSION_AND_USER = "SELECT AVG(r.grade) FROM "
+ AssessmentResult.class.getName()
- + " AS r WHERE r.user.userId = ? AND r.sessionId=? AND (r.finishDate != null) ORDER BY r.startDate ASC";
+ + " AS r WHERE r.user.userId = ? AND r.sessionId=? AND (r.finishDate != null)";
+
+ private static final String AVERAGE_SCORES_BY_CONTENT_ID = "SELECT r.user.userId, AVG(r.grade) FROM "
+ + AssessmentResult.class.getName()
+ + " AS r WHERE r.assessment.contentId=? AND (r.finishDate != null) GROUP BY r.user.userId";
private static final String FIND_LAST_ASSESSMENT_RESULT_TIME_TAKEN = "select UNIX_TIMESTAMP(r.finishDate) - UNIX_TIMESTAMP(r.startDate) FROM "
+ AssessmentResult.class.getName()
@@ -119,14 +137,21 @@
@Override
public Float getLastTotalScoreByUser(Long assessmentUid, Long userId) {
- List list = getHibernateTemplate().find(AssessmentResultDAOHibernate.FIND_LAST_ASSESSMENT_RESULT_GRADE,
+ List list = getHibernateTemplate().find(AssessmentResultDAOHibernate.LAST_ASSESSMENT_RESULT_GRADE,
new Object[] { userId, assessmentUid });
if ((list == null) || (list.size() == 0)) {
return null;
} else {
return ((Float) list.get(0));
}
}
+
+ @Override
+ public List getLastTotalScoresByContentId(Long toolContentId) {
+ List