Index: lams_gradebook/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r39949b071c2cd7626b680c32af35559acdbd5c49 -rfc2765358dd2ee073be452d5c1e265a3b7e404a1 --- lams_gradebook/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 39949b071c2cd7626b680c32af35559acdbd5c49) +++ lams_gradebook/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision fc2765358dd2ee073be452d5c1e265a3b7e404a1) @@ -86,6 +86,16 @@ gradebook.exportcourse.current.activity =Current activity: {0} gradebook.gridtitle.lesson.view =Lesson View gradebook.gridtitle.learner.view =Learner View +label.select =Select +label.lessons.to.export =lessons to export. +label.button.export =Export +label.lessons =Lessons +label.group =Group +label.max.possible =Max Possible +label.total.actuals =Total Actuals +label.max.mark =Max mark +label.actuals =Actuals +label.max =Max +label.overall.totals =Overall Totals - #======= End labels: Exported 80 labels for en AU ===== Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r2fb529d1dd3dae1d2a106eb701e3594e686da8c5 -rfc2765358dd2ee073be452d5c1e265a3b7e404a1 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 2fb529d1dd3dae1d2a106eb701e3594e686da8c5) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision fc2765358dd2ee073be452d5c1e265a3b7e404a1) @@ -775,10 +775,10 @@ // Dont include lesson in list if the user doesnt have permission Integer organisationToCheckPermission = (organisation.getOrganisationType().getOrganisationTypeId().equals(OrganisationType.COURSE_TYPE)) ? organisation.getOrganisationId() : organisation.getParentOrganisation().getOrganisationId(); + boolean isGroupManager = userService.isUserInRole(userId, organisationToCheckPermission, Role.GROUP_MANAGER); List lessons = new LinkedList(); for (Lesson lesson : lessonsFromDB) { - if (!(lesson.getLessonClass().isStaffMember(user) || userService.isUserInRole(userId, organisationToCheckPermission, - Role.GROUP_MANAGER))) { + if (!(lesson.getLessonClass().isStaffMember(user) || isGroupManager)) { continue; } @@ -846,7 +846,179 @@ dataToExport.put(getMessage("gradebook.exportcourse.course.summary"), summaryData); return dataToExport; } + + @Override + public LinkedHashMap exportSelectedLessonsGradebook(Integer userId, Integer organisationId, String[] lessonIds) { + LinkedHashMap dataToExport = new LinkedHashMap(); + + Organisation organisation = (Organisation) userService.findById(Organisation.class, organisationId); + + // The entire data list + List rowList = new LinkedList(); + User user = (User) userService.findById(User.class, userId); + Set selectedLessons = new TreeSet(new LessonComparator()); + + // Don't include lesson in list if the user doesnt have permission + Integer organisationToCheckPermission = (organisation.getOrganisationType().getOrganisationTypeId().equals(OrganisationType.COURSE_TYPE)) + ? organisation.getOrganisationId() : organisation.getParentOrganisation().getOrganisationId(); + boolean isGroupManager = userService.isUserInRole(userId, organisationToCheckPermission, Role.GROUP_MANAGER); + + // collect users from all lessons + Set allLearners = new LinkedHashSet(); + Map> lessonActivitiesMap = new HashMap>(); + List allActivities = new ArrayList(); + + for (String lessonIdStr : lessonIds) { + Long lessonId = Long.parseLong(lessonIdStr); + Lesson lesson = lessonService.getLesson(lessonId); + + if (!(lesson.getLessonClass().isStaffMember(user) || isGroupManager)) { + continue; + } + + selectedLessons.add(lesson); + + allLearners.addAll(lesson.getAllLearners()); + + Set lessonActivities = getLessonActivities(lesson); + lessonActivitiesMap.put(lesson.getLessonId(), lessonActivities); + allActivities.addAll(lessonActivities); + } + + if (!selectedLessons.isEmpty()) { + + Map activityToTotalMarkMap = getActivityToTotalMarkMap(allActivities); + + Map> activityTouserToGradebookUserActivityMap = new HashMap>(); + for (ToolActivity activity : allActivities) { + Map userToGradebookUserActivityMap = getUserToGradebookUserActivityMap(activity); + activityTouserToGradebookUserActivityMap.put(activity.getActivityId(), userToGradebookUserActivityMap); + } + + int numberCellsPerRow = selectedLessons.size() * 6 + allActivities.size() * 2 + 5; + + // Lesson names row---------------------- + ExcelCell[] lessonsNames = new ExcelCell[numberCellsPerRow]; + int i = 4; + for (Lesson lesson : selectedLessons) { + Set lessonActivities = lessonActivitiesMap.get(lesson.getLessonId()); + int numberActivities = lessonActivities.size(); + lessonsNames[i + numberActivities] = new ExcelCell(lesson.getLessonName(), true); + i += 6 + numberActivities * 2; + } + i -= 2; + lessonsNames[i++] = new ExcelCell("", ExcelCell.BORDER_STYLE_LEFT_THIN); + lessonsNames[i++] = new ExcelCell(getMessage("label.overall.totals"), true); + lessonsNames[i++] = new ExcelCell("", ExcelCell.BORDER_STYLE_RIGHT_THICK); + + rowList.add(lessonsNames); + + // Headers row---------------------- + ExcelCell[] headerRow = new ExcelCell[numberCellsPerRow]; + i = 0; + + for (Lesson lesson : selectedLessons) { + headerRow[i++] = new ExcelCell(getMessage("gradebook.export.last.name"), false); + headerRow[i++] = new ExcelCell(getMessage("gradebook.export.first.name"), false); + headerRow[i++] = new ExcelCell(getMessage("label.group"), false); + + Set activities = lessonActivitiesMap.get(lesson.getLessonId()); + for (Activity activity : activities) { + headerRow[i++] = new ExcelCell(activity.getTitle(), true); + headerRow[i++] = new ExcelCell(getMessage("label.max.possible"), false); + } + + headerRow[i++] = new ExcelCell(getMessage("label.total.actuals"), true, ExcelCell.BORDER_STYLE_LEFT_THIN); + headerRow[i++] = new ExcelCell(getMessage("label.max.mark"), false); + headerRow[i++] = new ExcelCell("%", ExcelCell.BORDER_STYLE_RIGHT_THICK); + } + i += 2; + headerRow[i++] = new ExcelCell(getMessage("label.actuals"), true, ExcelCell.BORDER_STYLE_LEFT_THIN); + headerRow[i++] = new ExcelCell(getMessage("label.max"), true); + headerRow[i++] = new ExcelCell("%", true, ExcelCell.BORDER_STYLE_RIGHT_THICK); + rowList.add(headerRow); + + // Actual data rows---------------------- + for (User learner : allLearners) { + + Double overallTotal = 0d; + Double overallMaxMark = 0d; + ExcelCell[] userRow = new ExcelCell[numberCellsPerRow]; + i = 0; + + + for (Lesson lesson : selectedLessons) { + + Double lessonTotal = 0d; + Double lessonMaxMark = 0d; + Set activities = lessonActivitiesMap.get(lesson.getLessonId()); + + userRow[i++] = new ExcelCell(learner.getFirstName().toUpperCase(), false); + userRow[i++] = new ExcelCell(learner.getLastName().toUpperCase(), false); + + //check if learner is participating in this lesson + if (!lesson.getAllLearners().contains(learner)) { + i += 1 + activities.size() * 2; + userRow[i++] = new ExcelCell("", ExcelCell.BORDER_STYLE_LEFT_THIN); + userRow[i++] = new ExcelCell("", false); + userRow[i++] = new ExcelCell("", ExcelCell.BORDER_STYLE_RIGHT_THICK); + continue; + } + + //getUserGroupName + String groupName = ""; + for (Group group : (Set)lesson.getLessonClass().getGroups()) { + if (group.hasLearner(learner)) { + groupName = group.getGroupName(); + break; + } + } + userRow[i++] = new ExcelCell(groupName, false); + + for (ToolActivity activity : activities) { + Map userToGradebookUserActivityMap = activityTouserToGradebookUserActivityMap.get(activity.getActivityId()); + GradebookUserActivity gradebookUserActivity = userToGradebookUserActivityMap.get(learner.getUserId()); + Double mark = 0d; + if (gradebookUserActivity != null) { + mark = gradebookUserActivity.getMark(); + userRow[i++] = new ExcelCell(mark, false); + } else { + userRow[i++] = new ExcelCell("", false); + } + + Long activityTotalMarks = (activityToTotalMarkMap.get(activity.getActivityId()) != null) ? activityToTotalMarkMap + .get(activity.getActivityId()) : 0l; + userRow[i++] = new ExcelCell(activityTotalMarks, false); + + lessonTotal += mark; + overallTotal += mark; + lessonMaxMark += activityTotalMarks; + overallMaxMark += activityTotalMarks; + } + + userRow[i++] = new ExcelCell(lessonTotal, ExcelCell.BORDER_STYLE_LEFT_THIN); + userRow[i++] = new ExcelCell(lessonMaxMark, false); + Double percentage = (lessonMaxMark != 0) ? lessonTotal/lessonMaxMark : 0d; + userRow[i++] = new ExcelCell(percentage, ExcelCell.BORDER_STYLE_RIGHT_THICK); + + } + + i += 2; + userRow[i++] = new ExcelCell(overallTotal, ExcelCell.BORDER_STYLE_LEFT_THIN); + userRow[i++] = new ExcelCell(overallMaxMark, false); + Double percentage = (overallMaxMark != 0) ? overallTotal/overallMaxMark : 0d; + userRow[i++] = new ExcelCell(percentage, true, ExcelCell.BORDER_STYLE_RIGHT_THICK); + + rowList.add(userRow); + } + } + + ExcelCell[][] summaryData = rowList.toArray(new ExcelCell[][] {}); + dataToExport.put(getMessage("gradebook.exportcourse.course.summary"), summaryData); + return dataToExport; + } + public void updateActivityMark(Double mark, String feedback, Integer userID, Long toolSessionID, Boolean markedInGradebook) { ToolSession toolSession = toolService.getToolSessionById(toolSessionID); Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java =================================================================== diff -u -r246994a59d7c4ff0dfd17290461e112bedfc6545 -rfc2765358dd2ee073be452d5c1e265a3b7e404a1 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision 246994a59d7c4ff0dfd17290461e112bedfc6545) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision fc2765358dd2ee073be452d5c1e265a3b7e404a1) @@ -207,12 +207,23 @@ LinkedHashMap exportLessonGradebook(Lesson lesson); /** - * Get the summary data for course for an excel export + * Get the summary data for course in order to create excel export * * @param userId * @param organisationId * @return */ LinkedHashMap exportCourseGradebook(Integer userId, Integer organisationId); + + + /** + * Get the summary data for selected lessons in order to create excel export + * + * @param userId + * @param organisationId + * @return + */ + LinkedHashMap exportSelectedLessonsGradebook(Integer userId, Integer organisationId, String[] lessonIds); + } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java =================================================================== diff -u -r5a5f3640c4d5fdf0c302347e7d6b502a972fd9cc -rfc2765358dd2ee073be452d5c1e265a3b7e404a1 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java (.../GradebookMonitoringAction.java) (revision 5a5f3640c4d5fdf0c302347e7d6b502a972fd9cc) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java (.../GradebookMonitoringAction.java) (revision fc2765358dd2ee073be452d5c1e265a3b7e404a1) @@ -55,6 +55,7 @@ import org.lamsfoundation.lams.web.action.LamsDispatchAction; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; +import org.springframework.util.Assert; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -369,7 +370,51 @@ return null; } + + /** + * Exports selected lessons Gradebook into excel. + */ + public ActionForward exportExcelSelectedLessons(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + initServices(); + Integer oranisationID = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID); + User user = getRealUser(getUser()); + + Organisation organisation = (Organisation) userService.findById(Organisation.class, oranisationID); + if (organisation == null || user == null) { + String errorMsg = "Organisation " + oranisationID + " does not exist or user is null. Unable to load gradebook"; + logger.error(errorMsg); + throw new Exception(errorMsg); + } + + Integer organisationId = organisation.getOrganisationId(); + logger.debug("Exporting to a spreadsheet course: " + organisationId); + + String[] lessonIds = request.getParameterValues(AttributeNames.PARAM_LESSON_ID); + Assert.notNull(lessonIds); + + LinkedHashMap dataToExport = gradebookService.exportSelectedLessonsGradebook(user.getUserId(), organisationId, lessonIds); + + String fileName = organisation.getName().replaceAll(" ", "_") + ".xlsx"; + fileName = FileUtil.encodeFilenameForDownload(request, fileName); + + response.setContentType("application/x-download"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + + //set cookie that will tell JS script that export has been finished + String downloadTokenValue = WebUtil.readStrParam(request, "downloadTokenValue"); + Cookie fileDownloadTokenCookie = new Cookie("fileDownloadToken", downloadTokenValue); + fileDownloadTokenCookie.setPath("/"); + response.addCookie(fileDownloadTokenCookie); + + //Code to generate file and write file contents to response + ServletOutputStream out = response.getOutputStream(); + ExcelUtil.createExcel(out, dataToExport, null, false); + + return null; + } + private UserDTO getUser() { HttpSession ss = SessionManager.getSession(); return (UserDTO) ss.getAttribute(AttributeNames.USER); Index: lams_gradebook/web/gradebookCourseMonitor.jsp =================================================================== diff -u -r5be5ad6c1aa644c0fe88023e5014b7b06e426d11 -rfc2765358dd2ee073be452d5c1e265a3b7e404a1 --- lams_gradebook/web/gradebookCourseMonitor.jsp (.../gradebookCourseMonitor.jsp) (revision 5be5ad6c1aa644c0fe88023e5014b7b06e426d11) +++ lams_gradebook/web/gradebookCourseMonitor.jsp (.../gradebookCourseMonitor.jsp) (revision fc2765358dd2ee073be452d5c1e265a3b7e404a1) @@ -17,10 +17,6 @@ - @@ -388,12 +440,25 @@
+
+ + + + +
+ +
+
+ + " id="export-selected-lessons-button" /> +
+
Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -rfc2765358dd2ee073be452d5c1e265a3b7e404a1 --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 35a0e719d061c08b52e705135bb2f2126079ed21) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision fc2765358dd2ee073be452d5c1e265a3b7e404a1) @@ -16,10 +16,6 @@ - @@ -472,7 +478,7 @@