diff --git a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java index a9dc5975dc3c569d443f3651c6fea284c406c8e6..c1d4545bf1b4121e3e1bd6d57ebb643bee58085b 100644 --- a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java +++ b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java @@ -161,7 +161,7 @@ public class CourseOverviewController extends BasicController { //course membership List<RepositoryEntryMembership> memberships = repositoryManager.getRepositoryEntryMembership(null, editedIdentity); - //group memebership + //group membership List<BusinessGroupMembership> groupMemberships = businessGroupService.getBusinessGroupMembership(Collections.<Long>emptyList(), editedIdentity); Collection<Long> groupKeys = new ArrayList<Long>(groupMemberships.size()); for(BusinessGroupMembership membership: groupMemberships) { diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java index 3fe66fd49d72d9a278e901152c45485170bca6ab..85dde404468c03bce2c3925b57962e47d5f25628 100644 --- a/src/main/java/org/olat/course/CourseFactory.java +++ b/src/main/java/org/olat/course/CourseFactory.java @@ -660,7 +660,8 @@ public class CourseFactory extends BasicManager { (CourseEditorTreeNode)course.getEditorTreeModel().getRootNode()); // register any references in the run structure. The referenced entries have been // previousely deplyed (as part of the editor structure deployment process - see above method call) - registerReferences(course, course.getRunStructure().getRootNode()); + registerReferences(course, + (CourseEditorTreeNode)course.getEditorTreeModel().getRootNode()); // import shared folder references deployReferencedSharedFolders(courseExportData, course); // import glossary references @@ -693,12 +694,13 @@ public class CourseFactory extends BasicManager { * @param course * @param currentNode */ - private static void registerReferences(ICourse course, CourseNode currentNode) { + private static void registerReferences(ICourse course, CourseEditorTreeNode currentNode) { for (int i = 0; i < currentNode.getChildCount(); i++) { - CourseNode childNode = (CourseNode)currentNode.getChildAt(i); - if (childNode.needsReferenceToARepositoryEntry()) { - referenceManager.addReference(course, - childNode.getReferencedRepositoryEntry().getOlatResource(), childNode.getIdent()); + CourseEditorTreeNode childNode = (CourseEditorTreeNode)currentNode.getChildAt(i); + CourseNode childCourseNode = childNode.getCourseNode(); + if (childCourseNode.needsReferenceToARepositoryEntry()) { + RepositoryEntry re = childCourseNode.getReferencedRepositoryEntry(); + referenceManager.addReference(course, re.getOlatResource(), childNode.getIdent()); } registerReferences(course, childNode); } diff --git a/src/main/java/org/olat/modules/coach/CoachingService.java b/src/main/java/org/olat/modules/coach/CoachingService.java index 99a0ee262ca6aec3187e843e94d6c936af49e6f6..ef203b325bc87997b1983e2e6588460a3e158a21 100644 --- a/src/main/java/org/olat/modules/coach/CoachingService.java +++ b/src/main/java/org/olat/modules/coach/CoachingService.java @@ -55,7 +55,7 @@ public interface CoachingService { public List<EfficiencyStatementEntry> getGroup(BusinessGroup group); - public List<EfficiencyStatementEntry> getCourse(Identity coach, RepositoryEntry entry, int firstResult, int maxResults); + public List<EfficiencyStatementEntry> getCourse(Identity coach, RepositoryEntry entry); public EfficiencyStatementEntry getEfficencyStatement(UserEfficiencyStatement statement); diff --git a/src/main/java/org/olat/modules/coach/manager/CoachingDAO.java b/src/main/java/org/olat/modules/coach/manager/CoachingDAO.java index 22c42e7390bbd2e63acde1aac9b242c373b10211..f7b26509e04ba743559f46cb6c367a5d155c1fac 100644 --- a/src/main/java/org/olat/modules/coach/manager/CoachingDAO.java +++ b/src/main/java/org/olat/modules/coach/manager/CoachingDAO.java @@ -268,7 +268,7 @@ public class CoachingDAO extends BasicManager { return stats; } - public List<Long> getStudents(Identity coach, RepositoryEntry entry, int firstResult, int maxResults) { + public List<Long> getStudents(Identity coach, RepositoryEntry entry) { StringBuilder sb = new StringBuilder(); sb.append("select distinct(participant.identity.key) from repoentrytogroup as relGroup ") .append(" inner join relGroup.group as baseGroup") diff --git a/src/main/java/org/olat/modules/coach/manager/CoachingServiceImpl.java b/src/main/java/org/olat/modules/coach/manager/CoachingServiceImpl.java index 3868dbf4df018db503f34508330386a6f7d358f3..ac7a2a40fe20c13d85b741560d5b29f9de1bf01b 100644 --- a/src/main/java/org/olat/modules/coach/manager/CoachingServiceImpl.java +++ b/src/main/java/org/olat/modules/coach/manager/CoachingServiceImpl.java @@ -60,11 +60,13 @@ public class CoachingServiceImpl implements CoachingService { @Autowired private BusinessGroupService businessGroupService; - + + @Override public boolean isCoach(Identity coach) { return coachingDao.isCoach(coach); } - + + @Override public Map<Long, String> getIdentities(Collection<Long> identityNames) { Map<Long,String> identityMap = new HashMap<Long,String>(); @@ -76,44 +78,53 @@ public class CoachingServiceImpl implements CoachingService { return identityMap; } + @Override public List<RepositoryEntry> getStudentsCourses(Identity coach, Identity student, int firstResult, int maxResults) { return coachingDao.getStudentsCourses(coach, student, firstResult, maxResults); } - + + @Override public List<StudentStatEntry> getStudentsStatistics(Identity coach) { return coachingDao.getStudentsStatistics(coach); } - + + @Override public List<CourseStatEntry> getCoursesStatistics(Identity coach) { return coachingDao.getCoursesStatistics(coach); } - + + @Override public List<GroupStatEntry> getGroupsStatistics(Identity coach) { return coachingDao.getGroupsStatistics(coach); } - + + @Override public List<EfficiencyStatementEntry> getGroup(BusinessGroup group) { List<Identity> students = businessGroupService.getMembers(group, GroupRoles.participant.name()); List<RepositoryEntry> courses = businessGroupService.findRepositoryEntries(Collections.singletonList(group), 0, -1); return coachingDao.getEfficencyStatementEntriesAlt(students, courses); } - - public List<EfficiencyStatementEntry> getCourse(Identity coach, RepositoryEntry entry, int firstResult, int maxResults) { - List<Long> studentKeys = coachingDao.getStudents(coach, entry, firstResult, maxResults); + + @Override + public List<EfficiencyStatementEntry> getCourse(Identity coach, RepositoryEntry entry) { + List<Long> studentKeys = coachingDao.getStudents(coach, entry); List<IdentityShort> students = securityManager.findShortIdentitiesByKey(studentKeys); return coachingDao.getEfficencyStatementEntries(students, Collections.singletonList(entry)); } - + + @Override public EfficiencyStatementEntry getEfficencyStatement(UserEfficiencyStatement statement) { return coachingDao.getEfficencyStatementEntry(statement); } - + + @Override public List<EfficiencyStatementEntry> getEfficencyStatements(Identity student, List<RepositoryEntry> courses) { IdentityShort identity = securityManager.loadIdentityShortByKey(student.getKey()); List<IdentityShort> students = Collections.singletonList(identity); return coachingDao.getEfficencyStatementEntries(students, courses); } + @Override public List<UserEfficiencyStatement> getEfficencyStatements(Identity student) { return coachingDao.getEfficencyStatementEntries(student); } diff --git a/src/main/java/org/olat/modules/coach/ui/CourseController.java b/src/main/java/org/olat/modules/coach/ui/CourseController.java index f16e749c9f65f84d67a8de980679d029729fda02..b86e04ce48e42a96641b74994791321c9fc08ef7 100644 --- a/src/main/java/org/olat/modules/coach/ui/CourseController.java +++ b/src/main/java/org/olat/modules/coach/ui/CourseController.java @@ -168,7 +168,7 @@ public class CourseController extends BasicController implements Activateable2 { } public List<EfficiencyStatementEntry> loadModel() { - List<EfficiencyStatementEntry> entries = coachingService.getCourse(getIdentity(), course, 0, -1); + List<EfficiencyStatementEntry> entries = coachingService.getCourse(getIdentity(), course); TableDataModel<EfficiencyStatementEntry> model = new EfficiencyStatementEntryTableDataModel(entries); tableCtr.setTableDataModel(model); return entries; diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java index 117431ef6642c2af3b650a5f66ef961339dce002..4fa41651b68bb02febfa6357dd0967ddcd5c154e 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java +++ b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java @@ -56,6 +56,12 @@ public class RepositoryEntryRelationDAO { @Autowired private GroupDAO groupDao; + /** + * Get roles in the repository entry, with business groups too + * @param identity + * @param re + * @return + */ public List<String> getRoles(IdentityRef identity, RepositoryEntryRef re) { StringBuilder sb = new StringBuilder(); sb.append("select membership.role from ").append(RepositoryEntry.class.getName()).append(" as v") @@ -71,12 +77,19 @@ public class RepositoryEntryRelationDAO { .getResultList(); } + /** + * Has role in the repository entry only (without business groups) + * @param identity + * @param re + * @param roles + * @return + */ public boolean hasRole(IdentityRef identity, RepositoryEntryRef re, String... roles) { List<String> roleList = GroupRoles.toList(roles); StringBuilder sb = new StringBuilder(); sb.append("select count(membership) from ").append(RepositoryEntry.class.getName()).append(" as v") - .append(" inner join v.groups as relGroup") + .append(" inner join v.groups as relGroup on relGroup.defaultGroup=true") .append(" inner join relGroup.group as baseGroup") .append(" inner join baseGroup.members as membership") .append(" where v.key=:repoKey and membership.identity.key=:identityKey"); diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java index 78aade40b73d9a6107dfb2bac48187b59f2ad38d..55c57c4e64104ffb48ebe45627c36fd701f39ad0 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java +++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java @@ -304,11 +304,20 @@ public class RepositoryServiceImpl implements RepositoryService { return reToGroupDao.getDefaultGroup(ref); } + /** + * Get the role in the specified resource, business group are included in + * the query. + * + */ @Override public List<String> getRoles(Identity identity, RepositoryEntryRef re) { return reToGroupDao.getRoles(identity, re); } + /** + * Has specific role in the specified resource WITHOUT business groups included in + * the query. + */ @Override public boolean hasRole(Identity identity, RepositoryEntryRef re, String... roles) { return reToGroupDao.hasRole(identity, re, roles); diff --git a/src/main/resources/database/mysql/alter_9_4_0_to_10_0_0.sql b/src/main/resources/database/mysql/alter_9_4_0_to_10_0_0.sql index eaacd7e0595d371e030db2f3ab2654a73f180f12..a9ba9b1840d6ddf38c2f2b7c1208a018bef0d42b 100644 --- a/src/main/resources/database/mysql/alter_9_4_0_to_10_0_0.sql +++ b/src/main/resources/database/mysql/alter_9_4_0_to_10_0_0.sql @@ -235,7 +235,7 @@ create or replace view o_re_membership_v as ( bmember.g_role as g_role, re.repositoryentry_id as fk_entry_id from o_repositoryentry as re - inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id) + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=1) inner join o_bs_group_member as bmember on (bmember.fk_group_id=relgroup.fk_group_id) ); @@ -246,8 +246,8 @@ create or replace view o_as_eff_statement_students_v as ( sg_coach.fk_identity_id as tutor_id, sg_participant.fk_identity_id as student_id, sg_statement.id as st_id, - (case when sg_statement.passed = true then 1 else 0 end) as st_passed, - (case when sg_statement.passed = false then 1 else 0 end) as st_failed, + (case when sg_statement.passed = 1 then 1 else 0 end) as st_passed, + (case when sg_statement.passed = 0 then 1 else 0 end) as st_failed, (case when sg_statement.passed is null then 1 else 0 end) as st_not_attempted, sg_statement.score as st_score, pg_initial_launch.id as pg_id @@ -257,6 +257,8 @@ create or replace view o_as_eff_statement_students_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); create or replace view o_as_eff_statement_courses_v as ( @@ -266,8 +268,8 @@ create or replace view o_as_eff_statement_courses_v as ( sg_coach.fk_identity_id as tutor_id, sg_participant.fk_identity_id as student_id, sg_statement.id as st_id, - (case when sg_statement.passed = true then 1 else 0 end) as st_passed, - (case when sg_statement.passed = false then 1 else 0 end) as st_failed, + (case when sg_statement.passed = 1 then 1 else 0 end) as st_passed, + (case when sg_statement.passed = 0 then 1 else 0 end) as st_failed, (case when sg_statement.passed is null then 1 else 0 end) as st_not_attempted, sg_statement.score as st_score, pg_initial_launch.id as pg_id @@ -277,6 +279,8 @@ create or replace view o_as_eff_statement_courses_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); create or replace view o_as_eff_statement_groups_v as ( @@ -288,8 +292,8 @@ create or replace view o_as_eff_statement_groups_v as ( sg_coach.fk_identity_id as tutor_id, sg_participant.fk_identity_id as student_id, sg_statement.id as st_id, - (case when sg_statement.passed = true then 1 else 0 end) as st_passed, - (case when sg_statement.passed = false then 1 else 0 end) as st_failed, + (case when sg_statement.passed = 1 then 1 else 0 end) as st_passed, + (case when sg_statement.passed = 0 then 1 else 0 end) as st_failed, (case when sg_statement.passed is null then 1 else 0 end) as st_not_attempted, sg_statement.score as st_score, pg_initial_launch.id as pg_id @@ -300,6 +304,9 @@ create or replace view o_as_eff_statement_groups_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_bg.group_id, sg_bg.groupname, + sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); -- drop views diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index c9efaf968bbc48f1c94539ec7c6c2228c733df39..def00f1d8404ba0118bc3644b92ca8ead0811e6d 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -1461,7 +1461,7 @@ create or replace view o_re_membership_v as ( bmember.g_role as g_role, re.repositoryentry_id as fk_entry_id from o_repositoryentry as re - inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id) + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=1) inner join o_bs_group_member as bmember on (bmember.fk_group_id=relgroup.fk_group_id) ); @@ -1513,8 +1513,8 @@ create view o_as_eff_statement_students_v as ( sg_coach.fk_identity_id as tutor_id, sg_participant.fk_identity_id as student_id, sg_statement.id as st_id, - (case when sg_statement.passed = true then 1 else 0 end) as st_passed, - (case when sg_statement.passed = false then 1 else 0 end) as st_failed, + (case when sg_statement.passed = 1 then 1 else 0 end) as st_passed, + (case when sg_statement.passed = 0 then 1 else 0 end) as st_failed, (case when sg_statement.passed is null then 1 else 0 end) as st_not_attempted, sg_statement.score as st_score, pg_initial_launch.id as pg_id @@ -1524,6 +1524,8 @@ create view o_as_eff_statement_students_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); create view o_as_eff_statement_courses_v as ( @@ -1533,8 +1535,8 @@ create view o_as_eff_statement_courses_v as ( sg_coach.fk_identity_id as tutor_id, sg_participant.fk_identity_id as student_id, sg_statement.id as st_id, - (case when sg_statement.passed = true then 1 else 0 end) as st_passed, - (case when sg_statement.passed = false then 1 else 0 end) as st_failed, + (case when sg_statement.passed = 1 then 1 else 0 end) as st_passed, + (case when sg_statement.passed = 0 then 1 else 0 end) as st_failed, (case when sg_statement.passed is null then 1 else 0 end) as st_not_attempted, sg_statement.score as st_score, pg_initial_launch.id as pg_id @@ -1544,6 +1546,8 @@ create view o_as_eff_statement_courses_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); create view o_as_eff_statement_groups_v as ( @@ -1555,8 +1559,8 @@ create view o_as_eff_statement_groups_v as ( sg_coach.fk_identity_id as tutor_id, sg_participant.fk_identity_id as student_id, sg_statement.id as st_id, - (case when sg_statement.passed = true then 1 else 0 end) as st_passed, - (case when sg_statement.passed = false then 1 else 0 end) as st_failed, + (case when sg_statement.passed = 1 then 1 else 0 end) as st_passed, + (case when sg_statement.passed = 0 then 1 else 0 end) as st_failed, (case when sg_statement.passed is null then 1 else 0 end) as st_not_attempted, sg_statement.score as st_score, pg_initial_launch.id as pg_id @@ -1567,6 +1571,9 @@ create view o_as_eff_statement_groups_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_bg.group_id, sg_bg.groupname, + sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); -- instant messaging diff --git a/src/main/resources/database/oracle/alter_9_4_0_to_10_0_0.sql b/src/main/resources/database/oracle/alter_9_4_0_to_10_0_0.sql index 6a484abfcf4fb2b49c87fbd6d0957da255158c4f..d5ac592fe174fc0fa31f04a991ce36444f40780d 100644 --- a/src/main/resources/database/oracle/alter_9_4_0_to_10_0_0.sql +++ b/src/main/resources/database/oracle/alter_9_4_0_to_10_0_0.sql @@ -237,7 +237,7 @@ create or replace view o_re_membership_v as ( bmember.g_role as g_role, re.repositoryentry_id as fk_entry_id from o_repositoryentry re - inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id) + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=1) inner join o_bs_group_member bmember on (bmember.fk_group_id=relgroup.fk_group_id) ); @@ -248,7 +248,7 @@ create or replace view o_as_eff_statement_students_v as ( sg_coach.fk_identity_id as tutor_id, sg_participant.fk_identity_id as student_id, sg_statement.id as st_id, - (case when sg_statement.passed > 1 then 1 else 0 end) as st_passed, + (case when sg_statement.passed > 0 then 1 else 0 end) as st_passed, (case when sg_statement.passed = 0 then 1 else 0 end) as st_failed, (case when sg_statement.passed is null then 1 else 0 end) as st_not_attempted, sg_statement.score as st_score, @@ -259,6 +259,8 @@ create or replace view o_as_eff_statement_students_v as ( inner join o_bs_group_member sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.passed, sg_statement.id, sg_statement.score, pg_initial_launch.id ); create or replace view o_as_eff_statement_courses_v as ( @@ -279,6 +281,8 @@ create or replace view o_as_eff_statement_courses_v as ( inner join o_bs_group_member sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.passed, sg_statement.id, sg_statement.score, pg_initial_launch.id ); create or replace view o_as_eff_statement_groups_v as ( @@ -302,6 +306,9 @@ create or replace view o_as_eff_statement_groups_v as ( inner join o_bs_group_member sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_bg.group_id, sg_bg.groupname, + sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.passed, sg_statement.id, sg_statement.score, pg_initial_launch.id ); -- drop views diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index b2f7fb326163751918859bfee8ac4deb84ef1995..e48a52819eddb331a20cb63f7d8dca7f96f10d97 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -1513,7 +1513,7 @@ create or replace view o_re_membership_v as ( bmember.g_role as g_role, re.repositoryentry_id as fk_entry_id from o_repositoryentry re - inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id) + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=1) inner join o_bs_group_member bmember on (bmember.fk_group_id=relgroup.fk_group_id) ); @@ -1565,7 +1565,7 @@ create view o_as_eff_statement_students_v as ( sg_coach.fk_identity_id as tutor_id, sg_participant.fk_identity_id as student_id, sg_statement.id as st_id, - (case when sg_statement.passed > 1 then 1 else 0 end) as st_passed, + (case when sg_statement.passed > 0 then 1 else 0 end) as st_passed, (case when sg_statement.passed = 0 then 1 else 0 end) as st_failed, (case when sg_statement.passed is null then 1 else 0 end) as st_not_attempted, sg_statement.score as st_score, @@ -1576,6 +1576,8 @@ create view o_as_eff_statement_students_v as ( inner join o_bs_group_member sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.passed, sg_statement.id, sg_statement.score, pg_initial_launch.id ); create view o_as_eff_statement_courses_v as ( @@ -1596,6 +1598,8 @@ create view o_as_eff_statement_courses_v as ( inner join o_bs_group_member sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.passed, sg_statement.id, sg_statement.score, pg_initial_launch.id ); create view o_as_eff_statement_groups_v as ( @@ -1619,6 +1623,9 @@ create view o_as_eff_statement_groups_v as ( inner join o_bs_group_member sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_bg.group_id, sg_bg.groupname, + sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.passed, sg_statement.id, sg_statement.score, pg_initial_launch.id ); create or replace view o_im_roster_entry_v as ( diff --git a/src/main/resources/database/postgresql/alter_9_4_0_to_10_0_0.sql b/src/main/resources/database/postgresql/alter_9_4_0_to_10_0_0.sql index 1da122c77c2c908403b51ec4396fc1735103f79f..0769af2d3703c0535ddb1e448b2a00d31e5a4f53 100644 --- a/src/main/resources/database/postgresql/alter_9_4_0_to_10_0_0.sql +++ b/src/main/resources/database/postgresql/alter_9_4_0_to_10_0_0.sql @@ -240,7 +240,7 @@ create or replace view o_re_membership_v as ( bmember.g_role as g_role, re.repositoryentry_id as fk_entry_id from o_repositoryentry as re - inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id) + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=true) inner join o_bs_group_member as bmember on (bmember.fk_group_id=relgroup.fk_group_id) ); @@ -262,6 +262,8 @@ create view o_as_eff_statement_students_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); create view o_as_eff_statement_courses_v as ( @@ -282,6 +284,8 @@ create view o_as_eff_statement_courses_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); drop view o_as_eff_statement_groups_v; @@ -306,6 +310,9 @@ create view o_as_eff_statement_groups_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_bg.group_id, sg_bg.groupname, + sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); -- drop views diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index 467c328313a1e1406e641c0389b58c9763981eb9..170448b3ac0853764ac5bfbac997cf13840b06d1 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -1462,7 +1462,7 @@ create or replace view o_re_membership_v as ( bmember.g_role as g_role, re.repositoryentry_id as fk_entry_id from o_repositoryentry as re - inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id) + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=true) inner join o_bs_group_member as bmember on (bmember.fk_group_id=relgroup.fk_group_id) ); @@ -1525,6 +1525,8 @@ create view o_as_eff_statement_students_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); create view o_as_eff_statement_courses_v as ( @@ -1545,6 +1547,8 @@ create view o_as_eff_statement_courses_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); create view o_as_eff_statement_groups_v as ( @@ -1568,6 +1572,9 @@ create view o_as_eff_statement_groups_v as ( inner join o_bs_group_member as sg_participant on (sg_participant.fk_group_id=sg_coach.fk_group_id and sg_participant.g_role='participant') left join o_as_eff_statement as sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) left join o_as_user_course_infos as pg_initial_launch on (pg_initial_launch.fk_resource_id = sg_re.fk_olatresource and pg_initial_launch.fk_identity = sg_participant.fk_identity_id) + group by sg_re.repositoryentry_id, sg_re.displayname, sg_bg.group_id, sg_bg.groupname, + sg_coach.fk_identity_id, sg_participant.fk_identity_id, + sg_statement.id, sg_statement.score, pg_initial_launch.id ); -- instant messaging diff --git a/src/test/java/org/olat/modules/coach/CoachingCourse.zip b/src/test/java/org/olat/modules/coach/CoachingCourse.zip new file mode 100644 index 0000000000000000000000000000000000000000..a3963ce7795afa2f5cd700670287848521a13106 Binary files /dev/null and b/src/test/java/org/olat/modules/coach/CoachingCourse.zip differ diff --git a/src/test/java/org/olat/modules/coach/CoachingDAOTest.java b/src/test/java/org/olat/modules/coach/CoachingDAOTest.java new file mode 100644 index 0000000000000000000000000000000000000000..11c747222d3e0616a441fce0a95fd45bb366df1e --- /dev/null +++ b/src/test/java/org/olat/modules/coach/CoachingDAOTest.java @@ -0,0 +1,62 @@ +package org.olat.modules.coach; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.List; +import java.util.UUID; + +import org.junit.Assert; +import org.junit.Test; +import org.olat.basesecurity.GroupRoles; +import org.olat.core.commons.persistence.DB; +import org.olat.core.id.Identity; +import org.olat.course.CourseFactory; +import org.olat.course.ICourse; +import org.olat.modules.coach.manager.CoachingDAO; +import org.olat.modules.coach.model.StudentStatEntry; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryService; +import org.olat.test.JunitTestHelper; +import org.olat.test.OlatTestCase; +import org.springframework.beans.factory.annotation.Autowired; + +public class CoachingDAOTest extends OlatTestCase { + + @Autowired + private DB dbInstance; + @Autowired + private CoachingDAO coachingDAO; + @Autowired + private RepositoryService repositoryService; + + @Test + public void getStudents() + throws URISyntaxException { + URL courseWithForumsUrl = CoachingDAOTest.class.getResource("CoachingCourse.zip"); + File courseWithForums = new File(courseWithForumsUrl.toURI()); + String softKey = UUID.randomUUID().toString(); + RepositoryEntry re = CourseFactory.deployCourseFromZIP(courseWithForums, softKey, 4); + Assert.assertNotNull(re); + + dbInstance.commitAndCloseSession(); + + ICourse course = CourseFactory.loadCourse(re.getOlatResource().getResourceableId()); + boolean enabled =course.getCourseEnvironment().getCourseConfig().isEfficencyStatementEnabled(); + Assert.assertTrue(enabled); + + Identity coach = JunitTestHelper.createAndPersistIdentityAsAuthor("Coach-1-" + UUID.randomUUID()); + repositoryService.addRole(coach, re, GroupRoles.coach.name()); + Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("Coaching-Part-1"); + repositoryService.addRole(participant1, re, GroupRoles.participant.name()); + Identity participant2 = JunitTestHelper.createAndPersistIdentityAsRndUser("Coaching-Part-2"); + repositoryService.addRole(participant2, re, GroupRoles.participant.name()); + dbInstance.commitAndCloseSession(); + + + List<StudentStatEntry> stats = coachingDAO.getStudentsStatistics(coach); + Assert.assertNotNull(stats); + Assert.assertEquals(2, stats.size()); + } + +} diff --git a/src/test/java/org/olat/modules/coach/CoachingServiceTest.java b/src/test/java/org/olat/modules/coach/CoachingServiceTest.java index b74397f7077d5a6a4b03383da3e8d13e14d9c28b..d62511e9afb54346abf9bfb43024072039fb4dfc 100644 --- a/src/test/java/org/olat/modules/coach/CoachingServiceTest.java +++ b/src/test/java/org/olat/modules/coach/CoachingServiceTest.java @@ -315,7 +315,7 @@ public class CoachingServiceTest extends OlatTestCase { List<Long> myCourses = coachToCourseMap.get(coach10.getKey()); assertNotNull(myCourses); - List<EfficiencyStatementEntry> statEntries = coachingService.getCourse(coach10, course10, 0, -1); + List<EfficiencyStatementEntry> statEntries = coachingService.getCourse(coach10, course10); assertNotNull(statEntries); assertFalse(statEntries.isEmpty()); assertTrue(myCourses.contains(course10.getKey()));