Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/ScratchieConstants.java =================================================================== diff -u -re8a7110708b15579af2c6b31ac52a6da427fef6d -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/ScratchieConstants.java (.../ScratchieConstants.java) (revision e8a7110708b15579af2c6b31ac52a6da427fef6d) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/ScratchieConstants.java (.../ScratchieConstants.java) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -124,6 +124,8 @@ public static final String ATTR_ITEM = "item"; public static final String ATTR_SCORE = "score"; + + public static final String ATTR_SCORE_PERCENTAGE = "scorePercentage"; public static final String ATTR_MAX_SCORE = "maxScore"; Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java =================================================================== diff -u -ra2a36ce7bc346fb2775998134f5f5ea3a9391698 -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java (.../ScratchieItem.java) (revision a2a36ce7bc346fb2775998134f5f5ea3a9391698) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java (.../ScratchieItem.java) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -52,7 +52,7 @@ private static final long serialVersionUID = -2824051249870361117L; private static final Logger log = Logger.getLogger(ScratchieItem.class); - + @Column(name = "scratchie_uid") private Long scratchieUid; @@ -63,6 +63,8 @@ private String burningQuestion; @Transient private List optionDtos = null; + @Transient + private int mark; @Override public Object clone() { @@ -80,7 +82,7 @@ public List getOptionDtos() { if (optionDtos == null) { optionDtos = new LinkedList<>(); - + if (QbQuestion.TYPE_MULTIPLE_CHOICE == this.qbQuestion.getType()) { for (QbOption qbOption : qbQuestion.getQbOptions()) { OptionDTO optionDTO = new OptionDTO(qbOption); @@ -111,4 +113,12 @@ this.burningQuestion = burningQuestion; } + public int getMark() { + return mark; + } + + public void setMark(int mark) { + this.mark = mark; + } + } \ No newline at end of file Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java =================================================================== diff -u -ra34930f8fa7bcceb2f7849fb2f0f38966a674ec0 -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision a34930f8fa7bcceb2f7849fb2f0f38966a674ec0) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -85,6 +85,11 @@ // Collection items); /** + * Calculates and sets a mark in each item. + */ + void populateScratchieItemsWithMarks(Scratchie scratchie, Collection items, long sessionId); + + /** * Returns all activities that precede specified activity and produce confidence levels. * * @param toolContentId Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r365a2c22199a5fe2b1e55e18cbf4b6d2596f202b -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 365a2c22199a5fe2b1e55e18cbf4b6d2596f202b) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -484,16 +484,16 @@ @Override public void recalculateMarkForSession(Long sessionId, boolean isPropagateToGradebook) { - List userLogs = scratchieAnswerVisitDao.getLogsBySession(sessionId); ScratchieSession session = getScratchieSessionBySessionId(sessionId); Scratchie scratchie = session.getScratchie(); Set items = scratchie.getScratchieItems(); - String[] presetMarks = getPresetMarks(scratchie); + populateScratchieItemsWithMarks(scratchie, scratchie.getScratchieItems(), sessionId); + // calculate mark int mark = 0; for (ScratchieItem item : items) { - mark += ScratchieServiceImpl.getUserMarkPerItem(scratchie, item, userLogs, presetMarks); + mark += item.getMark(); } // change mark for all learners in a group @@ -627,6 +627,8 @@ ScratchieSession session = this.getScratchieSessionBySessionId(toolSessionId); session.setScratchingFinished(true); scratchieSessionDao.saveObject(session); + + recalculateMarkForSession(toolSessionId, false); } @Override @@ -1012,34 +1014,29 @@ return false; } - /** - * - * @param scratchie - * @param item - * @param userLogs - * uses list of logs to reduce number of queries to DB - * @param presetMarks - * presetMarks to reduce number of queries to DB - * @return - */ - private static int getUserMarkPerItem(Scratchie scratchie, ScratchieItem item, - List userLogs, String[] presetMarks) { + @Override + public void populateScratchieItemsWithMarks(Scratchie scratchie, Collection items, long sessionId) { + List userLogs = scratchieAnswerVisitDao.getLogsBySession(sessionId); + String[] presetMarks = getPresetMarks(scratchie); - int mark = 0; - // add mark only if an item was unraveled - if (ScratchieServiceImpl.isItemUnraveled(item, userLogs)) { - int itemAttempts = ScratchieServiceImpl.getNumberAttemptsForItem(userLogs, item); - String markStr = (itemAttempts <= presetMarks.length) ? presetMarks[itemAttempts - 1] - : presetMarks[presetMarks.length - 1]; - mark = Integer.parseInt(markStr); + for (ScratchieItem item : items) { + // get lowest mark by default + int mark = Integer.parseInt(presetMarks[presetMarks.length - 1]); + // add mark only if an item was unravelled + // add mark only if an item was unraveled + if (ScratchieServiceImpl.isItemUnraveled(item, userLogs)) { + int itemAttempts = ScratchieServiceImpl.getNumberAttemptsForItem(userLogs, item); + String markStr = (itemAttempts <= presetMarks.length) ? presetMarks[itemAttempts - 1] + : presetMarks[presetMarks.length - 1]; + mark = Integer.parseInt(markStr); - // add extra point if needed - if (scratchie.isExtraPoint() && (itemAttempts == 1)) { - mark++; + // add extra point if needed + if (scratchie.isExtraPoint() && (itemAttempts == 1)) { + mark++; + } } + item.setMark(mark); } - - return mark; } /** @@ -1946,8 +1943,6 @@ @Override public List getSummaryByTeam(Scratchie scratchie, Collection sortedItems) { List groupSummaries = new ArrayList<>(); - String[] presetMarks = getPresetMarks(scratchie); - List sessionList = scratchieSessionDao.getByContentId(scratchie.getContentId()); for (ScratchieSession session : sessionList) { Long sessionId = session.getSessionId(); @@ -1958,6 +1953,8 @@ ScratchieUser groupLeader = session.getGroupLeader(); List logs = scratchieAnswerVisitDao.getLogsBySession(sessionId); + populateScratchieItemsWithMarks(scratchie, sortedItems, sessionId); + for (ScratchieItem item : sortedItems) { ScratchieItemDTO itemDto = new ScratchieItemDTO(); int numberOfAttempts = 0; @@ -1980,8 +1977,7 @@ numberOfAttempts = visitLogs.size(); // for displaying purposes if there is no attemps we assign -1 which will be shown as "-" - mark = (numberOfAttempts == 0) ? -1 - : ScratchieServiceImpl.getUserMarkPerItem(scratchie, item, logs, presetMarks); + mark = (numberOfAttempts == 0) ? -1 : item.getMark(); isUnraveledOnFirstAttempt = (numberOfAttempts == 1) && ScratchieServiceImpl.isItemUnraveled(item, logs); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java =================================================================== diff -u -re70d22896bf0c9b2de87b20738b0c8c749fd3bf7 -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java (.../LearningController.java) (revision e70d22896bf0c9b2de87b20738b0c8c749fd3bf7) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java (.../LearningController.java) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -211,7 +211,8 @@ } } - storeItemsToSessionMap(toolSessionID, scratchie, sessionMap, mode.isTeacher()); + Collection items = storeItemsToSessionMap(toolSessionID, scratchie, sessionMap, + mode.isTeacher()); sessionMap.put(ScratchieConstants.ATTR_SCRATCHIE, scratchie); // calculate max score @@ -284,6 +285,15 @@ } } + if (mode.isTeacher()) { + scratchieService.populateScratchieItemsWithMarks(scratchie, items, toolSessionID); + // get updated score from ScratchieSession + int score = toolSession.getMark(); + request.setAttribute(ScratchieConstants.ATTR_SCORE, score); + int percentage = (maxScore == 0) ? 0 : ((score * 100) / maxScore); + request.setAttribute(ScratchieConstants.ATTR_SCORE_PERCENTAGE, percentage); + } + sessionMap.put(ScratchieConstants.ATTR_IS_SCRATCHING_FINISHED, isScratchingFinished); // make non-leaders wait for notebook to be submitted, if required sessionMap.put(ScratchieConstants.ATTR_IS_WAITING_FOR_LEADER_TO_SUBMIT_NOTEBOOK, @@ -295,8 +305,8 @@ /** * Stores into session map all data needed to display scratchies and options */ - private void storeItemsToSessionMap(Long toolSessionId, Scratchie scratchie, SessionMap sessionMap, - boolean showOrder) { + private Collection storeItemsToSessionMap(Long toolSessionId, Scratchie scratchie, + SessionMap sessionMap, boolean showOrder) { // set scratched flag for display purpose Collection items = scratchieService.getItemsWithIndicatedScratches(toolSessionId); @@ -352,6 +362,7 @@ } sessionMap.put(ScratchieConstants.ATTR_ITEM_LIST, items); + return items; } /** @@ -549,9 +560,10 @@ // get updated score from ScratchieSession int score = toolSession.getMark(); + request.setAttribute(ScratchieConstants.ATTR_SCORE, score); int maxScore = (Integer) sessionMap.get(ScratchieConstants.ATTR_MAX_SCORE); - double percentage = (maxScore == 0) ? 0 : ((score * 100) / maxScore); - request.setAttribute(ScratchieConstants.ATTR_SCORE, (int) percentage); + int percentage = (maxScore == 0) ? 0 : ((score * 100) / maxScore); + request.setAttribute(ScratchieConstants.ATTR_SCORE_PERCENTAGE, percentage); // display other groups' BurningQuestions if (isBurningQuestionsEnabled) { @@ -585,7 +597,8 @@ } if (scratchie.isShowScrachiesInResults()) { - storeItemsToSessionMap(toolSessionId, scratchie, sessionMap, true); + Collection items = storeItemsToSessionMap(toolSessionId, scratchie, sessionMap, true); + scratchieService.populateScratchieItemsWithMarks(scratchie, items, toolSessionId); request.setAttribute(ScratchieConstants.ATTR_SHOW_RESULTS, true); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/TblMonitorController.java =================================================================== diff -u -r7fdda695e029753cdb6cbd771cf897080afc942c -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/TblMonitorController.java (.../TblMonitorController.java) (revision 7fdda695e029753cdb6cbd771cf897080afc942c) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/TblMonitorController.java (.../TblMonitorController.java) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -24,7 +24,6 @@ package org.lamsfoundation.lams.tool.scratchie.web.controller; import java.io.IOException; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -39,29 +38,23 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringEscapeUtils; -import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.lamsfoundation.lams.qb.model.QbQuestion; import org.lamsfoundation.lams.tool.scratchie.ScratchieConstants; import org.lamsfoundation.lams.tool.scratchie.dto.BurningQuestionDTO; import org.lamsfoundation.lams.tool.scratchie.dto.BurningQuestionItemDTO; import org.lamsfoundation.lams.tool.scratchie.dto.GroupSummary; import org.lamsfoundation.lams.tool.scratchie.dto.OptionDTO; import org.lamsfoundation.lams.tool.scratchie.dto.ScratchieItemDTO; import org.lamsfoundation.lams.tool.scratchie.model.Scratchie; -import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswerVisitLog; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieConfigItem; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieItem; -import org.lamsfoundation.lams.tool.scratchie.model.ScratchieSession; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieUser; import org.lamsfoundation.lams.tool.scratchie.service.IScratchieService; import org.lamsfoundation.lams.tool.scratchie.service.ScratchieServiceImpl; import org.lamsfoundation.lams.tool.scratchie.util.ScratchieItemComparator; import org.lamsfoundation.lams.util.AlphanumComparator; import org.lamsfoundation.lams.util.FileUtil; import org.lamsfoundation.lams.util.WebUtil; -import org.lamsfoundation.lams.util.excel.ExcelRow; import org.lamsfoundation.lams.util.excel.ExcelSheet; import org.lamsfoundation.lams.util.excel.ExcelUtil; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -101,7 +94,7 @@ if (attemptedLearnersNumber != 0) { List groupSummaries = scratchieService.getSummaryByTeam(scratchie, items); - + //calculate what is the percentage of first choice events in each session for (GroupSummary summary : groupSummaries) { int numberOfFirstChoiceEvents = 0; @@ -110,11 +103,11 @@ numberOfFirstChoiceEvents++; } } - + Double percentage = (items.size() == 0) ? 0 : (double) numberOfFirstChoiceEvents * 100 / items.size(); summary.setTotalPercentage(percentage.toString()); } - + request.setAttribute("groupSummaries", groupSummaries); } @@ -159,7 +152,7 @@ itemDto.setOptionDtos(optionDtos); i++; } - + //calculate what is the percentage of first choice events in each session int numberOfFirstChoiceEvents = 0; for (ScratchieItemDTO itemDto : summary.getItemDtos()) { @@ -168,8 +161,12 @@ } } summary.setMark(numberOfFirstChoiceEvents); - Double percentage = (items.size() == 0) ? 0 : (double) numberOfFirstChoiceEvents * 100 / items.size(); - summary.setTotalPercentage(percentage.toString()); + + // round the percentage cell + String totalPercentage = String.valueOf( + Math.round((items.size() == 0) ? 0 : (double) numberOfFirstChoiceEvents * 100 / items.size())); + summary.setTotalPercentage(totalPercentage); + } request.setAttribute("sessionDtos", groupSummaries); Index: lams_tool_scratchie/web/includes/css/scratchie-learning.scss =================================================================== diff -u -re8a7110708b15579af2c6b31ac52a6da427fef6d -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/web/includes/css/scratchie-learning.scss (.../scratchie-learning.scss) (revision e8a7110708b15579af2c6b31ac52a6da427fef6d) +++ lams_tool_scratchie/web/includes/css/scratchie-learning.scss (.../scratchie-learning.scss) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -85,4 +85,8 @@ border: none; color:black; box-shadow:none; +} + +.item-score { + font-weight: bold; } \ No newline at end of file Index: lams_tool_scratchie/web/pages/learning/learning.jsp =================================================================== diff -u -ra65568cc36db07abf19550359c0db03a9561c964 -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/web/pages/learning/learning.jsp (.../learning.jsp) (revision a65568cc36db07abf19550359c0db03a9561c964) +++ lams_tool_scratchie/web/pages/learning/learning.jsp (.../learning.jsp) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -358,6 +358,17 @@ + +
+ + + ${score} + ${scorePercentage} + + +
+
+
Index: lams_tool_scratchie/web/pages/learning/results.jsp =================================================================== diff -u -re70d22896bf0c9b2de87b20738b0c8c749fd3bf7 -r1268ec552ee72a22db3a5df680d46de7db79e0c0 --- lams_tool_scratchie/web/pages/learning/results.jsp (.../results.jsp) (revision e70d22896bf0c9b2de87b20738b0c8c749fd3bf7) +++ lams_tool_scratchie/web/pages/learning/results.jsp (.../results.jsp) (revision 1268ec552ee72a22db3a5df680d46de7db79e0c0) @@ -18,7 +18,9 @@ <fmt:message key="label.learning.title" /> <%@ include file="/common/header.jsp"%> - + + + @@ -364,7 +370,8 @@ - ${score}% + ${score} + ${scorePercentage}