Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r6c765552ace140caa004eebd60096ff9ff26bb7c -r39ceb19b74c579d46fb624c3b3ab02fd8e79683a Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/util/ExcelCell.java =================================================================== diff -u -r723b5bcbdf0db6b9a4fbeacdc55f7336992ac935 -r39ceb19b74c579d46fb624c3b3ab02fd8e79683a --- lams_common/src/java/org/lamsfoundation/lams/util/ExcelCell.java (.../ExcelCell.java) (revision 723b5bcbdf0db6b9a4fbeacdc55f7336992ac935) +++ lams_common/src/java/org/lamsfoundation/lams/util/ExcelCell.java (.../ExcelCell.java) (revision 39ceb19b74c579d46fb624c3b3ab02fd8e79683a) @@ -42,6 +42,7 @@ private Object cellValue; private Boolean isBold; + private Boolean isPercentage = false; private IndexedColors color; private int borderStyle = 0; private int alignment = 0; @@ -88,7 +89,16 @@ this.isBold = isBold; } - public IndexedColors getColor() { + public Boolean isPercentage() { + return isPercentage; + } + + public ExcelCell setIsPercentage(Boolean isPercentage) { + this.isPercentage = isPercentage; + return this; + } + + public IndexedColors getColor() { return color; } Index: lams_common/src/java/org/lamsfoundation/lams/util/ExcelUtil.java =================================================================== diff -u -r2dbd1fb7d0a25cd427f5ad1a7e61b12610ee4c86 -r39ceb19b74c579d46fb624c3b3ab02fd8e79683a --- lams_common/src/java/org/lamsfoundation/lams/util/ExcelUtil.java (.../ExcelUtil.java) (revision 2dbd1fb7d0a25cd427f5ad1a7e61b12610ee4c86) +++ lams_common/src/java/org/lamsfoundation/lams/util/ExcelUtil.java (.../ExcelUtil.java) (revision 39ceb19b74c579d46fb624c3b3ab02fd8e79683a) @@ -25,13 +25,13 @@ import java.io.IOException; import java.io.OutputStream; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedHashMap; import org.apache.commons.lang.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; @@ -48,20 +48,26 @@ private static CellStyle defaultStyle; private static CellStyle boldStyle; + private static CellStyle percentageStyle; + private static String percentageStyleFormatString = "0.00%"; private static CellStyle greenColor; private static CellStyle blueColor; private static CellStyle redColor; private static CellStyle yellowColor; private static CellStyle borderStyleLeftThin; + private static CellStyle borderStyleLeftThinPercentage; private static CellStyle borderStyleLeftThick; private static CellStyle borderStyleRightThick; private static CellStyle borderStyleLeftThinBoldFont; + private static CellStyle borderStyleLeftThinBoldFontPercentage; private static CellStyle borderStyleLeftThickBoldFont; private static CellStyle borderStyleRightThickBoldFont; private static CellStyle borderStyleBottomThin; private static CellStyle borderStyleBottomThinBoldFont; + private static CellStyle borderStyleRightThickPercentage; + private static CellStyle borderStyleRightThickBoldFontPercentage; public final static String DEFAULT_FONT_NAME = "Calibri-Regular"; @@ -119,6 +125,11 @@ yellowColor.setFillPattern(CellStyle.SOLID_FOREGROUND); yellowColor.setFont(defaultFont); + // create percentage style + percentageStyle = workbook.createCellStyle(); + short percentageDataFormatId = workbook.createDataFormat().getFormat(percentageStyleFormatString); + percentageStyle.setDataFormat(percentageDataFormatId); + //create border style borderStyleLeftThin = workbook.createCellStyle(); borderStyleLeftThin.setBorderLeft(CellStyle.BORDER_THIN); @@ -145,6 +156,23 @@ borderStyleBottomThinBoldFont.setBorderBottom(CellStyle.BORDER_THIN); borderStyleBottomThinBoldFont.setFont(boldFont); + borderStyleLeftThinPercentage = workbook.createCellStyle(); + borderStyleLeftThinPercentage.setBorderLeft(CellStyle.BORDER_THIN); + borderStyleLeftThinPercentage.setFont(defaultFont); + borderStyleLeftThinPercentage.setDataFormat(percentageDataFormatId); + borderStyleLeftThinBoldFontPercentage = workbook.createCellStyle(); + borderStyleLeftThinBoldFontPercentage.setBorderLeft(CellStyle.BORDER_THIN); + borderStyleLeftThinBoldFontPercentage.setFont(boldFont); + borderStyleLeftThinBoldFontPercentage.setDataFormat(percentageDataFormatId); + + borderStyleRightThickPercentage = workbook.createCellStyle(); + borderStyleRightThickPercentage.setBorderRight(CellStyle.BORDER_THICK); + borderStyleRightThickPercentage.setDataFormat(percentageDataFormatId); + borderStyleRightThickBoldFontPercentage = workbook.createCellStyle(); + borderStyleRightThickBoldFontPercentage.setBorderRight(CellStyle.BORDER_THICK); + borderStyleRightThickBoldFontPercentage.setFont(boldFont); + borderStyleRightThickBoldFontPercentage.setDataFormat(percentageDataFormatId); + int i = 0; for (String sheetName : dataToExport.keySet()) { if (dataToExport.get(sheetName) != null) { @@ -238,6 +266,10 @@ if (excelCell.isBold()) { cell.setCellStyle(boldStyle); } + + if ( excelCell.isPercentage() ) { + cell.setCellStyle(percentageStyle); + } if (excelCell.getColor() != null) { switch (excelCell.getColor()) { @@ -262,8 +294,12 @@ switch (excelCell.getBorderStyle()) { case ExcelCell.BORDER_STYLE_LEFT_THIN: - if (excelCell.isBold()) { + if (excelCell.isBold() && excelCell.isPercentage()) { + cell.setCellStyle(borderStyleLeftThinBoldFontPercentage); + } else if (excelCell.isBold()) { cell.setCellStyle(borderStyleLeftThinBoldFont); + } else if (excelCell.isPercentage()) { + cell.setCellStyle(borderStyleLeftThinPercentage); } else { cell.setCellStyle(borderStyleLeftThin); } @@ -276,8 +312,12 @@ } break; case ExcelCell.BORDER_STYLE_RIGHT_THICK: - if (excelCell.isBold()) { + if (excelCell.isBold() && excelCell.isPercentage() ) { + cell.setCellStyle(borderStyleRightThickBoldFontPercentage); + } else if (excelCell.isBold() ) { cell.setCellStyle(borderStyleRightThickBoldFont); + } else if (excelCell.isPercentage() ) { + cell.setCellStyle(borderStyleRightThickPercentage); } else { cell.setCellStyle(borderStyleRightThick); } Index: lams_gradebook/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -re6b3b4b473ebb151c10733808c40d4276b4f81ab -r39ceb19b74c579d46fb624c3b3ab02fd8e79683a --- lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision e6b3b4b473ebb151c10733808c40d4276b4f81ab) +++ lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 39ceb19b74c579d46fb624c3b3ab02fd8e79683a) @@ -115,6 +115,6 @@ label.button.hide.weights =Hide Weights label.weights.title =Weights on activity outputs label.hide.lessons.to.export =Hide lessons to export +label.activity.marks.weighted = (Activity Marks Weighted) - #======= End labels: Exported 107 labels for en AU ===== Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r6c765552ace140caa004eebd60096ff9ff26bb7c -r39ceb19b74c579d46fb624c3b3ab02fd8e79683a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 6c765552ace140caa004eebd60096ff9ff26bb7c) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 39ceb19b74c579d46fb624c3b3ab02fd8e79683a) @@ -1,5 +1,4 @@ /**************************************************************** - * Copyright (C) 2008 LAMS Foundation (http://lamsfoundation.org) * ============================================================= * License Information: http://lamsfoundation.org/licensing/lams/2.0/ * @@ -981,15 +980,11 @@ List rowList = new LinkedList(); // Adding the lesson average data to the summary - Object lessonAverageMarkValue = getAverageMarkForLesson(lesson.getLessonId()); - if (isWeighted) { - lessonAverageMarkValue = GradebookUtil.niceFormatting((Double) lessonAverageMarkValue, true); - } - + Double lessonAverageMarkValue = getAverageMarkForLesson(lesson.getLessonId()); ExcelCell[] lessonAverageMark = new ExcelCell[2]; lessonAverageMark[0] = new ExcelCell(getMessage("gradebook.export.average.lesson.mark"), true); - lessonAverageMark[1] = new ExcelCell(lessonAverageMarkValue, false); - rowList.add(lessonAverageMark); + ExcelCell markCell = isWeighted ? GradebookUtil.createPercentageCell(lessonAverageMarkValue, true) : new ExcelCell(lessonAverageMarkValue, false); + lessonAverageMark[1] = markCell; ExcelCell[] lessonMedianTimeTaken = new ExcelCell[2]; lessonMedianTimeTaken[0] = new ExcelCell(getMessage("gradebook.export.average.lesson.time.taken"), true); @@ -1045,18 +1040,13 @@ for (GBUserGridRowDTO userRow : userRows) { // Adding the user data for the lesson - Object userMarkValue = userRow.getMark(); - if (userMarkValue != null && isWeighted) { - userMarkValue = GradebookUtil.niceFormatting((Double) userMarkValue, true); - } - ExcelCell[] userDataRow = new ExcelCell[6]; userDataRow[0] = new ExcelCell(userRow.getLastName(), false); userDataRow[1] = new ExcelCell(userRow.getFirstName(), false); userDataRow[2] = new ExcelCell(userRow.getLogin(), false); userDataRow[3] = new ExcelCell(getProgressMessage(userRow), false); userDataRow[4] = new ExcelCell(userRow.getTimeTakenSeconds(), false); - userDataRow[5] = new ExcelCell(userMarkValue, false); + userDataRow[5] = isWeighted ? GradebookUtil.createPercentageCell(userRow.getMark(), true) : new ExcelCell(userRow.getMark(), false); rowList.add(userDataRow); } rowList.add(GradebookService.EMPTY_ROW); @@ -1117,13 +1107,7 @@ } userDataRow[count++] = new ExcelCell(userActivityMark, false); } - - Object userMarkValue = userRow.getMark(); - if (userMarkValue != null && isWeighted) { - userMarkValue = GradebookUtil.niceFormatting((Double) userMarkValue, true); - } - - userDataRow[count] = new ExcelCell(userMarkValue, false); + userDataRow[count] = isWeighted ? GradebookUtil.createPercentageCell(userRow.getMark(), true) : new ExcelCell(userRow.getMark(), false); rowList.add(userDataRow); } @@ -1334,7 +1318,7 @@ String startDate = ""; String finishDate = ""; Long timeTakenSeconds = null; - Object mark = null; + Double mark = null; String feedback = ""; // check if learner is participating in this lesson @@ -1385,12 +1369,7 @@ } if (gradebookUserLesson != null) { - Double rawMark = gradebookUserLesson.getMark(); - if (rawMark != null && isWeightedLessonMap.get(lesson.getLessonId())) { - mark = GradebookUtil.niceFormatting(rawMark, true); - } else { - mark = rawMark; - } + mark = gradebookUserLesson.getMark(); feedback = gradebookUserLesson.getFeedback(); } } else { @@ -1403,7 +1382,7 @@ userDataRow[i++] = new ExcelCell(finishDate, false); userDataRow[i++] = new ExcelCell(timeTakenSeconds, false); userDataRow[i++] = new ExcelCell(feedback, false); - userDataRow[i++] = new ExcelCell(mark, false); + userDataRow[i++] = isWeightedLessonMap.get(lesson.getLessonId()) ? GradebookUtil.createPercentageCell(mark, true) : new ExcelCell(mark, false); } rowList.add(userDataRow); @@ -1427,8 +1406,9 @@ User user = (User) userService.findById(User.class, userId); Set selectedLessons = new TreeSet(new LessonComparator()); + Map isWeightedLessonMap = new HashMap(); - // Don't include lesson in list if the user doesnt have permission + // Don't include lesson in list if the user doesn't have permission Integer organisationToCheckPermission = (organisation.getOrganisationType().getOrganisationTypeId() .equals(OrganisationType.COURSE_TYPE)) ? organisation.getOrganisationId() : organisation.getParentOrganisation().getOrganisationId(); @@ -1448,6 +1428,7 @@ } selectedLessons.add(lesson); + isWeightedLessonMap.put(lesson.getLessonId(), isWeightedMarks(lesson.getLearningDesign())); allLearners.addAll(lesson.getAllLearners()); @@ -1480,6 +1461,7 @@ int numberCellsPerRow = simplified ? 3 + selectedLessons.size() + 3 : (selectedLessons.size() * 9) + (allActivities.size() * 2) + 5; + String weightedMessage = messageService.getMessage("label.activity.marks.weighted"); // Lesson names row---------------------- ExcelCell[] lessonsNames = new ExcelCell[numberCellsPerRow]; if (simplified) { @@ -1497,7 +1479,10 @@ for (Lesson lesson : selectedLessons) { List lessonActivities = lessonActivitiesMap.get(lesson.getLessonId()); int numberActivities = lessonActivities.size(); - lessonsNames[i + numberActivities] = new ExcelCell(lesson.getLessonName(), true); + String lessonName = isWeightedLessonMap.get(lesson.getLessonId()) + ? new StringBuilder(lesson.getLessonName()).append(" ").append(weightedMessage).toString() + : lesson.getLessonName(); + lessonsNames[i + numberActivities] = new ExcelCell(lessonName, true); i += 9 + (numberActivities * 2); } i -= 2; @@ -1531,6 +1516,7 @@ Double lessonTotal = 0d; Double lessonMaxMark = 0d; List activities = lessonActivitiesMap.get(lesson.getLessonId()); + Boolean weighted = isWeightedLessonMap.get(lesson.getLessonId()); if (!simplified) { i = addUsernameCells(learner, userRow, i); @@ -1577,9 +1563,22 @@ .get(activity.getActivityId()); GradebookUserActivity gradebookUserActivity = userToGradebookUserActivityMap .get(learner.getUserId()); + + Long rawActivityTotalMarks = 0l; + if (activityToTotalMarkMap.get(activity.getActivityId()) != null) { + rawActivityTotalMarks = activityToTotalMarkMap.get(activity.getActivityId()); + } + Integer weight = weighted && activity.getEvaluation() != null + && activity.getEvaluation().getWeight() != null ? activity.getEvaluation().getWeight() + : null; + Long weightedActivityTotalMarks = weight != null ? weight : rawActivityTotalMarks; + Double mark = 0d; if (gradebookUserActivity != null) { mark = gradebookUserActivity.getMark(); + if ( weight != null ) { + mark = doWeightedMarkCalc(mark, activity, weight, rawActivityTotalMarks); + } if (!simplified) { userRow[i++] = new ExcelCell(mark, false); } @@ -1589,40 +1588,44 @@ } } - Long activityTotalMarks = (activityToTotalMarkMap.get(activity.getActivityId()) != null) - ? activityToTotalMarkMap.get(activity.getActivityId()) - : 0l; if (!simplified) { - userRow[i++] = new ExcelCell(activityTotalMarks, false); + if ( weightedActivityTotalMarks > 0 ) + userRow[i++] = new ExcelCell(weightedActivityTotalMarks, false); + else + userRow[i++] = new ExcelCell("", false); } lessonTotal += mark; overallTotal += mark; - lessonMaxMark += activityTotalMarks; - overallMaxMark += activityTotalMarks; + lessonMaxMark += weightedActivityTotalMarks; + overallMaxMark += weightedActivityTotalMarks; } if (simplified) { - userRow[i++] = new ExcelCell(lessonTotal, ExcelCell.BORDER_STYLE_LEFT_THIN); + if ( weighted ) { + userRow[i++] = GradebookUtil.createPercentageCell(lessonTotal, true, false, ExcelCell.BORDER_STYLE_LEFT_THIN); + } else { + userRow[i++] = new ExcelCell(lessonTotal, ExcelCell.BORDER_STYLE_LEFT_THIN ); + } } else { 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); + + userRow[i++] = GradebookUtil.createPercentageCell(percentage, false, false, ExcelCell.BORDER_STYLE_RIGHT_THICK); } } - ; Double percentage = (overallMaxMark != 0) ? overallTotal / overallMaxMark : 0d; if (simplified) { userRow[i++] = new ExcelCell(overallTotal, ExcelCell.BORDER_STYLE_LEFT_THICK); userRow[i++] = new ExcelCell(overallMaxMark, false); - userRow[i++] = new ExcelCell(percentage, false, ExcelCell.BORDER_STYLE_RIGHT_THICK); + userRow[i++] = GradebookUtil.createPercentageCell(percentage, false, false, ExcelCell.BORDER_STYLE_RIGHT_THICK); } else { i += 2; userRow[i++] = new ExcelCell(overallTotal, ExcelCell.BORDER_STYLE_LEFT_THIN); userRow[i++] = new ExcelCell(overallMaxMark, false); - userRow[i++] = new ExcelCell(percentage, true, ExcelCell.BORDER_STYLE_RIGHT_THICK); + userRow[i++] = GradebookUtil.createPercentageCell(percentage, false, true, ExcelCell.BORDER_STYLE_RIGHT_THICK); } rowList.add(userRow); @@ -1919,23 +1922,28 @@ Double rawMark = inputRawMark != null ? inputRawMark : 0.0; if (useWeightings) { ToolActivity activity = guact.getActivity(); - ActivityEvaluation eval = activity.getEvaluation(); Long maxMark = toolService.getActivityMaxPossibleMark(activity); - if (maxMark == null) { - logger.error(new StringBuilder( - "Unable to correctly calculate weighted mark as no maximum mark is known for activity \"") - .append(activity.getTitle()).append("\" (").append(activity.getActivityId()) - .append("). This activity will be skipped.").toString()); - return 0.0; - } - if (maxMark == 0) { - return 0.0; - } - return rawMark / maxMark * eval.getWeight(); + Integer weight = activity.getEvaluation().getWeight() != null ? activity.getEvaluation().getWeight() : 0; + return doWeightedMarkCalc(rawMark, activity, weight, maxMark); } return rawMark; } + // activity details are user only for the error message. + private Double doWeightedMarkCalc(Double rawMark, ToolActivity activity, Integer weight, Long maxMark) { + if (maxMark == null) { + logger.error(new StringBuilder( + "Unable to correctly calculate weighted mark as no maximum mark is known for activity \"") + .append(activity.getTitle()).append("\" (").append(activity.getActivityId()) + .append("). This activity will be skipped.").toString()); + return 0.0; + } + if (maxMark == 0) { + return 0.0; + } + return rawMark / maxMark * weight; + } + /** * Gets the GBActivityGridRowDTO fro a given activity and lesson * Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookUtil.java =================================================================== diff -u -ra949c337adc53b2df9207aa1de6e500281de7c20 -r39ceb19b74c579d46fb624c3b3ab02fd8e79683a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookUtil.java (.../GradebookUtil.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookUtil.java (.../GradebookUtil.java) (revision 39ceb19b74c579d46fb624c3b3ab02fd8e79683a) @@ -42,12 +42,13 @@ import org.lamsfoundation.lams.gradebook.dto.GradebookGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.comparators.GBAverageMarkComparator; -import org.lamsfoundation.lams.gradebook.dto.comparators.GBMedianTimeTakenComparator; import org.lamsfoundation.lams.gradebook.dto.comparators.GBIDComparator; import org.lamsfoundation.lams.gradebook.dto.comparators.GBMarkComparator; +import org.lamsfoundation.lams.gradebook.dto.comparators.GBMedianTimeTakenComparator; import org.lamsfoundation.lams.gradebook.dto.comparators.GBRowNameComparator; import org.lamsfoundation.lams.gradebook.dto.comparators.GBStartDateComparator; import org.lamsfoundation.lams.gradebook.dto.comparators.GBTimeTakenComparator; +import org.lamsfoundation.lams.util.ExcelCell; import org.lamsfoundation.lams.util.WebUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -181,6 +182,25 @@ } + public static ExcelCell createPercentageCell(Double mark, boolean markConversionNeeded) { + return createPercentageCell(mark, markConversionNeeded, false, 0); + } + +// public static ExcelCell createPercentageCell(Double mark, boolean markConversionNeeded, Boolean isBold) { +// return createPercentageCell(mark, markConversionNeeded, isBold, 0); +// } + + // if markConversionNeeded is true then mark is divided by 100. Otherwise assumes already a percentage. + public static ExcelCell createPercentageCell(Double mark, boolean markConversionNeeded, Boolean isBold, int borderStyle) { + Double convertedMark = null; + if ( mark != null ) + convertedMark = markConversionNeeded ? mark / 100.0 : mark; + + ExcelCell userMarkCell = new ExcelCell(convertedMark, isBold, borderStyle); + userMarkCell.setIsPercentage(true); + return userMarkCell; + } + private static Document getDocument() throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder();