Index: lams_tool_preview/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r4f5eca990931a3d98f22aee38ccb79bb8ce9f153 -r80ad821d3f7342ba66f8ca1140c142cdf88a307a --- lams_tool_preview/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 4f5eca990931a3d98f22aee38ccb79bb8ce9f153) +++ lams_tool_preview/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 80ad821d3f7342ba66f8ca1140c142cdf88a307a) @@ -138,6 +138,8 @@ label.learner = Student label.first.name = First name label.last.name = Last name +label.all.learners = All +label.group = Group label.spa.factor = SPA factor label.total.group.mark = Total team mark label.individual.mark = Individual mark Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/util/SpreadsheetBuilder.java =================================================================== diff -u -r4f5eca990931a3d98f22aee38ccb79bb8ce9f153 -r80ad821d3f7342ba66f8ca1140c142cdf88a307a --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/util/SpreadsheetBuilder.java (.../SpreadsheetBuilder.java) (revision 4f5eca990931a3d98f22aee38ccb79bb8ce9f153) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/util/SpreadsheetBuilder.java (.../SpreadsheetBuilder.java) (revision 80ad821d3f7342ba66f8ca1140c142cdf88a307a) @@ -9,7 +9,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.TreeMap; import java.util.stream.Collectors; import org.apache.commons.lang.StringEscapeUtils; @@ -45,7 +44,11 @@ private IPeerreviewService service; private List sheets; + private ExcelRow titleRow; + private Map criteriaIndexMap = new HashMap<>(); + private int countNonCommentCriteria; + public SpreadsheetBuilder(Peerreview peerreview, IRatingService ratingService, PeerreviewSessionDAO peerreviewSessionDao, PeerreviewUserDAO peerreviewUserDao, IPeerreviewService service) { @@ -60,34 +63,70 @@ // this one is guaranteed to give a consistent order over peerreview.getRatingCriterias() criterias = ratingService.getCriteriasByToolContentId(peerreview.getContentId()); sheets = new LinkedList<>(); + // populate the header row + generateTitleRow(); List sessions = peerreviewSessionDao.getByContentId(peerreview.getContentId()); + + ExcelSheet allLearnersSheet = null; + if (sessions.size() > 1) { + // if there are more than 1 group, we generate a summary All Learners tab + allLearnersSheet = new ExcelSheet(service.getLocalisedMessage("label.all.learners", null)); + sheets.add(allLearnersSheet); + + allLearnersSheet.addEmptyRow(); + allLearnersSheet.addEmptyRow(); + + List allLearnersTitleCells = new LinkedList<>(); + for (ExcelCell cell : titleRow.getCells()) { + if (allLearnersTitleCells.size() == 2) { + // same cells as in groups' tab header row, plus Group column + ExcelCell groupCell = new ExcelCell(service.getLocalisedMessage("label.group", null), true, + ExcelCell.BORDER_STYLE_BOTTOM_THIN); + allLearnersTitleCells.add(groupCell); + } + + allLearnersTitleCells.add(cell); + } + + ExcelRow allLearnersTitleRow = allLearnersSheet.initRow(); + allLearnersTitleRow.setCells(allLearnersTitleCells); + } + for (PeerreviewSession session : sessions) { - generateTeamSheet(session); + List userRows = generateTeamSheet(session); + if (allLearnersSheet != null) { + for (ExcelRow userRow : userRows) { + List allLearnersUserCells = new LinkedList<>(); + for (ExcelCell cell : userRow.getCells()) { + if (allLearnersUserCells.size() == 2) { + // same cells as in groups' tab header row, plus Group column + ExcelCell groupCell = new ExcelCell(session.getSessionName()); + allLearnersUserCells.add(groupCell); + } + + allLearnersUserCells.add(cell); + } + + ExcelRow allLearnersRow = allLearnersSheet.initRow(); + allLearnersRow.setCells(allLearnersUserCells); + } + } } return sheets; } - private void generateTeamSheet(PeerreviewSession session) { - ExcelSheet sessionSheet = new ExcelSheet(session.getSessionName()); - sheets.add(sessionSheet); - - List users = peerreviewUserDao.getBySessionID(session.getSessionId()); - ExcelRow numberOfTeamsRow = sessionSheet.initRow(); - numberOfTeamsRow.addCell(service.getLocalisedMessage("label.number.of.team.members", null), true); - numberOfTeamsRow.addCell(users.size(), IndexedColors.YELLOW); - sessionSheet.addEmptyRow(); - - //Title row - ExcelRow titleRow = sessionSheet.initRow(); + /** + * Prepares a header row used by both All Learners tab and groups' tabs + */ + private void generateTitleRow() { + titleRow = new ExcelRow(); titleRow.addCell(service.getLocalisedMessage("label.first.name", null), true, ExcelCell.BORDER_STYLE_BOTTOM_THIN); titleRow.addCell(service.getLocalisedMessage("label.last.name", null), true, ExcelCell.BORDER_STYLE_BOTTOM_THIN); - Map criteriaIndexMap = new HashMap<>(); - int countNonCommentCriteria = 0; Integer previousRatingCriteriaGroupId = null; for (RatingCriteria criteria : criterias) { @@ -124,15 +163,22 @@ ExcelCell.BORDER_STYLE_BOTTOM_THIN); titleRow.addCell(service.getLocalisedMessage("label.individual.mark", null), true, ExcelCell.BORDER_STYLE_BOTTOM_THIN); + } - Map userNames = new TreeMap<>(); - Map userMap = new HashMap<>(); - for (PeerreviewUser user : users) { - userMap.put(user.getUserId(), user); - userNames.put(user.getUserId(), - StringEscapeUtils.escapeCsv(user.getFirstName() + " " + user.getLastName())); - } + private List generateTeamSheet(PeerreviewSession session) { + List userRows = new LinkedList<>(); + ExcelSheet sessionSheet = new ExcelSheet(session.getSessionName()); + sheets.add(sessionSheet); + + List users = peerreviewUserDao.getBySessionID(session.getSessionId()); + ExcelRow numberOfTeamsRow = sessionSheet.initRow(); + numberOfTeamsRow.addCell(service.getLocalisedMessage("label.number.of.team.members", null), true); + numberOfTeamsRow.addCell(users.size(), IndexedColors.YELLOW); + sessionSheet.addEmptyRow(); + + sessionSheet.addRow(titleRow); + // uses same index as the user row, so allow for the name in the first column Double[] criteriaMarkSum = new Double[countNonCommentCriteria + 1]; Integer[] criteriaMarkCount = new Integer[countNonCommentCriteria + 1]; @@ -141,10 +187,11 @@ criteriaMarkCount[i] = 0; } + Map userMap = users.stream().collect(Collectors.toMap(PeerreviewUser::getUserId, u -> u)); Map userRowMap = new HashMap<>(); // Process all the criterias and build up rows for each rated user. Store in temporary map. List ratingDtos = service.getRatingCriteriaDtos(session.getPeerreview().getContentId(), - session.getSessionId(), userNames.keySet(), true, -1L); + session.getSessionId(), userMap.keySet(), true, -1L); for (ItemRatingDTO ratingDto : ratingDtos) { double userMarkSum = 0D; double[] userRowData = new double[countNonCommentCriteria]; @@ -197,7 +244,7 @@ // the map is: itemId (who was rated) -> userId (who rated) -> rating from all categories Map>> ratings = ratingService - .getRatingsByCriteriasAndItems(criteriaIndexMap.keySet(), userNames.keySet()).stream() + .getRatingsByCriteriasAndItems(criteriaIndexMap.keySet(), userMap.keySet()).stream() .filter(rating -> rating.getRating() != null) .collect(Collectors.groupingBy(Rating::getItemId, Collectors .groupingBy(rating -> rating.getLearner().getUserId().longValue(), Collectors.toSet()))); @@ -207,8 +254,8 @@ ExcelRow userRow = userRowMap.get(user.getUserId()); if (userRow == null) { userRow = sessionSheet.initRow(); - userRow.addCell(userNames.get(user.getUserId())); - + userRow.addCell(StringEscapeUtils.escapeCsv(user.getFirstName())); + userRow.addCell(StringEscapeUtils.escapeCsv(user.getLastName())); } else { Double learnerAverage = (Double) userRow.getCell(userRow.getCells().size() - 1); Double spa = countNonCommentCriteria > 0 ? roundTo2Places(learnerAverage / finalGroupAverage) : 0D; @@ -263,6 +310,8 @@ userRow.addCell("", IndexedColors.GREEN); sessionSheet.addRow(userRow); + + userRows.add(userRow); } } @@ -280,19 +329,21 @@ if (criteria.isHedgeStyleRating()) { // just need the first entry as it is the same for everyone - the justification if (users.size() > 0) { - generateUsersComments(session, sessionSheet, userNames, criteria, users.get(0), false); + generateUsersComments(session, sessionSheet, userMap, criteria, users.get(0), false); } } else { for (PeerreviewUser user : users) { - generateUsersComments(session, sessionSheet, userNames, criteria, user, true); + generateUsersComments(session, sessionSheet, userMap, criteria, user, true); } } } } + + return userRows; } - private void generateUsersComments(PeerreviewSession session, ExcelSheet sessionSheet, Map userNames, - RatingCriteria criteria, PeerreviewUser user, boolean showForName) { + private void generateUsersComments(PeerreviewSession session, ExcelSheet sessionSheet, + Map userMap, RatingCriteria criteria, PeerreviewUser user, boolean showForName) { sessionSheet.addEmptyRow(); List comments = peerreviewUserDao.getDetailedRatingsComments(session.getPeerreview().getContentId(), @@ -302,13 +353,16 @@ if (comment[1] != null) { if (showForName && !isUserNameRowPrinted) { ExcelRow userNameRow = sessionSheet.initRow(); - userNameRow.addCell(service.getLocalisedMessage("label.for.user", - new Object[] { userNames.get(user.getUserId()) })); + userNameRow.addCell(service.getLocalisedMessage("label.for.user", new Object[] { + StringEscapeUtils.escapeCsv(user.getFirstName() + " " + user.getLastName()) })); isUserNameRowPrinted = true; } ExcelRow commentRow = sessionSheet.initRow(); - commentRow.addCell(userNames.get(((BigInteger) comment[0]).longValue())); + Long commentingUserId = ((BigInteger) comment[0]).longValue(); + PeerreviewUser commentingUser = userMap.get(commentingUserId); + commentRow.addCell(StringEscapeUtils.escapeCsv(commentingUser.getFirstName())); + commentRow.addCell(StringEscapeUtils.escapeCsv(commentingUser.getLastName())); commentRow.addCell(StringUtils.replace((String) comment[1], "
", "\n")); } }