diff --git a/src/main/java/org/olat/basesecurity/manager/GroupDAO.java b/src/main/java/org/olat/basesecurity/manager/GroupDAO.java index 9af367f4cb1e0bb3875ed51239df55b06635612c..284a188ee9c29c46c6e6fd670271b3e7a5a50292 100644 --- a/src/main/java/org/olat/basesecurity/manager/GroupDAO.java +++ b/src/main/java/org/olat/basesecurity/manager/GroupDAO.java @@ -19,11 +19,13 @@ */ package org.olat.basesecurity.manager; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import javax.persistence.EntityManager; @@ -219,6 +221,15 @@ public class GroupDAO { .getResultList(); } + public List<Identity> getMembers(Collection<Group> group, String role) { + List<Long> groupKeys = group.stream().map(Group::getKey).collect(Collectors.toList()); + return dbInstance.getCurrentEntityManager() + .createNamedQuery("membersByGroupsAndRole", Identity.class) + .setParameter("groupKeys", groupKeys) + .setParameter("role", role) + .getResultList(); + } + public List<GroupMembership> getMemberships(Group group) { return dbInstance.getCurrentEntityManager() .createNamedQuery("membershipsByGroup", GroupMembership.class) diff --git a/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java b/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java index 3a43e73b0b5af74944c46f43965eef8a0199273d..917a97f2f2aeee8a82470d68928e72c7b9ff0c27 100644 --- a/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java +++ b/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java @@ -62,6 +62,7 @@ import org.olat.core.util.StringHelper; @NamedQuery(name="countMembersByGroup", query="select count(membership.key) from bgroupmember as membership where membership.group.key=:groupKey") @NamedQuery(name="countMembersByGroupAndRole", query="select count(membership.key) from bgroupmember as membership where membership.group.key=:groupKey and membership.role=:role") @NamedQuery(name="membersByGroupAndRole", query="select distinct membership.identity from bgroupmember as membership where membership.group.key=:groupKey and membership.role=:role") +@NamedQuery(name="membersByGroupsAndRole", query="select distinct membership.identity from bgroupmember as membership where membership.group.key in(:groupKeys) and membership.role=:role") @NamedQuery(name="hasRoleByGroupIdentityAndRole", query="select count(membership.key) from bgroupmember as membership where membership.group.key=:groupKey and membership.identity.key=:identityKey and membership.role=:role") public class GroupMembershipImpl implements GroupMembership, ModifiedInfo, Persistable { diff --git a/src/main/java/org/olat/course/nodes/appointments/AppointmentsService.java b/src/main/java/org/olat/course/nodes/appointments/AppointmentsService.java index 99757bd60ce8ba8335f558a171a14de5c0251cd9..03a32e6734e4e5c95c35fdcb485c8c66712050fb 100644 --- a/src/main/java/org/olat/course/nodes/appointments/AppointmentsService.java +++ b/src/main/java/org/olat/course/nodes/appointments/AppointmentsService.java @@ -73,10 +73,24 @@ public interface AppointmentsService { public void removeTopicRestriction(Topic topic, IdentityRef identity); + public boolean hasGroupRestrictions(TopicRef topic); + public List<Group> getGroupRestrictions(TopicRef topic); + /** + * + * @param topic + * @return the identities of the topic group. + */ public List<Identity> getUserRestrictions(Topic topic); + /** + * + * @param topic + * @return the identities of the all restriction groups. + */ + public List<Identity> getRestrictionMembers(TopicRef topic); + public Appointment createUnsavedAppointment(Topic topic); public Appointment saveAppointment(Appointment appointment); diff --git a/src/main/java/org/olat/course/nodes/appointments/manager/AppointmentsServiceImpl.java b/src/main/java/org/olat/course/nodes/appointments/manager/AppointmentsServiceImpl.java index 5f45a649f78f1f511020633eeec40caf6e6d3133..7781a79d25592f8ccaae9524e4d800b99f5654a8 100644 --- a/src/main/java/org/olat/course/nodes/appointments/manager/AppointmentsServiceImpl.java +++ b/src/main/java/org/olat/course/nodes/appointments/manager/AppointmentsServiceImpl.java @@ -245,6 +245,11 @@ public class AppointmentsServiceImpl implements AppointmentsService { } } + @Override + public boolean hasGroupRestrictions(TopicRef topic) { + return topicToGroupDao.loadGroupCount(topic).longValue() > 0; + } + @Override public List<Group> getGroupRestrictions(TopicRef topic) { return topicToGroupDao.loadGroups(topic); @@ -281,6 +286,15 @@ public class AppointmentsServiceImpl implements AppointmentsService { } return Collections.emptyList(); } + + @Override + public List<Identity> getRestrictionMembers(TopicRef topic) { + List<Group> groups = topicToGroupDao.loadGroups(topic); + if (!groups.isEmpty()) { + return groupDao.getMembers(groups, TOPIC_USER_RESTRICTION_ROLE); + } + return Collections.emptyList(); + } @Override public Appointment createUnsavedAppointment(Topic topic) { diff --git a/src/main/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAO.java b/src/main/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAO.java index 123b14ee0a244af23527fb53c1f3dfa3d0186fae..4b7820f94a2fe3fcb173b587a5caafaa6617279e 100644 --- a/src/main/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAO.java +++ b/src/main/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAO.java @@ -144,6 +144,18 @@ public class TopicToGroupDAO { .setParameter("topicToGroupKey", topic.getKey()) .getResultList(); } + + Long loadGroupCount(TopicRef topic) { + QueryBuilder sb = new QueryBuilder(); + sb.append("select count (distinct topictogroup.group.id)"); + sb.append(" from appointmenttopictogroup topictogroup"); + sb.and().append(" topictogroup.topic.key = :topicToGroupKey"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Long.class) + .setParameter("topicToGroupKey", topic.getKey()) + .getSingleResult(); + } List<Group> loadGroups(TopicRef topic) { QueryBuilder sb = new QueryBuilder(); diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListController.java b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListController.java index 3de3a6014b0d3f0d97be01f9c4fa6c12fb49bf74..936d301ee478c953d52f7114d0d40d52947d5295 100644 --- a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListController.java +++ b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListController.java @@ -96,6 +96,7 @@ public abstract class AppointmentListController extends FormBasicController impl private CloseableModalController cmc; private TopicHeaderController headerCtrl; private DialogBoxController confirmParticipationCrtl; + private FindingConfirmationController findingConfirmationCtrl; private AppointmentEditController appointmentEditCtrl; private UserSearchController userSearchCtrl; private ParticipationRemoveController removeCtrl; @@ -362,7 +363,7 @@ public abstract class AppointmentListController extends FormBasicController impl row.setAddUserLink(link); } - protected void forgeRemoveLink(AppointmentRow row) { + protected void forgeRemoveUserLink(AppointmentRow row) { FormLink link = uifactory.addFormLink("remove_" + row.getKey(), CMD_REMOVE, "remove.user", null, null, Link.LINK); link.setUserObject(row); row.setRemoveLink(link); @@ -407,7 +408,7 @@ public abstract class AppointmentListController extends FormBasicController impl doConfirmDeletion(ureq, row.getAppointment()); } else if (CMD_CONFIRM.equals(cmd)) { AppointmentRow row = (AppointmentRow)link.getUserObject(); - doConfirm(row.getAppointment()); + doConfirm(ureq, row.getAppointment()); } else if (CMD_ADD_USER.equals(cmd)) { AppointmentRow row = (AppointmentRow)link.getUserObject(); doSelectUser(ureq, row.getAppointment()); @@ -428,6 +429,12 @@ public abstract class AppointmentListController extends FormBasicController impl doCreateParticipation(appointment); updateModel(); } + } else if (findingConfirmationCtrl == source) { + if (event == Event.DONE_EVENT) { + updateModel(); + } + cmc.deactivate(); + cleanUp(); } else if (appointmentEditCtrl == source) { if (event == Event.DONE_EVENT) { updateModel(); @@ -470,11 +477,13 @@ public abstract class AppointmentListController extends FormBasicController impl } private void cleanUp() { + removeAsListenerAndDispose(findingConfirmationCtrl); removeAsListenerAndDispose(appointmentDeleteCtrl); removeAsListenerAndDispose(appointmentEditCtrl); removeAsListenerAndDispose(userSearchCtrl); removeAsListenerAndDispose(removeCtrl); removeAsListenerAndDispose(cmc); + findingConfirmationCtrl = null; appointmentDeleteCtrl = null; appointmentEditCtrl = null; userSearchCtrl = null; @@ -545,15 +554,29 @@ public abstract class AppointmentListController extends FormBasicController impl cmc.activate(); } - private void doConfirm(Appointment appointment) { + private void doConfirm(UserRequest ureq, Appointment appointment) { if (Status.planned == appointment.getStatus()) { - appointmentsService.confirmAppointment(appointment); + if (Type.finding == topic.getType()) { + doConfirmFinding(ureq, appointment); + } else { + appointmentsService.confirmAppointment(appointment); + } } else { appointmentsService.unconfirmAppointment(appointment); } updateModel(); } + private void doConfirmFinding(UserRequest ureq, Appointment appointment) { + findingConfirmationCtrl = new FindingConfirmationController(ureq, getWindowControl(), appointment); + listenTo(findingConfirmationCtrl); + + cmc = new CloseableModalController(getWindowControl(), "close", findingConfirmationCtrl.getInitialComponent(), true, + translate("edit.appointment.title")); + listenTo(cmc); + cmc.activate(); + } + private void doSelectUser(UserRequest ureq, Appointment appointment) { userSearchCtrl = new UserSearchController(ureq, getWindowControl(), true, true, false); userSearchCtrl.setUserObject(appointment); diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListEditController.java b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListEditController.java index cea2b295ffca1069897fc1bc5ad1ace372d09385..2dd806fae8b910e2aed7997c446a1e1a966381af 100644 --- a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListEditController.java +++ b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListEditController.java @@ -138,11 +138,11 @@ public class AppointmentListEditController extends AppointmentListController { row.setStatusCSS("o_ap_status_" + appointment.getStatus().name()); } - boolean rebookable = Type.finding == topic.getType() - ? false + boolean removeUser = Type.finding == topic.getType() + ? participations.size() > 0 && Status.confirmed == appointment.getStatus() : participations.size() > 0; - if (rebookable) { - forgeRemoveLink(row); + if (removeUser) { + forgeRemoveUserLink(row); } if (Type.finding == topic.getType()) { diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/FindingConfirmationController.java b/src/main/java/org/olat/course/nodes/appointments/ui/FindingConfirmationController.java new file mode 100644 index 0000000000000000000000000000000000000000..3817d5f286e44093f2fffa71607559d07827870d --- /dev/null +++ b/src/main/java/org/olat/course/nodes/appointments/ui/FindingConfirmationController.java @@ -0,0 +1,221 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.appointments.ui; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.olat.basesecurity.BaseSecurityManager; +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.basesecurity.GroupRoles; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.id.Identity; +import org.olat.course.nodes.appointments.Appointment; +import org.olat.course.nodes.appointments.AppointmentsService; +import org.olat.course.nodes.appointments.Participation; +import org.olat.course.nodes.appointments.ParticipationSearchParams; +import org.olat.course.nodes.appointments.Topic; +import org.olat.course.nodes.appointments.ui.UserRestrictionTableModel.UserRestrictionCols; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryRelationType; +import org.olat.repository.RepositoryService; +import org.olat.user.UserManager; +import org.olat.user.UserPropertiesRow; +import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 25 Jun 2020<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +public class FindingConfirmationController extends FormBasicController { + + private static final String usageIdentifyer = UserRestrictionTableModel.class.getCanonicalName(); + + private UserRestrictionTableModel usersTableModel; + private FlexiTableElement usersTableEl; + + private final Appointment appointment; + private final Topic topic; + private final RepositoryEntry entry; + private final boolean isAdministrativeUser; + private final List<UserPropertyHandler> userPropertyHandlers; + private List<Participation> participations; + private List<Long> participationIdentityKeys; + + @Autowired + private AppointmentsService appointmentsService; + @Autowired + private RepositoryService repositoryService; + @Autowired + private BaseSecurityManager securityManager; + @Autowired + private BaseSecurityModule securityModule; + @Autowired + private UserManager userManager; + + public FindingConfirmationController(UserRequest ureq, WindowControl wControl, Appointment appointment) { + super(ureq, wControl, LAYOUT_VERTICAL); + setTranslator(userManager.getPropertyHandlerTranslator(getTranslator())); + this.appointment = appointment; + this.topic = appointment.getTopic(); + this.entry = topic.getEntry(); + + isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); + userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifyer, isAdministrativeUser); + + initForm(ureq); + loadModel(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + setFormInfo("finding.confirmation.info"); + + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + if(isAdministrativeUser) { + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(UserRestrictionCols.username)); + } + + int colIndex = UserRestrictionTableModel.USER_PROPS_OFFSET; + for (int i = 0; i < userPropertyHandlers.size(); i++) { + UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(i); + boolean visible = userManager.isMandatoryUserProperty(usageIdentifyer , userPropertyHandler); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, null, true, "userProp-" + colIndex)); + colIndex++; + } + + usersTableModel = new UserRestrictionTableModel(columnsModel, getLocale()); + usersTableEl = uifactory.addTableElement(getWindowControl(), "users", usersTableModel, 20, false, getTranslator(), formLayout); + usersTableEl.setAndLoadPersistedPreferences(ureq, "finding.confirmation"); + usersTableEl.setEmtpyTableMessageKey("finding.confirmation.empty.table"); + usersTableEl.setSelectAllEnable(true); + usersTableEl.setMultiSelect(true); + + FormLayoutContainer buttonCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + buttonCont.setRootForm(mainForm); + formLayout.add(buttonCont); + uifactory.addFormSubmitButton("save", buttonCont); + uifactory.addFormCancelButton("cancel", buttonCont, ureq, getWindowControl()); + } + + private void loadModel() { + boolean groupRestrictions = appointmentsService.hasGroupRestrictions(topic); + + List<Identity> restrictedIdentities = groupRestrictions + ? appointmentsService.getRestrictionMembers(topic) + : repositoryService.getMembers(entry, RepositoryEntryRelationType.all, GroupRoles.participant.name()); + + + ParticipationSearchParams params = new ParticipationSearchParams(); + params.setAppointment(appointment); + params.setFetchIdentities(true); + params.setFetchUser(true); + participations = appointmentsService.getParticipations(params); + + List<Identity> participationIdentities = new ArrayList<>(participations.size()); + participationIdentityKeys = new ArrayList<>(participations.size()); + for (Participation participation : participations) { + Identity identity = participation.getIdentity(); + participationIdentities.add(identity); + participationIdentityKeys.add(identity.getKey()); + } + + Set<Identity> allIdentities = new HashSet<>(); + allIdentities.addAll(participationIdentities); + allIdentities.addAll(restrictedIdentities); + + List<UserPropertiesRow> rows = new ArrayList<>(allIdentities.size()); + for (Identity identity : allIdentities) { + rows.add(new UserPropertiesRow(identity, userPropertyHandlers, getLocale())); + } + + usersTableModel.setObjects(rows); + usersTableEl.reset(true, true, true); + + Set<Integer> selectedRows = new HashSet<>(); + for(int i=usersTableModel.getRowCount(); i--> 0; ) { + UserPropertiesRow row = usersTableModel.getObject(i); + if(participationIdentityKeys.contains(row.getIdentityKey())) { + selectedRows.add(Integer.valueOf(i)); + } + } + usersTableEl.setMultiSelectedIndex(selectedRows); + } + + @Override + protected void formCancelled(UserRequest ureq) { + fireEvent(ureq, FormEvent.CANCELLED_EVENT); + } + + @Override + protected void formOK(UserRequest ureq) { + Set<Integer> index = usersTableEl.getMultiSelectedIndex(); + List<Long> selectedIdentityKeys = new ArrayList<>(index.size()); + for (Integer i : index) { + UserPropertiesRow row = usersTableModel.getObject(i.intValue()); + selectedIdentityKeys.add(row.getIdentityKey()); + } + + Collection<Long> addedIdentityKeys = new ArrayList<>(); + for (Long selectedKey : selectedIdentityKeys) { + if (!participationIdentityKeys.contains(selectedKey)) { + addedIdentityKeys.add(selectedKey); + } + } + Collection<Identity> identities = securityManager.loadIdentityByKeys(addedIdentityKeys); + appointmentsService.createParticipations(appointment, identities, getIdentity(), topic.isMultiParticipation(), + topic.isAutoConfirmation()); + + List<Participation> unselectedParticipations = new ArrayList<>(); + for (Participation participation : participations) { + Long identityKey = participation.getIdentity().getKey(); + if (!selectedIdentityKeys.contains(identityKey)) { + unselectedParticipations.add(participation); + } + } + appointmentsService.deleteParticipations(unselectedParticipations); + + appointmentsService.confirmAppointment(appointment); + + fireEvent(ureq, FormEvent.DONE_EVENT); + } + + @Override + protected void doDispose() { + // + } + +} diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/TopicGroupsController.java b/src/main/java/org/olat/course/nodes/appointments/ui/TopicGroupsController.java index fadf59ef847b1ff261b9926fe42949988ada99e0..6a64ecbe4b01caa471456ddff219606ac9fa9cf4 100644 --- a/src/main/java/org/olat/course/nodes/appointments/ui/TopicGroupsController.java +++ b/src/main/java/org/olat/course/nodes/appointments/ui/TopicGroupsController.java @@ -233,7 +233,7 @@ public class TopicGroupsController extends FormBasicController { usersTableModel = new UserRestrictionTableModel(columnsModel, getLocale()); usersTableEl = uifactory.addTableElement(getWindowControl(), "users", usersTableModel, 20, false, getTranslator(), usersLayout); - usersTableEl.setAndLoadPersistedPreferences(ureq, ""); + usersTableEl.setAndLoadPersistedPreferences(ureq, "topic.groups.users"); usersTableEl.setEmtpyTableMessageKey("groups.users.empty.table"); usersTableEl.setSelectAllEnable(true); usersTableEl.setMultiSelect(true); diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_de.properties index b0b2ee2f5995ae71d84456e1a0cec690a831465d..317e2b8cb89987b7ee05b695963a13b7958f6aac 100644 --- a/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_de.properties @@ -75,6 +75,8 @@ error.user.remove.atleastone=Sie m\u00fcssen mindestens einen Benutzer ausw\u00e filter.all=Alle anzeigen filter.future=Zuk\u00fcnftig filter.participated=Ausgew\u00e4hlt +finding.confirmation.empty.table=Es haben keine Teilnehmer diesen Termin ausgew\u00e4hlt. +finding.confirmation.info=Wollen Sie diesen Termin wirklich best\u00e4tigen?<br><br>In der Liste unten siehen Sie, welche Teilnehmer diesen Termin gew\u00e4hlt haben. Sie k\u00f6nnen weitere Teilnehmer zum Termin hinzuf\u00fcgen oder Teilnehmer aus dem Termin entfernen. full.day=Ganzer Tag groups.business.groups=Gruppenteilnehmer groups.course=Kursteilnehmer diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_en.properties index b71e69c5c7ed4ff8310f725b2fa7603f756cda19..3ac5e6f017767344df349b026c57b2a6bb740691 100644 --- a/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_en.properties @@ -74,6 +74,8 @@ error.user.remove.atleastone=You have to select at least one user. filter.all=Show all filter.future=Future filter.participated=Selected +finding.confirmation.empty.table=No participants could select this appointment. +finding.confirmation.info=Do you really want to confirm this appointment?<br><br>In the list below you can see which participants have chosen this appointment. You can add more participants to the appointment or remove participants from the appointment. full.day=Full day groups.business.groups=Group participants groups.course=Course participants diff --git a/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java b/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java index 5febf6910c3cff3ccf1f5c66fa1100ed458d3bc8..e9a3383b892a8dec97aa39b9bea0e09ebd1f9521 100644 --- a/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java +++ b/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java @@ -19,6 +19,8 @@ */ package org.olat.basesecurity.manager; +import static java.util.Arrays.asList; + import java.util.Collections; import java.util.List; import java.util.Set; @@ -171,6 +173,26 @@ public class GroupDAOTest extends OlatTestCase { Assert.assertEquals(1, members.size()); } + @Test + public void getMembersOfGroupCollection() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-3a-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-3a-2"); + Identity id3 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-3a-3"); + Identity id4 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-3a-4"); + Group group1 = groupDao.createGroup(); + Group group2 = groupDao.createGroup(); + groupDao.addMembershipTwoWay(group1, id1, "author"); + groupDao.addMembershipTwoWay(group1, id2, "author"); + groupDao.addMembershipTwoWay(group2, id1, "author"); + groupDao.addMembershipTwoWay(group2, id3, "author"); + groupDao.addMembershipTwoWay(group2, id4, "participant"); + dbInstance.commitAndCloseSession(); + + List<Identity> members = groupDao.getMembers(asList(group1, group2), "author"); + Assert.assertNotNull(members); + Assert.assertEquals(3, members.size()); + } + @Test public void countMembers() { Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-4-"); diff --git a/src/test/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAOTest.java b/src/test/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAOTest.java index 5686de95663225eb6c78bb8f627fd6700ca945ba..89ebf3ae97b305ca7851f7cace574d72df22bdb6 100644 --- a/src/test/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAOTest.java +++ b/src/test/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAOTest.java @@ -187,6 +187,24 @@ public class TopicToGroupDAOTest extends OlatTestCase { .doesNotContain(topicToGroup21); } + @Test + public void shouldLoadGroupCountByTopic() { + RepositoryEntry entry1 = JunitTestHelper.createAndPersistRepositoryEntry(); + Topic topic1 = appointmentsService.createTopic(entry1, random()); + Topic topic2 = appointmentsService.createTopic(entry1, random()); + Group group11 = groupDAO.createGroup(); + Group group12 = groupDAO.createGroup(); + Group group21 = groupDAO.createGroup(); + sut.create(topic1, group11); + sut.create(topic1, group12); + sut.create(topic2, group21); + dbInstance.commitAndCloseSession(); + + Long count = sut.loadGroupCount(topic1); + + assertThat(count).isEqualTo(2); + } + @Test public void shouldLoadGroupsByTopic() { RepositoryEntry entry1 = JunitTestHelper.createAndPersistRepositoryEntry();