Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java =================================================================== diff -u -rf6247c953cc7bf9a17d4025ea8e8728ae55c11ed -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java (.../ILearningDesignService.java) (revision f6247c953cc7bf9a17d4025ea8e8728ae55c11ed) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java (.../ILearningDesignService.java) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Vector; import org.lamsfoundation.lams.learningdesign.LearningDesign; @@ -119,4 +120,9 @@ * it returns tool content ID of a matching tRAT / iRAT activity. */ Long findMatchingRatActivity(long toolContentId); -} + + /** + * Fills map with meta information about available activity types in the learning design. + */ + Map getAvailableTBLActivityTypes(Long learningDesignId); +} \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java =================================================================== diff -u -r6be225f8d21a7f927da78ca099fc8c3915d7668a -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -29,22 +29,29 @@ import java.util.Calendar; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Set; +import java.util.TreeSet; import java.util.Vector; import org.apache.log4j.Logger; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ActivityOrderComparator; +import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.ComplexActivity; +import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Group; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.LearningLibrary; import org.lamsfoundation.lams.learningdesign.ParallelActivity; +import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; @@ -556,6 +563,99 @@ return verifyNextActivityFitsTbl(firstActivity, "Grouping", iRatToolContentId, tRatToolContentId); } + public Map getAvailableTBLActivityTypes(Long learningDesignId) { + Map result = new HashMap<>(); + + LearningDesign learningDesign = getLearningDesign(learningDesignId); + Activity firstActivity = activityDAO.getActivityByActivityId(learningDesign.getFirstActivity().getActivityId()); + List activities = new ArrayList<>(); + sortActivitiesByLearningDesignOrder(firstActivity, activities); + + //check if there is Scratchie activity. It's used only in case of LKC TBL monitoring, when all assessment are treated as AEs + boolean isScratchieAvailable = false; + for (Activity activity : activities) { + if (activity instanceof ToolActivity) { + ToolActivity toolActivity = (ToolActivity) activity; + String toolSignature = toolActivity.getTool().getToolSignature(); + if (CommonConstants.TOOL_SIGNATURE_SCRATCHIE.equals(toolSignature)) { + isScratchieAvailable = true; + break; + } + } + } + + boolean scratchiePassed = false; + boolean iraPassed = false; + String aeToolContentIds = ""; + String aeToolTypes = ""; + String aeActivityTitles = ""; + for (Activity activity : activities) { + if (activity instanceof ToolActivity) { + ToolActivity toolActivity = (ToolActivity) activity; + String toolSignature = toolActivity.getTool().getToolSignature(); + Long toolContentId = toolActivity.getToolContentId(); + Long toolActivityId = toolActivity.getActivityId(); + String toolTitle = toolActivity.getTitle(); + + //count only the first MCQ or Assessmnet as iRA + if (!iraPassed && (CommonConstants.TOOL_SIGNATURE_MCQ.equals(toolSignature) + || isScratchieAvailable && CommonConstants.TOOL_SIGNATURE_ASSESSMENT.equals(toolSignature))) { + iraPassed = true; + if (CommonConstants.TOOL_SIGNATURE_MCQ.equals(toolSignature)) { + result.put("isIraMcqAvailable", true); + } else { + result.put("isIraAssessmentAvailable", true); + } + result.put("iraToolContentId", toolContentId); + result.put("iraToolActivityId", toolActivityId); + + continue; + } + + //aes are counted only after Scratchie activity, or for LKC TBL monitoring + if ((scratchiePassed || !isScratchieAvailable) + && (CommonConstants.TOOL_SIGNATURE_ASSESSMENT.equals(toolSignature) + || CommonConstants.TOOL_SIGNATURE_DOKU.equals(toolSignature))) { + result.put("isAeAvailable", true); + //prepare assessment details to be passed to Assessment tool + aeToolContentIds += toolContentId + ","; + aeToolTypes += CommonConstants.TOOL_SIGNATURE_DOKU.equals(toolSignature) ? "d," : "a,"; + aeActivityTitles += toolTitle + "\\,"; + + } else if (CommonConstants.TOOL_SIGNATURE_FORUM.equals(toolSignature)) { + result.put("isForumAvailable", true); + result.put("forumActivityId", toolActivityId); + + } else if (CommonConstants.TOOL_SIGNATURE_PEER_REVIEW.equals(toolSignature)) { + result.put("isPeerreviewAvailable", true); + result.put("peerreviewToolContentId", toolContentId); + + //tRA is the first scratchie activity + } else if (!scratchiePassed && CommonConstants.TOOL_SIGNATURE_SCRATCHIE.equals(toolSignature)) { + scratchiePassed = true; + + result.put("isScratchieAvailable", true); + result.put("traToolContentId", toolContentId); + result.put("traToolActivityId", toolActivityId); + } + + if (CommonConstants.TOOL_SIGNATURE_LEADERSELECTION.equals(toolSignature)) { + result.put("leaderselectionToolActivityId", toolActivityId); + result.put("leaderselectionToolContentId", toolContentId); + } + + } else if (activity instanceof GateActivity) { + result.put("isGatesAvailable", true); + } + } + + result.put("aeToolContentIds", aeToolContentIds); + result.put("aeToolTypes", aeToolTypes); + result.put("aeActivityTitles", aeActivityTitles); + + return result; + } + /** * Traverses the learning design verifying it follows typical TBL structure. * Also returns matching iRAT / tRAT activity to the provided iRatToolContentId or tRatToolContentId. @@ -659,6 +759,55 @@ } /** + * Get learning design activities sorted by the sequence order. + */ + @SuppressWarnings("unchecked") + private void sortActivitiesByLearningDesignOrder(Activity activity, List sortedActivities) { + sortedActivities.add(activity); + + //in case of branching activity - add all activities based on their orderId + if (activity.isBranchingActivity()) { + BranchingActivity branchingActivity = (BranchingActivity) activity; + Set sequenceActivities = new TreeSet<>(new ActivityOrderComparator()); + sequenceActivities.addAll((Set) (Set) branchingActivity.getActivities()); + for (Activity sequenceActivityNotInitialized : sequenceActivities) { + SequenceActivity sequenceActivity = (SequenceActivity) activityDAO.getActivityByActivityId( + sequenceActivityNotInitialized.getActivityId(), SequenceActivity.class); + Set childActivities = new TreeSet<>(new ActivityOrderComparator()); + childActivities.addAll(sequenceActivity.getActivities()); + + //add one by one in order to initialize all activities + for (Activity childActivity : childActivities) { + Activity activityInit = activityDAO.getActivityByActivityId(childActivity.getActivityId()); + sortedActivities.add(activityInit); + } + } + + // In case of complex activity (parallel, help or optional activity) add all its children activities. + // They will be sorted by orderId + } else if (activity.isComplexActivity()) { + ComplexActivity complexActivity = (ComplexActivity) activity; + Set childActivities = new TreeSet<>(new ActivityOrderComparator()); + childActivities.addAll(complexActivity.getActivities()); + + // add one by one in order to initialize all activities + for (Activity childActivity : childActivities) { + Activity activityInit = activityDAO.getActivityByActivityId(childActivity.getActivityId()); + sortedActivities.add(activityInit); + } + } + + Transition transitionFrom = activity.getTransitionFrom(); + if (transitionFrom != null) { + // query activity from DB as transition holds only proxied activity object + Long nextActivityId = transitionFrom.getToActivity().getActivityId(); + Activity nextActivity = activityDAO.getActivityByActivityId(nextActivityId); + + sortActivitiesByLearningDesignOrder(nextActivity, sortedActivities); + } + } + + /** * Check if the given groups are default for chosen grouping. There is actually no good way to detect this, but even * if a custom grouping is mistaken for the default one, it should bring little harm. */ @@ -677,4 +826,5 @@ } return true; } + } \ No newline at end of file Index: lams_gradebook/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rbd13b83b911909f41514dc2800e42dcff6e40ed3 -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision bd13b83b911909f41514dc2800e42dcff6e40ed3) +++ lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -63,6 +63,7 @@ gradebook.gridtitle.lesson.view = Lesson View gradebook.gridtitle.learner.view = Grades by learner label.button.export.selected.lessons = Export selected lessons +label.button.export.tbl = Export TBL lessons label.lessons = Lessons label.group = Group label.max.possible = Max mark available Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml =================================================================== diff -u -r81b83a2cbd3cfe68e9096211cd0df9eada37fc4a -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml (.../gradebookApplicationContext.xml) (revision 81b83a2cbd3cfe68e9096211cd0df9eada37fc4a) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml (.../gradebookApplicationContext.xml) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -17,6 +17,7 @@ + Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r4926c338950b14089e996697df38ff481048da79 -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 4926c338950b14089e996697df38ff481048da79) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -74,6 +74,7 @@ import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.learningdesign.dto.ActivityURL; +import org.lamsfoundation.lams.learningdesign.service.ILearningDesignService; import org.lamsfoundation.lams.lesson.CompletedActivityProgress; import org.lamsfoundation.lams.lesson.CompletedActivityProgressArchive; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -164,6 +165,7 @@ private ILearnerProgressDAO learnerProgressDAO; private ILessonDAO lessonDAO; private ILessonService lessonService; + private ILearningDesignService learningDesignService; private IUserManagementService userService; private IActivityDAO activityDAO; private MessageService messageService; @@ -1753,6 +1755,76 @@ } @Override + public List exportCourseTBLGradebook(Integer userId, Integer organisationId) { + List sheets = new LinkedList<>(); + + // The entire data list + ExcelSheet sheet = new ExcelSheet(getMessage("gradebook.exportcourse.course.summary")); + sheets.add(sheet); + ExcelRow headerRow = sheet.initRow(); + headerRow.addCell(getMessage("gradebook.export.login"), true); + headerRow.addCell(getMessage("gradebook.export.last.name"), true); + headerRow.addCell(getMessage("gradebook.export.first.name"), true); + + List lessons = getTBLLessons(organisationId, userId); + Map iRatActivityIds = new HashMap<>(); + Map tRatActivityIds = new HashMap<>(); + Set allLearners = new TreeSet<>(); + for (Lesson lesson : lessons) { + headerRow.addCell(lesson.getLessonName() + " iRAT", true); + headerRow.addCell(lesson.getLessonName() + " tRAT", true); + + Map activityTypes = learningDesignService + .getAvailableTBLActivityTypes(lesson.getLearningDesign().getLearningDesignId()); + iRatActivityIds.put(lesson.getLessonId(), (Long) activityTypes.get("iraToolActivityId")); + tRatActivityIds.put(lesson.getLessonId(), (Long) activityTypes.get("traToolActivityId")); + + Set lessonLearners = lesson.getAllLearners(); + allLearners.addAll(lessonLearners); + } + + for (User learner : allLearners) { + ExcelRow userDataRow = sheet.initRow(); + userDataRow.addCell(learner.getLogin()); + userDataRow.addCell(learner.getLastName()); + userDataRow.addCell(learner.getFirstName()); + for (Lesson lesson : lessons) { + Long iRatActivityId = iRatActivityIds.get(lesson.getLessonId()); + Double mark = null; + if (iRatActivityId != null) { + GradebookUserActivity gradebookUserActivity = getGradebookUserActivity(iRatActivityId, + learner.getUserId()); + if (gradebookUserActivity != null && gradebookUserActivity.getMark() != null) { + mark = gradebookUserActivity.getMark(); + } + } + if (mark == null) { + userDataRow.addEmptyCell(); + } else { + userDataRow.addCell(GradebookUtil.niceFormatting(mark)); + } + + Long tRatActivityId = tRatActivityIds.get(lesson.getLessonId()); + mark = null; + if (tRatActivityId != null) { + GradebookUserActivity gradebookUserActivity = getGradebookUserActivity(tRatActivityId, + learner.getUserId()); + if (gradebookUserActivity != null && gradebookUserActivity.getMark() != null) { + mark = gradebookUserActivity.getMark(); + } + } + if (mark == null) { + userDataRow.addEmptyCell(); + } else { + userDataRow.addCell(GradebookUtil.niceFormatting(mark)); + } + } + } + + return sheets; + } + + @Override @SuppressWarnings("unchecked") public List exportCourseGradebook(Integer userId, Integer organisationId) { List sheets = new LinkedList<>(); @@ -2194,6 +2266,20 @@ return sheets; } + private List getTBLLessons(Integer organisationId, Integer userId) { + Set lessons = new TreeSet<>(new LessonComparator()); + lessons.addAll(lessonService.getLessonsByGroupAndUser(userId, organisationId)); + + List tblLessons = new LinkedList<>(); + for (Lesson lesson : lessons) { + boolean isTblLesson = learningDesignService.isTBLSequence(lesson.getLearningDesign().getLearningDesignId()); + if (isTblLesson) { + tblLessons.add(lesson); + } + } + return tblLessons; + } + private void addUsernameCells(User learner, ExcelRow userRow) { //first, last names and login String lastName = (learner.getLastName() == null) ? "" : learner.getLastName().toUpperCase(); @@ -2902,6 +2988,10 @@ this.lessonService = lessonService; } + public void setLearningDesignService(ILearningDesignService learningDesignService) { + this.learningDesignService = learningDesignService; + } + public void setUserService(IUserManagementService userService) { this.userService = userService; } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java =================================================================== diff -u -r1f334c44b5fb73e7999b8e0497e41441537e6b5d -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision 1f334c44b5fb73e7999b8e0497e41441537e6b5d) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -232,6 +232,7 @@ * @param userID * @return */ + @Override GradebookUserActivity getGradebookUserActivity(Long activityID, Integer userID); /** @@ -283,19 +284,16 @@ /** * Get the summary data for course in order to create excel export - * - * @param userId - * @param organisationId - * @return */ List exportCourseGradebook(Integer userId, Integer organisationId); /** + * Get the summary data for course TBL lessons in order to create excel export + */ + List exportCourseTBLGradebook(Integer userId, Integer organisationId); + + /** * Get the summary data for selected lessons in order to create excel export - * - * @param userId - * @param organisationId - * @return */ List exportSelectedLessonsGradebook(Integer userId, Integer organisationId, String[] lessonIds, boolean simplified); @@ -313,4 +311,5 @@ /** Get a summary of the weightings */ List getWeights(LearningDesign design); + } \ No newline at end of file Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java =================================================================== diff -u -rf3e44aee5373a1233080ea5acd1cb5959bb46544 -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java (.../GradebookMonitoringController.java) (revision f3e44aee5373a1233080ea5acd1cb5959bb46544) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java (.../GradebookMonitoringController.java) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -148,7 +148,8 @@ } if (!securityService.hasOrgRole(organisationID, user.getUserID(), new String[] { Role.GROUP_MANAGER, Role.MONITOR }, "get course gradebook page")) { - response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a course manager in the organisation"); + response.sendError(HttpServletResponse.SC_FORBIDDEN, + "User is not a course manager or monitor in the organisation"); return null; } @@ -368,7 +369,7 @@ throws IOException { Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); if (!securityService.isLessonMonitor(lessonID, getUser().getUserID(), "export lesson gradebook spreadsheet")) { - response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson"); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a group manager in the lesson"); } if (log.isDebugEnabled()) { @@ -392,6 +393,40 @@ } /** + * Exports TBL lessons in course to spreadsheet + */ + @RequestMapping("/exportExcelTBLGradebook") + @ResponseBody + public void exportExcelTBLGradebook(HttpServletRequest request, HttpServletResponse response) throws IOException { + Integer organisationID = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID); + UserDTO user = getUser(); + if (!securityService.hasOrgRole(organisationID, user.getUserID(), new String[] { Role.GROUP_MANAGER }, + "get course TBL gradebook spreadsheet")) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a group manager in the organisation"); + return; + } + + Organisation organisation = (Organisation) userManagementService.findById(Organisation.class, organisationID); + if (log.isDebugEnabled()) { + log.debug("Exporting to a spreadsheet course TBL lessons: " + organisationID); + } + List sheets = gradebookService.exportCourseTBLGradebook(user.getUserID(), organisationID); + + String fileName = organisation.getName().replaceAll(" ", "_") + "_TBL.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 + WebUtil.setFileDownloadTokenCookie(request, response); + + // Code to generate file and write file contents to response + ServletOutputStream out = response.getOutputStream(); + ExcelUtil.createExcel(out, sheets, gradebookService.getMessage("gradebook.export.dateheader"), true); + } + + /** * Exports Course Gradebook into excel. */ @RequestMapping("/exportExcelCourseGradebook") @@ -400,9 +435,11 @@ throws IOException { Integer organisationID = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID); UserDTO user = getUser(); + if (!securityService.hasOrgRole(organisationID, user.getUserID(), new String[] { Role.GROUP_MANAGER }, "get course gradebook spreadsheet")) { - response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the organisation"); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a group manager in the organisation"); + return; } Organisation organisation = (Organisation) userManagementService.findById(Organisation.class, organisationID); Index: lams_gradebook/web/gradebookCourseMonitor.jsp =================================================================== diff -u -rbd13b83b911909f41514dc2800e42dcff6e40ed3 -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_gradebook/web/gradebookCourseMonitor.jsp (.../gradebookCourseMonitor.jsp) (revision bd13b83b911909f41514dc2800e42dcff6e40ed3) +++ lams_gradebook/web/gradebookCourseMonitor.jsp (.../gradebookCourseMonitor.jsp) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -353,8 +353,15 @@ return false; }); - $("#export-selected-lessons-button").click(function() { + $("#export-tbl-button").click(function() { + var areaToBlock = "export-link-area"; + var exportExcelUrl = "gradebookMonitoring/exportExcelTBLGradebook.do?&organisationID=${organisationID}"; + blockExportButton(areaToBlock, exportExcelUrl, languageLabelWait); + return false; + }); + + $("#export-selected-lessons-button").click(function() { var ids = jQuery("#organisationGrid").getGridParam('selarrrow'); // if at least one lesson selceted do export if(ids.length) { @@ -461,31 +468,37 @@ -
" id="export-selected-lessons-button" />
Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java =================================================================== diff -u -re9e7042e16de3421b8c0cd6b1cf6c59dede544b4 -rcf4f5ac67d5e9485f04091aeacfb8403d9b71289 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision e9e7042e16de3421b8c0cd6b1cf6c59dede544b4) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision cf4f5ac67d5e9485f04091aeacfb8403d9b71289) @@ -5,26 +5,23 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.TreeSet; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.lamsfoundation.lams.learningdesign.Activity; -import org.lamsfoundation.lams.learningdesign.ActivityOrderComparator; -import org.lamsfoundation.lams.learningdesign.BranchingActivity; -import org.lamsfoundation.lams.learningdesign.ComplexActivity; import org.lamsfoundation.lams.learningdesign.ContributionTypes; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Group; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.PermissionGateActivity; -import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; -import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; +import org.lamsfoundation.lams.learningdesign.service.ILearningDesignService; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.monitoring.dto.ContributeActivityDTO; @@ -64,6 +61,8 @@ @Autowired private ILessonService lessonService; @Autowired + private ILearningDesignService learningDesignService; + @Autowired private IMonitoringFullService monitoringService; @Autowired private ILamsToolService lamsToolService; @@ -91,8 +90,11 @@ request.setAttribute("lesson", lesson); request.setAttribute("totalLearnersNumber", lesson.getAllLearners().size()); - List lessonActivities = getLessonActivities(lesson); - setupAvailableActivityTypes(request, lessonActivities); + Map activityTypesMeta = learningDesignService + .getAvailableTBLActivityTypes(lesson.getLearningDesign().getLearningDesignId()); + for (Entry entry : activityTypesMeta.entrySet()) { + request.setAttribute(entry.getKey(), entry.getValue()); + } return "tblmonitor/tblmonitor"; } @@ -104,8 +106,12 @@ long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); Lesson lesson = lessonService.getLesson(lessonId); - List lessonActivities = getLessonActivities(lesson); - setupAvailableActivityTypes(request, lessonActivities); + Map activityTypesMeta = learningDesignService + .getAvailableTBLActivityTypes(lesson.getLearningDesign().getLearningDesignId()); + for (Entry entry : activityTypesMeta.entrySet()) { + request.setAttribute(entry.getKey(), entry.getValue()); + } + boolean isTraAvailable = (request.getAttribute("isScratchieAvailable") != null) && ((Boolean) request.getAttribute("isScratchieAvailable")); boolean isIraAssesmentAvailable = request.getAttribute("isIraAssessmentAvailable") != null @@ -389,77 +395,6 @@ return "tblmonitor/aes"; } - /** - * Returns lesson activities sorted by the learning design order. - */ - private List getLessonActivities(Lesson lesson) { - /* - * Hibernate CGLIB is failing to load the first activity in the sequence as a ToolActivity for some mysterious - * reason Causes a ClassCastException when you try to cast it, even if it is a ToolActivity. - * - * THIS IS A HACK to retrieve the first tool activity manually so it can be cast as a ToolActivity - if it is - * one - */ - Activity firstActivity = activityDAO - .getActivityByActivityId(lesson.getLearningDesign().getFirstActivity().getActivityId()); - List activities = new ArrayList<>(); - sortActivitiesByLearningDesignOrder(firstActivity, activities); - - return activities; - } - - /** - * Sort all activities by the learning design order. - * - * @param activity - * @param sortedActivities - */ - @SuppressWarnings("unchecked") - private void sortActivitiesByLearningDesignOrder(Activity activity, List sortedActivities) { - sortedActivities.add(activity); - - //in case of branching activity - add all activities based on their orderId - if (activity.isBranchingActivity()) { - BranchingActivity branchingActivity = (BranchingActivity) activity; - Set sequenceActivities = new TreeSet<>(new ActivityOrderComparator()); - sequenceActivities.addAll((Set) (Set) branchingActivity.getActivities()); - for (Activity sequenceActivityNotInitialized : sequenceActivities) { - SequenceActivity sequenceActivity = (SequenceActivity) monitoringService - .getActivityById(sequenceActivityNotInitialized.getActivityId()); - Set childActivities = new TreeSet<>(new ActivityOrderComparator()); - childActivities.addAll(sequenceActivity.getActivities()); - - //add one by one in order to initialize all activities - for (Activity childActivity : childActivities) { - Activity activityInit = monitoringService.getActivityById(childActivity.getActivityId()); - sortedActivities.add(activityInit); - } - } - - // In case of complex activity (parallel, help or optional activity) add all its children activities. - // They will be sorted by orderId - } else if (activity.isComplexActivity()) { - ComplexActivity complexActivity = (ComplexActivity) activity; - Set childActivities = new TreeSet<>(new ActivityOrderComparator()); - childActivities.addAll(complexActivity.getActivities()); - - // add one by one in order to initialize all activities - for (Activity childActivity : childActivities) { - Activity activityInit = monitoringService.getActivityById(childActivity.getActivityId()); - sortedActivities.add(activityInit); - } - } - - Transition transitionFrom = activity.getTransitionFrom(); - if (transitionFrom != null) { - // query activity from DB as transition holds only proxied activity object - Long nextActivityId = transitionFrom.getToActivity().getActivityId(); - Activity nextActivity = monitoringService.getActivityById(nextActivityId); - - sortActivitiesByLearningDesignOrder(nextActivity, sortedActivities); - } - } - private GroupingActivity getGroupingActivity(Lesson lesson) { Set activities = new TreeSet<>();