Index: lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java =================================================================== diff -u -r29a37489a63e5a95f42a5ef5fd8a7daeb65c53c5 -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 --- lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java (.../DisplayGroupController.java) (revision 29a37489a63e5a95f42a5ef5fd8a7daeb65c53c5) +++ lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java (.../DisplayGroupController.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5) @@ -187,26 +187,19 @@ moreLinks.add(new IndexLinkBean("label.enable.lesson.sorting", "javascript:makeOrgSortable()", "fa fa-fw fa-sort sorting tour-sorting", "label.enable.lesson.sorting")); } - } - // Adding gradebook course monitor links if enabled - if (roles.contains(Role.ROLE_GROUP_MANAGER)) { String link = "javascript:showGradebookCourseDialog(" + organisationId + ")"; moreLinks.add(new IndexLinkBean("index.coursegradebook", link, "fa fa-fw fa-list-ol", "index.coursegradebook.tooltip")); } - } else {// CLASS_TYPE if (roles.contains(Role.ROLE_GROUP_MANAGER) || roles.contains(Role.ROLE_MONITOR)) { String name = org.getParentOrganisation().getEnableSingleActivityLessons() ? "index.addlesson.single" : "index.addlesson"; links.add(new IndexLinkBean(name, "javascript:showAddLessonDialog(" + organisationId + ")", "fa fa-fw fa-plus", null)); - } - // Adding gradebook course monitor links if enabled - if (roles.contains(Role.ROLE_GROUP_MANAGER)) { String link = "javascript:showGradebookCourseDialog(" + organisationId + ")"; moreLinks.add( new IndexLinkBean("index.coursegradebook.subgroup", link, "fa fa-fw fa-list-ol", null)); Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java =================================================================== diff -u -r8247b17119f9b3d3c9258069313ed2510a5f0650 -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java (.../IGradebookDAO.java) (revision 8247b17119f9b3d3c9258069313ed2510a5f0650) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java (.../IGradebookDAO.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5) @@ -76,8 +76,8 @@ long getMaxTimeTakenForGroupedActivity(Long activityID, Long groupID); - List getLessonsByGroupAndUser(final Integer userId, final Integer orgId, int page, int size, String sortBy, - String sortOrder, String searchString); + List getLessonsByGroupAndUser(final Integer userId, boolean staffOnly, final Integer orgId, int page, + int size, String sortBy, String sortOrder, String searchString); List getUsersByLesson(Long lessonId, int page, int size, String sortBy, String sortOrder, String searchString); Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java =================================================================== diff -u -r6b9fd327fcba9ac3899bbe5c346cdc02a833a780 -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision 6b9fd327fcba9ac3899bbe5c346cdc02a833a780) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5) @@ -85,8 +85,9 @@ @Override public List getGradebookUserDataForLesson(Long lessonID) { - List result = getSession().createQuery(GET_GRADEBOOK_USER_LESSONS, GradebookUserLesson.class) - .setParameter("lessonID", lessonID).list(); + List result = getSession() + .createQuery(GET_GRADEBOOK_USER_LESSONS, GradebookUserLesson.class).setParameter("lessonID", lessonID) + .list(); return result; } @@ -174,7 +175,7 @@ + " WHERE progress.activity_id=:activityID AND TIMEDIFF(progress.completed_date_time, progress.start_date_time) IS NOT NULL" + " ) AS t2" + " WHERE t1.rowNumber in ( floor((totalRows+1)/2), floor((totalRows+2)/2) )"; - Object result = getSession().createSQLQuery(GET_MEDIAN_TIME_TAKEN_FOR_ACTIVITY) + Object result = getSession().createSQLQuery(GET_MEDIAN_TIME_TAKEN_FOR_ACTIVITY) .setParameter("activityID", activityID).uniqueResult(); //converting into milliseconds @@ -256,8 +257,8 @@ + " WHERE compProgress.activity_id=:activityID AND TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time) IS NOT NULL" + " AND ug.group_id=:groupID AND compProgress.learner_progress_id = progr.learner_progress_id AND progr.user_id=ug.user_id " + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" + " ) AS t1"; - - Object result = getSession().createSQLQuery(GET_MIN_TIME_TAKEN_FOR_GROUPED_ACTIVITY) + + Object result = getSession().createSQLQuery(GET_MIN_TIME_TAKEN_FOR_GROUPED_ACTIVITY) .setParameter("activityID", activityID).setParameter("groupID", groupID).uniqueResult(); //converting into milliseconds @@ -272,50 +273,49 @@ + " WHERE compProgress.activity_id=:activityID AND TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time) IS NOT NULL" + " AND ug.group_id=:groupID AND compProgress.learner_progress_id = progr.learner_progress_id AND progr.user_id=ug.user_id " + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" + " ) AS t1"; - - Object result = getSession().createSQLQuery(GET_MAX_TIME_TAKEN_FOR_GROUPED_ACTIVITY) + + Object result = getSession().createSQLQuery(GET_MAX_TIME_TAKEN_FOR_GROUPED_ACTIVITY) .setParameter("activityID", activityID).setParameter("groupID", groupID).uniqueResult(); //converting into milliseconds return result == null ? 0 : ((Number) result).intValue() * 1000; } @Override - public List getLessonsByGroupAndUser(final Integer userId, final Integer orgId, int page, int size, - String sortBy, String sortOrder, String searchString) { + public List getLessonsByGroupAndUser(final Integer userId, boolean staffOnly, final Integer orgId, int page, + int size, String sortBy, String sortOrder, String searchString) { final String LOAD_LESSONS_ORDERED_BY_FIELDS = "SELECT DISTINCT lesson " + "FROM Lesson lesson, LearningDesign ld, Group g, GroupUser ug, Organisation lo " - + "WHERE lesson.learningDesign.learningDesignId = ld.learningDesignId " + "AND ld.copyTypeID != 3 " + + "WHERE lesson.learningDesign.learningDesignId = ld.learningDesignId AND ld.copyTypeID != 3 " + "AND lesson.organisation.organisationId = lo.organisationId " + "AND (lo.organisationId = :orgId OR lo.parentOrganisation.organisationId = :orgId) " - + "AND lesson.lessonClass.groupingId = g.grouping.groupingId " + "AND lesson.lessonStateId != 7 " - + "AND ug.group.groupId = g.groupId " + "AND ug.user.userId = :userId " - + "AND lesson.lessonName LIKE CONCAT('%', :searchString, '%') " + "ORDER BY " + "CASE " - + "WHEN :sortBy='rowName' THEN lesson.lessonName " - + "WHEN :sortBy='startDate' THEN lesson.startDateTime " + "END " + sortOrder; + + "AND lesson.lessonStateId != 7 AND lesson.lessonName LIKE CONCAT('%', :searchString, '%') {0} " + + "ORDER BY CASE WHEN :sortBy='rowName' THEN lesson.lessonName " + + "WHEN :sortBy='startDate' THEN lesson.startDateTime END " + sortOrder; //when :sortBy='avgTimeTaken' final String LOAD_LESSONS_ORDERED_BY_AVERAGE_TIME_TAKEN = "SELECT DISTINCT lesson " + "FROM LearnerProgress progress right outer join progress.lesson lesson, LearningDesign ld, Group g, GroupUser ug, Organisation lo " - + "WHERE lesson.learningDesign.learningDesignId = ld.learningDesignId " + "AND ld.copyTypeID != 3 " + + "WHERE lesson.learningDesign.learningDesignId = ld.learningDesignId AND ld.copyTypeID != 3 " + "AND lesson.organisation.organisationId = lo.organisationId " + "AND (lo.organisationId = :orgId OR lo.parentOrganisation.organisationId = :orgId) " - + "AND lesson.lessonClass.groupingId = g.grouping.groupingId " + "AND lesson.lessonStateId != 7 " - + "AND ug.group.groupId = g.groupId " + "AND ug.user.userId = :userId " - + "AND lesson.lessonName LIKE CONCAT('%', :searchString, '%') " + "GROUP BY lesson " - + "ORDER BY AVG(TIMEDIFF(progress.finishDate,progress.startDate)) " + sortOrder; + + "AND lesson.lessonStateId != 7 AND lesson.lessonName LIKE CONCAT('%', :searchString, '%') {0} " + + "GROUP BY lesson ORDER BY AVG(TIMEDIFF(progress.finishDate,progress.startDate)) " + sortOrder; //when :sortBy='avgMark' final String LOAD_LESSONS_ORDERED_BY_AVERAGE_MARK = "SELECT DISTINCT lesson " + "FROM GradebookUserLesson gles right outer join gles.lesson lesson, LearningDesign ld, Group g, GroupUser ug, Organisation lo " - + "WHERE lesson.learningDesign.learningDesignId = ld.learningDesignId " + "AND ld.copyTypeID != 3 " + + "WHERE lesson.learningDesign.learningDesignId = ld.learningDesignId AND ld.copyTypeID != 3 " + "AND lesson.organisation.organisationId = lo.organisationId " + "AND (lo.organisationId = :orgId OR lo.parentOrganisation.organisationId = :orgId) " - + "AND lesson.lessonClass.groupingId = g.grouping.groupingId " + "AND lesson.lessonStateId != 7 " - + "AND ug.group.groupId = g.groupId " + "AND ug.user.userId = :userId " - + "AND lesson.lessonName LIKE CONCAT('%', :searchString, '%') " + "GROUP BY lesson " - + "ORDER BY AVG(IFNULL(gles.mark, -1)) " + sortOrder; + + "AND lesson.lessonStateId != 7 AND lesson.lessonName LIKE CONCAT('%', :searchString, '%') {0} " + + "GROUP BY lesson ORDER BY AVG(IFNULL(gles.mark, -1)) " + sortOrder; + final String CONDITION_IF_ANY_USER_PROVIDED = "AND lesson.lessonClass.groupingId = g.grouping.groupingId " + + "AND ug.group.groupId = g.groupId AND ug.user.userId = :userId"; + + final String CONDITION_IF_STAFF_PROVIDED = "AND ug.group.groupId = lesson.lessonClass.staffGroup.groupId AND ug.user.userId = :userId"; + String queryString; if (sortBy.equals("avgTimeTaken")) { queryString = LOAD_LESSONS_ORDERED_BY_AVERAGE_TIME_TAKEN; @@ -324,9 +324,13 @@ } else { queryString = LOAD_LESSONS_ORDERED_BY_FIELDS; } + queryString = queryString.replace("{0}", + userId == null ? "" : staffOnly ? CONDITION_IF_STAFF_PROVIDED : CONDITION_IF_ANY_USER_PROVIDED); Query query = getSession().createQuery(queryString, Lesson.class); - query.setParameter("userId", userId); + if (userId != null) { + query.setParameter("userId", userId); + } query.setParameter("orgId", orgId); if (!sortBy.equals("avgTimeTaken") && !sortBy.equals("avgMark")) { query.setParameter("sortBy", sortBy); @@ -601,13 +605,15 @@ return count > 0; } + @Override public List getArchivedLessonMarks(Long lessonId, Integer userId) { final String GET_ARCHIVED_LESSON_MARKS = "FROM GradebookUserLessonArchive a WHERE " + " a.lesson.lessonId = :lessonId AND a.learner.userId = :userId ORDER BY a.archiveDate DESC"; return getSession().createQuery(GET_ARCHIVED_LESSON_MARKS, GradebookUserLessonArchive.class) .setParameter("lessonId", lessonId).setParameter("userId", userId).list(); } + @Override public List getArchivedActivityMarks(Long activityId, Integer userId) { final String GET_ARCHIVED_ACTIVITY_MARKS = "FROM GradebookUserActivityArchive a WHERE " + " a.activity.activityId = :activityId AND a.learner.userId = :userId ORDER BY a.archiveDate DESC"; Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r5f4e5e536b23752765fb77b84b81f5a4eb527c0d -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 5f4e5e536b23752765fb77b84b81f5a4eb527c0d) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5) @@ -239,7 +239,7 @@ .debug("Getting archive gradebook user data for activity: " + activityId + ". For user: " + userId); Activity activity = getActivityById(activityId); - Lesson lesson = (Lesson) activity.getLearningDesign().getLessons().iterator().next(); + Lesson lesson = activity.getLearningDesign().getLessons().iterator().next(); List gradebookActivityDTOs = new ArrayList<>(); List lessonArchives = gradebookDAO.getArchivedLessonMarks(lesson.getLessonId(), @@ -450,7 +450,7 @@ Map userToGradebookUserLessonMap; //size will be 0 in case of excel export if (size == 0) { - learners = new LinkedList(lesson.getAllLearners()); + learners = new LinkedList<>(lesson.getAllLearners()); Collections.sort(learners, new LastNameAlphabeticComparator()); userToLearnerProgressMap = getUserToLearnerProgressMap(lesson, null); @@ -933,17 +933,20 @@ } @Override - public List getGBLessonRows(Organisation organisation, User user, User viewer, GBGridView view, - int page, int size, String sortBy, String sortOrder, String searchString, TimeZone userTimeZone) { + public List getGBLessonRows(Organisation organisation, User user, User viewer, + boolean isGroupManager, GBGridView view, int page, int size, String sortBy, String sortOrder, + String searchString, TimeZone userTimeZone) { List lessonRows = new ArrayList<>(); Integer userId = user.getUserId(); Integer orgId = organisation.getOrganisationId(); if (organisation != null) { - List lessons = (view == GBGridView.MON_COURSE || view == GBGridView.LIST) - ? gradebookDAO.getLessonsByGroupAndUser(userId, orgId, page, size, sortBy, sortOrder, searchString) - : lessonService.getLessonsByGroupAndUser(userId, orgId); + List lessons = (view == GBGridView.MON_COURSE || view == GBGridView.LIST + || view == GBGridView.MON_USER) + ? gradebookDAO.getLessonsByGroupAndUser(isGroupManager ? null : viewer.getUserId(), true, + orgId, page, size, sortBy, sortOrder, searchString) + : lessonService.getLessonsByGroupAndUser(userId, orgId); if (lessons != null) { @@ -1999,7 +2002,7 @@ // set mark to null so lesson mark recalculates correctly Double oldActivityMark = gradebookUserActivity.getMark(); gradebookUserActivity.setMark(null); - Lesson lesson = (Lesson) activity.getLearningDesign().getLessons().iterator().next(); + Lesson lesson = activity.getLearningDesign().getLessons().iterator().next(); boolean isWeightedMarks = toolService.isWeightedMarks(lesson.getLearningDesign()); GradebookUserLesson gradebookUserLesson = getGradebookUserLesson(lesson.getLessonId(), gradebookUserActivity.getLearner().getUserId()); Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java =================================================================== diff -u -rb8e51289e8498d408a9379a64353ad9ca97e6fed -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision b8e51289e8498d408a9379a64353ad9ca97e6fed) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5) @@ -207,8 +207,9 @@ * @param view * @return */ - List getGBLessonRows(Organisation organisation, User user, User viewer, GBGridView view, - int page, int size, String sortBy, String sortOrder, String searchString, TimeZone userTimeZone); + List getGBLessonRows(Organisation organisation, User user, User viewer, boolean isGroupManager, + GBGridView view, int page, int size, String sortBy, String sortOrder, String searchString, + TimeZone userTimeZone); /** * Gets a gradebook activity mark/feedback for a given activity and user Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookController.java =================================================================== diff -u -r29a37489a63e5a95f42a5ef5fd8a7daeb65c53c5 -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookController.java (.../GradebookController.java) (revision 29a37489a63e5a95f42a5ef5fd8a7daeb65c53c5) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookController.java (.../GradebookController.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5) @@ -69,7 +69,7 @@ /** * Handles the general requests for content in gradebook - * + * * @author lfoxton */ @Controller @@ -183,7 +183,7 @@ } } - List gradebookActivityDTOs = new ArrayList(); + List gradebookActivityDTOs = new ArrayList<>(); // Get the user gradebook list from the db // A slightly different list is needed for userview or activity view @@ -444,11 +444,12 @@ User user; User viewer = getRealUser(); + boolean isGroupManager = false; if (view == GBGridView.MON_USER) { Integer userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID); user = (User) userManagementService.findById(User.class, userID); } else { - user = getRealUser(); + user = viewer; } //permission check @@ -459,10 +460,11 @@ } } else if (view == GBGridView.MON_COURSE || view == GBGridView.LIST) { - if (!securityService.hasOrgRole(courseID, viewer.getUserId(), - new String[] { Role.GROUP_MANAGER}, "get course gradebook", false)) { + isGroupManager = userManagementService.hasRoleInOrganisation(viewer, Role.ROLE_GROUP_MANAGER, organisation); + if (!isGroupManager && !securityService.hasOrgRole(courseID, viewer.getUserId(), + new String[] { Role.MONITOR }, "get course gradebook", false)) { response.sendError(HttpServletResponse.SC_FORBIDDEN, - "User is not a group manager or admin in the organisation"); + "User is not a group manager or monitor in the organisation"); return null; } @@ -483,7 +485,7 @@ return null; } List gradebookLessonDTOs = gradebookService.getGBLessonRows(organisation, user, viewer, - view, page - 1, rowLimit, sortBy, sortOrder, searchString, getUser().getTimeZone()); + isGroupManager, view, page - 1, rowLimit, sortBy, sortOrder, searchString, getUser().getTimeZone()); String ret; if (view == GBGridView.MON_COURSE || view == GBGridView.LIST) { @@ -567,7 +569,7 @@ return null; } Integer userID = getUser().getUserID(); - for (Lesson lesson : (Set) activity.getLearningDesign().getLessons()) { + for (Lesson lesson : activity.getLearningDesign().getLessons()) { if (!securityService.isLessonMonitor(lesson.getLessonId(), userID, "get activity mark average", false)) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson"); return null; @@ -578,7 +580,7 @@ response.setContentType("text/plain, charset=utf-8"); if (averageMark != null) { return GradebookUtil.niceFormatting(averageMark); - + } else { return GradebookConstants.CELL_EMPTY; } @@ -601,7 +603,7 @@ response.setContentType("text/plain; charset=utf-8"); if (averageMark != null) { return GradebookUtil.niceFormatting(averageMark); - + } else { return GradebookConstants.CELL_EMPTY; } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java =================================================================== diff -u -rebebf9adb849e783bc45d44a0a47bdc56006cc73 -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java (.../GradebookMonitoringController.java) (revision ebebf9adb849e783bc45d44a0a47bdc56006cc73) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java (.../GradebookMonitoringController.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5) @@ -136,8 +136,8 @@ log.error("User missing from session. "); return "error"; } - if (!securityService.hasOrgRole(organisationID, user.getUserID(), new String[] { Role.GROUP_MANAGER }, - "get course gradebook page", false)) { + if (!securityService.hasOrgRole(organisationID, user.getUserID(), + new String[] { Role.GROUP_MANAGER, Role.MONITOR }, "get course gradebook page", false)) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a course manager in the organisation"); return null;