Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -rbfc093eb87907e66a284fd1c30cf0f212122f706 -raf839eeb85f37cf68092401ad23a4613ca7cd001 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java =================================================================== diff -u -r87806866f673458de317c4d1c6656b3bf5a81039 -raf839eeb85f37cf68092401ad23a4613ca7cd001 --- lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java (.../IGradebookDAO.java) (revision 87806866f673458de317c4d1c6656b3bf5a81039) +++ lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java (.../IGradebookDAO.java) (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -20,14 +20,15 @@ * **************************************************************** */ - package org.lamsfoundation.lams.gradebook.dao; import java.util.List; import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.gradebook.GradebookUserActivity; +import org.lamsfoundation.lams.gradebook.GradebookUserActivityArchive; import org.lamsfoundation.lams.gradebook.GradebookUserLesson; +import org.lamsfoundation.lams.gradebook.GradebookUserLessonArchive; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.User; @@ -40,7 +41,7 @@ GradebookUserActivity getGradebookUserDataForActivity(Long activityID, Integer userID); List getGradebookUserActivitiesForLesson(Long lessonID, Integer userID); - + // Double getGradebookUserActivityMarkSum(Long lessonID, Integer userID); List getAllGradebookUserActivitiesForActivity(Long activityID); @@ -60,7 +61,7 @@ long getMedianTimeTakenLesson(Long lessonID); long getMedianTimeTakenForActivity(Long activityID); - + long getMinTimeTakenForActivity(Long activityID); long getMaxTimeTakenForActivity(Long activityID); @@ -70,12 +71,11 @@ Double getAverageMarkForGroupedActivity(Long activityID, Long groupID); long getMedianTimeTakenForGroupedActivity(Long activityID, Long groupID); - + long getMinTimeTakenForGroupedActivity(Long activityID, Long groupID); - + long getMaxTimeTakenForGroupedActivity(Long activityID, Long groupID); - List getLessonsByGroupAndUser(final Integer userId, final Integer orgId, int page, int size, String sortBy, String sortOrder, String searchString); @@ -112,6 +112,12 @@ List getGradebookUserLessons(Lesson lesson, List userIds); List getGradebookUserLessons(List lessonIds); - + List getAllMarksForLesson(Long lessonID); + + boolean hasArchivedMarks(Long lessonId, Integer userId); + + List getArchivedLessonMarks(Long lessonId, Integer userId); + + List getArchivedActivityMarks(Long activityId, Integer userId); } Index: lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java =================================================================== diff -u -r87806866f673458de317c4d1c6656b3bf5a81039 -raf839eeb85f37cf68092401ad23a4613ca7cd001 --- lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision 87806866f673458de317c4d1c6656b3bf5a81039) +++ lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -20,17 +20,17 @@ * **************************************************************** */ - package org.lamsfoundation.lams.gradebook.dao.hibernate; -import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.gradebook.GradebookUserActivity; +import org.lamsfoundation.lams.gradebook.GradebookUserActivityArchive; import org.lamsfoundation.lams.gradebook.GradebookUserLesson; +import org.lamsfoundation.lams.gradebook.GradebookUserLessonArchive; import org.lamsfoundation.lams.gradebook.dao.IGradebookDAO; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.User; @@ -111,8 +111,9 @@ @Override @SuppressWarnings("unchecked") public List getGradebookUserActivitiesForLesson(Long lessonID, Integer userID) { - List result = getSessionFactory().getCurrentSession().createQuery(GET_GRADEBOOK_ACTIVITIES_FROM_LESSON) - .setInteger("userID", userID.intValue()).setLong("lessonID", lessonID.longValue()).list(); + List result = getSessionFactory().getCurrentSession() + .createQuery(GET_GRADEBOOK_ACTIVITIES_FROM_LESSON).setInteger("userID", userID.intValue()) + .setLong("lessonID", lessonID.longValue()).list(); return result; } @@ -168,28 +169,25 @@ @Override public List getAllMarksForLesson(Long lessonID) { - return (List) getSessionFactory().getCurrentSession().createQuery(GET_ALL_MARKS_FOR_LESSON) + return getSessionFactory().getCurrentSession().createQuery(GET_ALL_MARKS_FOR_LESSON) .setLong("lessonID", lessonID.longValue()).list(); } @Override @SuppressWarnings("unchecked") public long getMedianTimeTakenLesson(Long lessonID) { - + final String GET_MEDIAN_TIME_TAKEN_FOR_LESSON = "SELECT AVG(t1.timeTaken) AS medianVal FROM (" + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(progress.finish_date_time, progress.start_date_time)) AS timeTaken" + " FROM lams_learner_progress progress, (SELECT @rownum\\:=0) r" + " WHERE progress.lesson_id=:lessonID AND TIMEDIFF(progress.finish_date_time, progress.start_date_time) IS NOT NULL" - + " ORDER BY TIMEDIFF(progress.finish_date_time, progress.start_date_time)" - + " ) AS t1, " - + " (" - + " SELECT count(*) AS totalRows" - + " FROM lams_learner_progress progress" + + " ORDER BY TIMEDIFF(progress.finish_date_time, progress.start_date_time)" + " ) AS t1, " + " (" + + " SELECT count(*) AS totalRows" + " FROM lams_learner_progress progress" + " WHERE progress.lesson_id=:lessonID AND TIMEDIFF(progress.finish_date_time, progress.start_date_time) IS NOT NULL" - + " ) AS t2" - + " WHERE t1.rowNumber in ( floor((totalRows+1)/2), floor((totalRows+2)/2) )"; + + " ) AS t2" + " WHERE t1.rowNumber in ( floor((totalRows+1)/2), floor((totalRows+2)/2) )"; - List result = getSession().createSQLQuery(GET_MEDIAN_TIME_TAKEN_FOR_LESSON).setLong("lessonID", lessonID).list(); + List result = getSession().createSQLQuery(GET_MEDIAN_TIME_TAKEN_FOR_LESSON).setLong("lessonID", lessonID) + .list(); if (result == null || result.size() == 0 || result.get(0) == null) { return 0; @@ -202,47 +200,40 @@ @Override @SuppressWarnings("unchecked") public long getMedianTimeTakenForActivity(Long activityID) { - + final String GET_MEDIAN_TIME_TAKEN_FOR_ACTIVITY = "SELECT AVG(t1.timeTaken) AS medianVal FROM (" + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(progress.completed_date_time, progress.start_date_time)) AS timeTaken" + " FROM lams_progress_completed progress, (SELECT @rownum\\:=0) r" + " WHERE progress.activity_id=:activityID AND TIMEDIFF(progress.completed_date_time, progress.start_date_time) IS NOT NULL" - + " ORDER BY TIMEDIFF(progress.completed_date_time, progress.start_date_time)" - + " ) AS t1, " - + " (" - + " SELECT count(*) AS totalRows" - + " FROM lams_progress_completed progress" + + " ORDER BY TIMEDIFF(progress.completed_date_time, progress.start_date_time)" + " ) AS t1, " + " (" + + " SELECT count(*) AS totalRows" + " FROM lams_progress_completed progress" + " WHERE progress.activity_id=:activityID AND TIMEDIFF(progress.completed_date_time, progress.start_date_time) IS NOT NULL" - + " ) AS t2" - + " WHERE t1.rowNumber in ( floor((totalRows+1)/2), floor((totalRows+2)/2) )"; + + " ) AS t2" + " WHERE t1.rowNumber in ( floor((totalRows+1)/2), floor((totalRows+2)/2) )"; List result = getSession().createSQLQuery(GET_MEDIAN_TIME_TAKEN_FOR_ACTIVITY) .setLong("activityID", activityID.longValue()).list(); - + if (result == null || result.size() == 0 || result.get(0) == null) { return 0; } else { //converting into milliseconds return ((Number) result.get(0)).intValue() * 1000; } } - - + @Override @SuppressWarnings("unchecked") public long getMinTimeTakenForActivity(Long activityID) { - + final String GET_MIN_TIME_TAKEN_FOR_ACTIVITY = "SELECT MIN(t1.timeTaken) AS minVal FROM (" + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(progress.completed_date_time, progress.start_date_time)) AS timeTaken" + " FROM lams_progress_completed progress, (SELECT @rownum\\:=0) r" + " WHERE progress.activity_id=:activityID AND TIMEDIFF(progress.completed_date_time, progress.start_date_time) IS NOT NULL" - + " ORDER BY TIMEDIFF(progress.completed_date_time, progress.start_date_time)" - + " ) AS t1 "; - + + " ORDER BY TIMEDIFF(progress.completed_date_time, progress.start_date_time)" + " ) AS t1 "; List result = getSession().createSQLQuery(GET_MIN_TIME_TAKEN_FOR_ACTIVITY) .setLong("activityID", activityID.longValue()).list(); - + if (result == null || result.size() == 0 || result.get(0) == null) { return 0; } else { @@ -254,26 +245,23 @@ @Override @SuppressWarnings("unchecked") public long getMaxTimeTakenForActivity(Long activityID) { - + final String GET_MAX_TIME_TAKEN_FOR_ACTIVITY = "SELECT MAX(t1.timeTaken) AS maxVal FROM (" + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(progress.completed_date_time, progress.start_date_time)) AS timeTaken" + " FROM lams_progress_completed progress, (SELECT @rownum\\:=0) r" + " WHERE progress.activity_id=:activityID AND TIMEDIFF(progress.completed_date_time, progress.start_date_time) IS NOT NULL" - + " ORDER BY TIMEDIFF(progress.completed_date_time, progress.start_date_time)" - + " ) AS t1 "; - + + " ORDER BY TIMEDIFF(progress.completed_date_time, progress.start_date_time)" + " ) AS t1 "; List result = getSession().createSQLQuery(GET_MAX_TIME_TAKEN_FOR_ACTIVITY) .setLong("activityID", activityID.longValue()).list(); - + if (result == null || result.size() == 0 || result.get(0) == null) { return 0; } else { //converting into milliseconds return ((Number) result.get(0)).intValue() * 1000; } } - @Override @SuppressWarnings("unchecked") @@ -309,21 +297,18 @@ @Override @SuppressWarnings("unchecked") public long getMedianTimeTakenForGroupedActivity(Long activityID, Long groupID) { - + final String GET_MEDIAN_TIME_TAKEN_FOR_GROUPED_ACTIVITY = "SELECT AVG(t1.timeTaken) AS medianVal FROM (" + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)) AS timeTaken" + " FROM lams_progress_completed compProgress, (SELECT @rownum\\:=0) r, lams_learner_progress progr, lams_user_group ug " + " WHERE compProgress.activity_id=:activityID AND TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time) IS NOT NULL" + " AND ug.group_id=:groupID AND compProgress.learner_progress_id = progr.learner_progress_id AND progr.user_id=ug.user_id " - + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" - + " ) AS t1, " - + " (" - + " SELECT count(*) AS totalRows" + + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" + " ) AS t1, " + + " (" + " SELECT count(*) AS totalRows" + " FROM lams_progress_completed compProgress, lams_learner_progress progr, lams_user_group ug" + " WHERE compProgress.activity_id=:activityID AND TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time) IS NOT NULL" + " AND ug.group_id=:groupID AND compProgress.learner_progress_id = progr.learner_progress_id AND progr.user_id=ug.user_id" - + " ) AS t2" - + " WHERE t1.rowNumber in ( floor((totalRows+1)/2), floor((totalRows+2)/2) )"; + + " ) AS t2" + " WHERE t1.rowNumber in ( floor((totalRows+1)/2), floor((totalRows+2)/2) )"; List result = getSession().createSQLQuery(GET_MEDIAN_TIME_TAKEN_FOR_GROUPED_ACTIVITY) .setLong("activityID", activityID.longValue()).setLong("groupID", groupID.longValue()).list(); @@ -335,20 +320,17 @@ return ((Number) result.get(0)).intValue() * 1000; } } - - @Override @SuppressWarnings("unchecked") public long getMinTimeTakenForGroupedActivity(Long activityID, Long groupID) { - + final String GET_MIN_TIME_TAKEN_FOR_GROUPED_ACTIVITY = "SELECT MIN(t1.timeTaken) AS minVal FROM (" + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)) AS timeTaken" + " FROM lams_progress_completed compProgress, (SELECT @rownum\\:=0) r, lams_learner_progress progr, lams_user_group ug " + " WHERE compProgress.activity_id=:activityID AND TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time) IS NOT NULL" + " AND ug.group_id=:groupID AND compProgress.learner_progress_id = progr.learner_progress_id AND progr.user_id=ug.user_id " - + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" - + " ) AS t1"; + + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" + " ) AS t1"; List result = getSession().createSQLQuery(GET_MIN_TIME_TAKEN_FOR_GROUPED_ACTIVITY) .setLong("activityID", activityID.longValue()).setLong("groupID", groupID.longValue()).list(); @@ -359,18 +341,17 @@ return ((Number) result.get(0)).intValue() * 1000; } } - + @Override @SuppressWarnings("unchecked") public long getMaxTimeTakenForGroupedActivity(Long activityID, Long groupID) { - + final String GET_MAX_TIME_TAKEN_FOR_GROUPED_ACTIVITY = "SELECT MAX(t1.timeTaken) AS maxVal FROM (" + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)) AS timeTaken" + " FROM lams_progress_completed compProgress, (SELECT @rownum\\:=0) r, lams_learner_progress progr, lams_user_group ug " + " WHERE compProgress.activity_id=:activityID AND TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time) IS NOT NULL" + " AND ug.group_id=:groupID AND compProgress.learner_progress_id = progr.learner_progress_id AND progr.user_id=ug.user_id " - + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" - + " ) AS t1"; + + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" + " ) AS t1"; List result = getSession().createSQLQuery(GET_MAX_TIME_TAKEN_FOR_GROUPED_ACTIVITY) .setLong("activityID", activityID.longValue()).setLong("groupID", groupID.longValue()).list(); @@ -380,8 +361,7 @@ //converting into milliseconds return ((Number) result.get(0)).intValue() * 1000; } - } - + } @Override public List getLessonsByGroupAndUser(final Integer userId, final Integer orgId, int page, int size, @@ -705,4 +685,27 @@ return gradebookUserLessons; } + + @Override + public boolean hasArchivedMarks(Long lessonId, Integer userId) { + final String HAS_ARCHIVED_MARKS = "SELECT COUNT(*) FROM GradebookUserLessonArchive a WHERE " + + " a.lesson.lessonId = :lessonId AND a.learner.userId = :userId"; + long count = (Long) getSession().createQuery(HAS_ARCHIVED_MARKS).setLong("lessonId", lessonId) + .setInteger("userId", userId).uniqueResult(); + return count > 0; + } + + public List getArchivedLessonMarks(Long lessonId, Integer userId) { + final String GET_ARCHIVED_LESSON_MARKS = "FROM GradebookUserLessonArchive a WHERE " + + " a.lesson.lessonId = :lessonId AND a.learner.userId = :userId ORDER BY a.archiveDate DESC"; + return getSession().createQuery(GET_ARCHIVED_LESSON_MARKS).setLong("lessonId", lessonId) + .setInteger("userId", userId).list(); + } + + public List getArchivedActivityMarks(Long activityId, Integer userId) { + final String GET_ARCHIVED_ACTIVITY_MARKS = "FROM GradebookUserActivityArchive a WHERE " + + " a.activity.activityId = :activityId AND a.learner.userId = :userId ORDER BY a.archiveDate DESC"; + return getSession().createQuery(GET_ARCHIVED_ACTIVITY_MARKS).setLong("activityId", activityId) + .setInteger("userId", userId).list(); + } } Index: lams_gradebook/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r52dd63e24e52ed79e408faafa56a4677885f76d1 -raf839eeb85f37cf68092401ad23a4613ca7cd001 --- lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 52dd63e24e52ed79e408faafa56a4677885f76d1) +++ lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -35,6 +35,9 @@ gradebook.columntitle.averageTimeTaken =Median time taken: gradebook.columntitle.averageMark =Average mark gradebook.columntitle.learnerName =Name +gradebook.columntitle.attempt =Attempt # +gradebook.columntitle.restart =Restart date +gradebook.columntitle.lesson.mark =Lesson mark gradebook.function.window.showColumns =Show/Hide columns gradebook.function.error.enterNumber =Please enter a number value gradebook.function.search.title =Search grid @@ -119,5 +122,4 @@ gradebook.export.max.time.taken.seconds =Maximum time taken (seconds) gradebook.export.min.time.taken.seconds =Minimum time taken (seconds) - #======= End labels: Exported 112 labels for en AU ===== Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityArchiveGridRowDTO.java =================================================================== diff -u --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityArchiveGridRowDTO.java (revision 0) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityArchiveGridRowDTO.java (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -0,0 +1,57 @@ +/**************************************************************** + * Copyright (C) 2008 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +package org.lamsfoundation.lams.gradebook.dto; + +import java.util.ArrayList; +import java.util.Date; + +import org.lamsfoundation.lams.gradebook.util.GBGridView; +import org.lamsfoundation.lams.gradebook.util.GradebookUtil; + +public class GBActivityArchiveGridRowDTO extends GradebookGridRowDTO { + + private Date archiveDate; + private Double lessonMark; + + public GBActivityArchiveGridRowDTO(int attemptNumber, Date archiveDate, Double lessonMark) { + this.id = String.valueOf(attemptNumber); + this.archiveDate = archiveDate; + this.lessonMark = lessonMark; + } + + @Override + public ArrayList toStringArray(GBGridView view) { + ArrayList ret = new ArrayList(); + ret.add(id); + ret.add(archiveDate != null ? convertDateToString(archiveDate, null) : CELL_EMPTY); + ret.add(lessonMark.toString()); + ret.add(status); + ret.add(timeTaken != null ? convertTimeToString(timeTaken) : CELL_EMPTY); + ret.add(startDate != null ? convertDateToString(startDate, null) : CELL_EMPTY); + ret.add(finishDate != null ? convertDateToString(finishDate, null) : CELL_EMPTY); + ret.add(feedback); + ret.add(mark != null ? GradebookUtil.niceFormatting(mark) : CELL_EMPTY); + + return ret; + } +} \ No newline at end of file Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java =================================================================== diff -u -reeb8faaea5372ccf5445d7172f726931e9f26098 -raf839eeb85f37cf68092401ad23a4613ca7cd001 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java (.../GBUserGridRowDTO.java) (revision eeb8faaea5372ccf5445d7172f726931e9f26098) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java (.../GBUserGridRowDTO.java) (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -20,7 +20,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.gradebook.dto; import java.util.ArrayList; @@ -44,6 +43,8 @@ private String currentActivity; private Long portraitId; + private boolean hasArchivedMarks; + public GBUserGridRowDTO() { } @@ -72,6 +73,7 @@ ret.add(feedback); ret.add((mark != null) ? GradebookUtil.niceFormatting(mark, displayMarkAsPercent) : CELL_EMPTY); ret.add(portraitId != null ? portraitId.toString() : ""); + ret.add(String.valueOf(hasArchivedMarks)); } else if (view == GBGridView.MON_ACTIVITY) { @@ -86,7 +88,7 @@ ret.add(portraitId != null ? portraitId.toString() : ""); if (activityUrl != null && activityUrl.length() != 0) { ret.add("javascript:launchPopup(\"" + activityUrl + "\",\"" + rowName + "\",796,570)'>"); - } + } } else if (view == GBGridView.MON_COURSE) { ret.add(rowName); @@ -155,4 +157,11 @@ this.portraitId = portraitId; } -} + public boolean getHasArchivedMarks() { + return hasArchivedMarks; + } + + public void setHasArchivedMarks(boolean hasArchivedAttempts) { + this.hasArchivedMarks = hasArchivedAttempts; + } +} \ No newline at end of file Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -rbfc093eb87907e66a284fd1c30cf0f212122f706 -raf839eeb85f37cf68092401ad23a4613ca7cd001 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision bfc093eb87907e66a284fd1c30cf0f212122f706) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -43,6 +43,7 @@ import org.lamsfoundation.lams.gradebook.GradebookUserLesson; import org.lamsfoundation.lams.gradebook.GradebookUserLessonArchive; import org.lamsfoundation.lams.gradebook.dao.IGradebookDAO; +import org.lamsfoundation.lams.gradebook.dto.GBActivityArchiveGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GBActivityGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GBLessonGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GBUserGridRowDTO; @@ -193,6 +194,36 @@ } @Override + public List getGBActivityArchiveRowsForLearner(Long activityId, Integer userId, + TimeZone userTimezone) { + GradebookService.logger + .debug("Getting archive gradebook user data for activity: " + activityId + ". For user: " + userId); + + Lesson lesson = (Lesson) getActivityById(activityId).getLearningDesign().getLessons().iterator().next(); + + List gradebookActivityDTOs = new ArrayList(); + List lessonArchives = gradebookDAO.getArchivedLessonMarks(lesson.getLessonId(), + userId); + int attemptOrder = lessonArchives.size(); + List activityArchives = gradebookDAO.getArchivedActivityMarks(activityId, userId); + for (GradebookUserLessonArchive lessonArchive : lessonArchives) { + GBActivityArchiveGridRowDTO activityDTO = new GBActivityArchiveGridRowDTO(attemptOrder, + lessonArchive.getArchiveDate(), lessonArchive.getMark()); + for (GradebookUserActivityArchive activityArchive : activityArchives) { + if (lessonArchive.getArchiveDate().equals(activityArchive.getArchiveDate())) { + activityDTO.setMark(activityArchive.getMark()); + activityDTO.setFeedback(activityArchive.getFeedback()); + break; + } + } + gradebookActivityDTOs.add(activityDTO); + attemptOrder--; + } + + return gradebookActivityDTOs; + } + + @Override public List getGBLessonComplete(Long lessonId, Integer userId) { GradebookService.logger .debug("Getting lesson complete gradebook user data for lesson: " + lessonId + ". For user: " + userId); @@ -421,6 +452,9 @@ gradebookUserDTO.setDisplayMarkAsPercent(isWeighted); } + boolean hasArchivedMarks = gradebookDAO.hasArchivedMarks(lesson.getLessonId(), learner.getUserId()); + gradebookUserDTO.setHasArchivedMarks(hasArchivedMarks); + } } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java =================================================================== diff -u -r2485ce33e55a921bdcde94e4f242da5da3cf1fc4 -raf839eeb85f37cf68092401ad23a4613ca7cd001 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision 2485ce33e55a921bdcde94e4f242da5da3cf1fc4) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -53,6 +53,9 @@ */ List getGBActivityRowsForLesson(Long lessonId, TimeZone userTimezone, boolean escapeTitles); + List getGBActivityArchiveRowsForLearner(Long activityId, Integer userId, + TimeZone userTimezone); + /** * Gets all the activity rows for a user, with the mark for the activity being the user's individual mark * @@ -128,7 +131,7 @@ /** * Updates all user marks in specified activity. It recalculates all UserActivityGradebooks and * UserLessonGradebooks. - * + * * @param activity */ void recalculateGradebookMarksForActivity(Activity activity); @@ -137,7 +140,7 @@ * Recalculates total marks for all users in a lesson. Then stores that mark in a gradebookUserLesson. Doesn't * affect anyhow gradebookUserActivity objects. If total mark is positive but there is no gradebookUserLesson * available - throws exception. - * + * * @param lessonId * @throws Exception */ @@ -336,7 +339,7 @@ /** * Get the raw overall marks for a lesson for charting purposes - * + * * @param lessonId * @return */ Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookAction.java =================================================================== diff -u -r352e16d0ad309caa12c5422fddebfc221c83714b -raf839eeb85f37cf68092401ad23a4613ca7cd001 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookAction.java (.../GradebookAction.java) (revision 352e16d0ad309caa12c5422fddebfc221c83714b) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookAction.java (.../GradebookAction.java) (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -158,6 +158,45 @@ return null; } + public ActionForward getActivityArchiveGridData(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + GBGridView view = GradebookUtil.readGBGridViewParam(request, GradebookConstants.PARAM_VIEW, false); + + Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + Long activityID = WebUtil.readLongParam(request, AttributeNames.PARAM_ACTIVITY_ID); + if (!getSecurityService().isLessonParticipant(lessonID, getUser().getUserID(), + "get activity archive gradebook data", false)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a learner in the lesson"); + return null; + } + + // Getting userID param, it is passed differently from different views + UserDTO currentUserDTO = getUser(); + Integer userID = null; + if (view == GBGridView.MON_USER) { + userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID); + } else if (view == GBGridView.LRN_ACTIVITY) { + if (currentUserDTO != null) { + userID = currentUserDTO.getUserID(); + } + } + + List gradebookActivityDTOs = new ArrayList(); + + // Get the user gradebook list from the db + // A slightly different list is needed for userview or activity view + if ((view == GBGridView.MON_USER) || (view == GBGridView.LRN_ACTIVITY)) {//2nd level && from personal marks page (2nd level or 1st) + gradebookActivityDTOs = getGradebookService().getGBActivityArchiveRowsForLearner(activityID, userID, + currentUserDTO.getTimeZone()); + } + + String ret = GradebookUtil.toGridXML(gradebookActivityDTOs, view, GradebookConstants.PARAM_ID, false, null, + null, null, null, 100, 1); + + writeResponse(response, LamsDispatchAction.CONTENT_TYPE_TEXT_XML, LamsDispatchAction.ENCODING_UTF8, ret); + return null; + } + @SuppressWarnings("unchecked") public ActionForward getLessonCompleteGridData(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -r051ab022e4087566f23069b2299f804d791c8e49 -raf839eeb85f37cf68092401ad23a4613ca7cd001 --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 051ab022e4087566f23069b2299f804d791c8e49) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision af839eeb85f37cf68092401ad23a4613ca7cd001) @@ -171,7 +171,8 @@ "", "", "", - 'portraitId' + 'portraitId', + 'hasArchivedMarks' ], colModel:[ {name:'id', index:'id', sortable:false, editable:false, hidden:true, search:false, hidedlg:true}, @@ -182,19 +183,21 @@ {name:'finishDate',index:'finishDate', sortable:false, editable:false, hidden:false, search:false, width:85, align:"left"}, {name:'feedback',index:'feedback', sortable:true, editable:true, edittype:'textarea', editoptions:{rows:'4',cols:'20'}, search:false }, {name:'mark',index:'mark', sortable:true, editable:true, editrules:{number:true}, search:false, width:50, align:"center"}, - {name:'portraitId', index:'portraitId', width:0, hidden: true} + {name:'portraitId', index:'portraitId', width:0, hidden: true}, + {name:'hasArchivedMarks', index:'hasArchivedMarks', width:0, hidden: true} ], loadError: function(xhr,st,err) { jQuery("#userView").clearGridData(); alert(""); }, subGrid: true, subGridRowExpanded: function(subgrid_id, row_id) { - var subgrid_table_id; - var userID = jQuery("#userView").getRowData(row_id)["id"]; - subgrid_table_id = subgrid_id+"_t"; + var subgrid_table_id = subgrid_id+"_t", + rowData = jQuery("#userView").getRowData(row_id), + userID = rowData["id"], + hasArchivedMarks = rowData["hasArchivedMarks"] == "true"; jQuery("#"+subgrid_id).html("
"); - jQuery("#"+subgrid_table_id).jqGrid({ + jQuery("#"+subgrid_table_id).jqGrid({ guiStyle: "bootstrap", iconSet: 'fontAwesome', autoencode:false, @@ -304,7 +307,81 @@ gridComplete: function(){ toolTip($(".jqgrow"), "jqgridTooltip"); fixPagerInCenter(subgrid_table_id+"_pager", 1); - } + }, + subGrid : hasArchivedMarks, + subGridRowExpanded: function(subgrid_id, row_id) { + var subgrid_table_id = subgrid_id + "_t", + rowData = jQuery("#" + subgrid_id.substring(0, subgrid_id.lastIndexOf('_'))).getRowData(row_id), + activityID = rowData["id"].split("_")[0]; + jQuery("#"+subgrid_id).html("
"); + jQuery("#"+subgrid_table_id).jqGrid({ + guiStyle: "bootstrap", + iconSet: 'fontAwesome', + autoencode:false, + datatype: "xml", + url: "/gradebook/gradebook.do?dispatch=getActivityArchiveGridData&lessonID=${lessonDetails.lessonID}&activityID=" + + activityID + "&view=monUserView&userID=" + userID, + height: "100%", + autowidth:true, + cellEdit:false, + pager: false, + colNames: [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + colModel: [ + {name:'id', index:'id', sortable:false, editable: false ,width:40, align:"right"}, + {name:'restart',index:'restart', sortable:false, editable: false, width:60,align:"left"}, + {name:'lessonMark', index:'lessonMark', sortable:false, editable: false, width:50, align:"center" }, + {name:'status', index:'status', sortable:false, editable:false, width:50, align:"center"}, + {name:'timeTaken',index:'timeTaken', sortable:false, editable: false, width:80, align:"center"}, + {name:'startDate',index:'startDate', sortable:false, editable:false, search:false, width:85, align:"left"}, + {name:'finishDate',index:'finishDate', sortable:false, editable:false, search:false, width:85, align:"left"}, + {name:'feedback', index:'feedback', sortable:false, editable: false, width:200, hidden:true}, + {name:'mark', index:'mark', sortable:false, editable: false, width:50, align:"center" } + ], + loadError: function(xhr,st,err) { + jQuery("#"+subgrid_table_id).clearGridData(); + alert(""); + }, + formatCell: function(rowid, cellname,value, iRow, iCol) { + if (cellname == "mark") { + + var rowData = jQuery("#"+subgrid_table_id).getRowData(rowid); + var string = removeHTMLTags(rowData["mark"]); + + + if (string.indexOf("-") != -1) + { + string = " "; + + } else if (string.indexOf("/") != -1) { + splits = string.split("/"); + + if(splits.length == 2) { + tempMark = splits[0]; + string = " "; + } else { + string = " "; + } + } + + return string; + + } + }, + gridComplete: function(){ + toolTip($(".jqgrow"), "jqgridTooltip"); + } + }); + } }).navGrid("#"+subgrid_table_id+"_pager", {edit:false,add:false,del:false,search:false}); // applying refresh button },