diff --git a/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java b/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java index 9d06c57cedfc6de143aeed715ec1e7645142757e..796778256290610649a22a404ca28e538bd651b1 100644 --- a/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java +++ b/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java @@ -21,7 +21,6 @@ package org.olat.course.nodes; import java.util.List; -import org.apache.logging.log4j.Logger; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.stack.BreadcrumbPanel; import org.olat.core.gui.control.Controller; @@ -30,7 +29,6 @@ import org.olat.core.gui.control.generic.messages.MessageUIFactory; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Roles; -import org.olat.core.logging.Tracing; import org.olat.core.util.Util; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; @@ -57,7 +55,6 @@ import org.olat.repository.RepositoryEntry; public class BigBlueButtonCourseNode extends AbstractAccessableCourseNode { private static final long serialVersionUID = 7965344505304490859L; - private static final Logger log = Tracing.createLoggerFor(BigBlueButtonCourseNode.class); public static final String TYPE = "bigbluebutton"; // configuration diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java index 53c3192410b9880db559cc109f89c254bb457409..b161539fc508e22ed9bc0c8bade491721f7fde24 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java +++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java @@ -19,6 +19,13 @@ */ package org.olat.modules.bigbluebutton; +import java.util.ArrayList; +import java.util.List; + +import org.olat.core.util.StringHelper; + +import edu.emory.mathcs.backport.java.util.Collections; + /** * * Initial date: 24 mars 2020<br> @@ -30,6 +37,59 @@ public enum BigBlueButtonRoles { coach, owner, author, - administrator - + administrator; + + public boolean accept(BigBlueButtonRoles role) { + if(role == null) return false; + if(this == role) { + return true; + } + if(role == administrator) { + return true; + } + if(role == author) { + return (this == author || this == owner || this == coach); + } + return false; + } + + public static List<BigBlueButtonRoles> valuesAsList() { + List<BigBlueButtonRoles> roles = new ArrayList<>(); + Collections.addAll(roles, BigBlueButtonRoles.values()); + return roles; + } + + public static List<BigBlueButtonRoles> toList(String val) { + List<BigBlueButtonRoles> roles = new ArrayList<>(); + if(StringHelper.containsNonWhitespace(val)) { + String[] valArray = val.split("[,]"); + if(valArray != null && valArray.length > 0) { + for(String v:valArray) { + BigBlueButtonRoles role = BigBlueButtonRoles.valueOfSecure(v); + if(role != null) { + roles.add(role); + } + } + } + } + return roles; + } + + public static BigBlueButtonRoles valueOfSecure(String val) { + for(BigBlueButtonRoles role:BigBlueButtonRoles.values()) { + if(role.name().equals(val)) { + return role; + } + } + return null; + } + + public static String toString(List<BigBlueButtonRoles> roles) { + StringBuilder sb = new StringBuilder(); + for(BigBlueButtonRoles role:roles) { + if(sb.length() > 0) sb.append(","); + sb.append(role.name()); + } + return sb.toString(); + } } diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java index 1a40c108ea861396d51661a6a82a4a95c297a2c6..5e21ba35451d0a7f3cbe6bf9a6ee834d27340989 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java +++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java @@ -49,6 +49,7 @@ import org.olat.modules.bigbluebutton.BigBlueButtonMeeting; import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate; import org.olat.modules.bigbluebutton.BigBlueButtonModule; import org.olat.modules.bigbluebutton.BigBlueButtonRecording; +import org.olat.modules.bigbluebutton.BigBlueButtonRoles; import org.olat.modules.bigbluebutton.GuestPolicyEnum; import org.olat.modules.bigbluebutton.model.BigBlueButtonError; import org.olat.modules.bigbluebutton.model.BigBlueButtonErrorCodes; @@ -137,6 +138,7 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ template.setMaxConcurrentMeetings(maxConcurrentMeetings); template.setMaxParticipants(maxParticipants); template.setMaxDuration(maxDuration); + template.setPermittedRolesEnum(BigBlueButtonRoles.valuesAsList()); template.setMuteOnStart(muteOnStart); template.setAutoStartRecording(autoStartRecording); template.setAllowStartStopRecording(allowStartStopRecording); diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java index 2b14f332bc92b6917cc811d6d0ed63d7cdb6a630..6ec4098e3133ef150c5f1657ce77b0ce14eb5fe1 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java +++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java @@ -167,13 +167,13 @@ public class BigBlueButtonMeetingDAO { .append(" inner join meeting.template as template") .append(" where template.key=:templateKey") .append(" and (") - .append(" (meeting.startWithLeadTime>=:startDate and meeting.startWithLeadTime<=:endDate)") + .append(" (meeting.startDate>=:startDate and meeting.startDate<:endDate)") .append(" or") - .append(" (meeting.endWithFollowupTime>=:startDate and meeting.endWithFollowupTime<=:endDate)") + .append(" (meeting.endDate>:startDate and meeting.endDate<=:endDate)") .append(" or") - .append(" (meeting.startWithLeadTime>=:startDate and meeting.endWithFollowupTime<=:endDate)") + .append(" (meeting.startDate>=:startDate and meeting.endDate<=:endDate)") .append(" or") - .append(" (meeting.startWithLeadTime<=:startDate and meeting.endWithFollowupTime>=:endDate)") + .append(" (meeting.startDate<=:startDate and meeting.endDate>=:endDate)") .append(")"); return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Long.class) diff --git a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingTemplateImpl.java b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingTemplateImpl.java index 328155bd45308605325c64bb129a093365299bd8..14e9816315ef97d54ebd489e36f503f3170f97cd 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingTemplateImpl.java +++ b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingTemplateImpl.java @@ -387,7 +387,7 @@ public class BigBlueButtonMeetingTemplateImpl implements Persistable, BigBlueBut @Override public List<BigBlueButtonRoles> getPermittedRolesEnum() { - return null; + return BigBlueButtonRoles.toList(permittedRoles); } @Override @@ -395,7 +395,7 @@ public class BigBlueButtonMeetingTemplateImpl implements Persistable, BigBlueBut if(roles == null || roles.isEmpty()) { setPermittedRoles(null); } else { - + setPermittedRoles(BigBlueButtonRoles.toString(roles)); } } diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java index ffaf19c6c2f485516fe99512f93ee072c1f8066f..7dced6ae695c205d0a479aa49f34e0bc990e1594 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java @@ -19,6 +19,7 @@ */ package org.olat.modules.bigbluebutton.ui; +import java.util.ArrayList; import java.util.List; import org.olat.core.commons.persistence.SortKey; @@ -41,14 +42,19 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; +import org.olat.core.id.Roles; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupService; import org.olat.modules.bigbluebutton.BigBlueButtonManager; import org.olat.modules.bigbluebutton.BigBlueButtonMeeting; import org.olat.modules.bigbluebutton.BigBlueButtonModule; +import org.olat.modules.bigbluebutton.BigBlueButtonRoles; import org.olat.modules.bigbluebutton.model.BigBlueButtonErrors; import org.olat.modules.bigbluebutton.ui.BigBlueButtonMeetingTableModel.BMeetingsCols; import org.olat.modules.gotomeeting.ui.GoToMeetingTableModel.MeetingsCols; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntrySecurity; +import org.olat.repository.RepositoryManager; import org.springframework.beans.factory.annotation.Autowired; /** @@ -72,10 +78,14 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController { private final RepositoryEntry entry; private final BusinessGroup businessGroup; + @Autowired + private RepositoryManager repositoryManager; @Autowired private BigBlueButtonModule bigBlueButtonModule; @Autowired private BigBlueButtonManager bigBlueButtonManager; + @Autowired + private BusinessGroupService businessGroupService; public BigBlueButtonEditMeetingsController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, String subIdentifier, BusinessGroup group, boolean readOnly) { @@ -183,8 +193,10 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController { private void doAddMeeting(UserRequest ureq) { if(guardModalController(editMeetingCtlr)) return; - - editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(), entry, subIdent, businessGroup); + + List<BigBlueButtonRoles> editionRoles= getPermittedRoles(ureq); + editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(), + entry, subIdent, businessGroup, editionRoles); listenTo(editMeetingCtlr); cmc = new CloseableModalController(getWindowControl(), "close", editMeetingCtlr.getInitialComponent(), @@ -196,7 +208,9 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController { private void doEditMeeting(UserRequest ureq, BigBlueButtonMeeting meeting) { if(guardModalController(editMeetingCtlr)) return; - editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(), meeting); + List<BigBlueButtonRoles> editionRoles= getPermittedRoles(ureq); + editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(), + meeting, editionRoles); listenTo(editMeetingCtlr); cmc = new CloseableModalController(getWindowControl(), "close", editMeetingCtlr.getInitialComponent(), @@ -205,6 +219,35 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController { listenTo(cmc); } + private List<BigBlueButtonRoles> getPermittedRoles(UserRequest ureq) { + Roles roles = ureq.getUserSession().getRoles(); + + List<BigBlueButtonRoles> editionRoles = new ArrayList<>(); + if(businessGroup != null) { + if(roles.isAdministrator()) { + editionRoles.add(BigBlueButtonRoles.administrator); + } + if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), businessGroup.getKey(), true, false, null)) { + editionRoles.add(BigBlueButtonRoles.coach); + } + } else if(entry != null) { + RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(getIdentity(), roles, entry); + if(roles.isAdministrator()) { + editionRoles.add(BigBlueButtonRoles.administrator); + } + if(reSecurity.isAuthor()) { + editionRoles.add(BigBlueButtonRoles.author); + } + if(reSecurity.isEntryAdmin()) { + editionRoles.add(BigBlueButtonRoles.owner); + } + if(reSecurity.isCourseCoach()) { + editionRoles.add(BigBlueButtonRoles.coach); + } + } + return editionRoles; + } + private void doConfirmDelete(UserRequest ureq, BigBlueButtonMeeting meeting) { String confirmDeleteTitle = translate("confirm.delete.meeting.title", new String[]{ meeting.getName() }); String confirmDeleteText = translate("confirm.delete.meeting", new String[]{ meeting.getName() }); diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java index d0a85df1da4615a503e662d21a905460b0f98825..bace9acb687a62ab8296d1d2e8965e8bc40ed08f 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java @@ -44,6 +44,7 @@ import org.olat.modules.bigbluebutton.BigBlueButtonManager; import org.olat.modules.bigbluebutton.BigBlueButtonMeeting; import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate; import org.olat.modules.bigbluebutton.BigBlueButtonModule; +import org.olat.modules.bigbluebutton.BigBlueButtonRoles; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; @@ -71,6 +72,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { private final RepositoryEntry entry; private final BusinessGroup businessGroup; private BigBlueButtonMeeting meeting; + private final List<BigBlueButtonRoles> editionRoles; private List<BigBlueButtonMeetingTemplate> templates; private FormLink openCalLink; @@ -83,23 +85,26 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { private BigBlueButtonManager bigBlueButtonManager; public EditBigBlueButtonMeetingController(UserRequest ureq, WindowControl wControl, - RepositoryEntry entry, String subIdent, BusinessGroup businessGroup) { + RepositoryEntry entry, String subIdent, BusinessGroup businessGroup, List<BigBlueButtonRoles> editionRoles) { super(ureq, wControl); this.entry = entry; this.subIdent = subIdent; this.businessGroup = businessGroup; + this.editionRoles = editionRoles; templates = bigBlueButtonManager.getTemplates(); initForm(ureq); updateUI(); } - public EditBigBlueButtonMeetingController(UserRequest ureq, WindowControl wControl, BigBlueButtonMeeting meeting) { + public EditBigBlueButtonMeetingController(UserRequest ureq, WindowControl wControl, + BigBlueButtonMeeting meeting, List<BigBlueButtonRoles> editionRoles) { super(ureq, wControl); entry = meeting.getEntry(); subIdent = meeting.getSubIdent(); businessGroup = meeting.getBusinessGroup(); this.meeting = meeting; + this.editionRoles = editionRoles; templates = bigBlueButtonManager.getTemplates(); initForm(ureq); @@ -125,7 +130,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { ? null : meeting.getTemplate().getKey(); KeyValues templatesKeyValues = new KeyValues(); for(BigBlueButtonMeetingTemplate template:templates) { - if(template.isEnabled() || template.getKey().equals(selectedTemplateKey)) { + if(accept(template) || template.getKey().equals(selectedTemplateKey)) { templatesKeyValues.add(KeyValues.entry(template.getKey().toString(), template.getName())); } } @@ -145,7 +150,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { } } } - if(!templateSelected) { + if(!templateSelected && templatesKeys.length > 0) { templateEl.select(templatesKeys[0], true); } openCalLink = uifactory.addFormLink("calendar.open", formLayout); @@ -184,6 +189,20 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { uifactory.addFormSubmitButton("save", buttonLayout); } + private boolean accept(BigBlueButtonMeetingTemplate template) { + if(!template.isEnabled()) return false; + + List<BigBlueButtonRoles> roles = template.getPermittedRolesEnum(); + for(BigBlueButtonRoles role:roles) { + for(BigBlueButtonRoles editionRole:editionRoles) { + if(role.accept(editionRole)) { + return true; + } + } + } + return false; + } + private void updateUI() { boolean permanent = permanentEl.isAtLeastSelected(1); startDateEl.setVisible(!permanent); @@ -263,8 +282,8 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { } } - allOk &= validateTime(leadTimeEl); - allOk &= validateTime(followupTimeEl); + allOk &= validateTime(leadTimeEl, 15l); + allOk &= validateTime(followupTimeEl, 15l); templateEl.clearError(); if(!templateEl.isOneSelected()) { @@ -289,12 +308,17 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { return allOk; } - private boolean validateTime(TextElement el) { + private boolean validateTime(TextElement el, long maxValue) { boolean allOk = true; el.clearError(); - if(StringHelper.containsNonWhitespace(el.getValue()) && !StringHelper.isLong(el.getValue())) { - el.setErrorKey("form.error.nointeger", null); - allOk &= false; + if(StringHelper.containsNonWhitespace(el.getValue())) { + if(!StringHelper.isLong(el.getValue())) { + el.setErrorKey("form.error.nointeger", null); + allOk &= false; + } else if(Long.parseLong(el.getValue()) > maxValue) { + el.setErrorKey("error.too.long.time", new String[] { Long.toString(maxValue) }); + allOk &= false; + } } return allOk; } diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java index de560d92bf29895b491f5cfeeff45b6a70670c3a..802ffbf2a3b1f650adb55e1b50ed8b79c81a892a 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java @@ -19,6 +19,10 @@ */ package org.olat.modules.bigbluebutton.ui; +import java.util.List; +import java.util.stream.Collectors; + +import org.olat.core.commons.persistence.DB; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; @@ -28,12 +32,14 @@ import org.olat.core.gui.components.form.flexible.elements.TextElement; 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.util.KeyValues; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.StringHelper; import org.olat.modules.bigbluebutton.BigBlueButtonManager; import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate; +import org.olat.modules.bigbluebutton.BigBlueButtonRoles; import org.springframework.beans.factory.annotation.Autowired; /** @@ -51,6 +57,7 @@ public class EditBigBlueButtonTemplateController extends FormBasicController { private TextElement descriptionEl; private MultipleSelectionElement enableEl; + private MultipleSelectionElement rolesEl; private TextElement maxConcurrentMeetingsEl; private TextElement maxParticipantsEl; @@ -77,6 +84,8 @@ public class EditBigBlueButtonTemplateController extends FormBasicController { private final boolean readOnly; private BigBlueButtonMeetingTemplate template; + @Autowired + private DB dbInstance; @Autowired private BigBlueButtonManager bigBlueButtonManager; @@ -112,6 +121,22 @@ public class EditBigBlueButtonTemplateController extends FormBasicController { enableEl = uifactory.addCheckboxesHorizontal("template.enabled", "template.enabled", formLayout, onKeys, new String[] { "" }); enableEl.select(onKeys[0], enable); + KeyValues rolesKeyValues = new KeyValues(); + for(BigBlueButtonRoles role:BigBlueButtonRoles.values()) { + rolesKeyValues.add(KeyValues.entry(role.name(), translate("role.".concat(role.name())))); + } + rolesEl = uifactory.addCheckboxesVertical("template.roles", "template.roles", formLayout, + rolesKeyValues.keys(), rolesKeyValues.values(), 1); + List<BigBlueButtonRoles> roles; + if(template != null) { + roles = template.getPermittedRolesEnum(); + } else { + roles = BigBlueButtonRoles.valuesAsList(); + } + for(BigBlueButtonRoles role:roles) { + rolesEl.select(role.name(), true); + } + String maxConcurrentMeetings = template == null || template.getMaxConcurrentMeetings() == null ? "" : template.getMaxConcurrentMeetings().toString(); maxConcurrentMeetingsEl = uifactory.addTextElement("template.max.concurrent.meetings", "template.max.concurrent.meetings", 8, maxConcurrentMeetings, formLayout); @@ -119,7 +144,12 @@ public class EditBigBlueButtonTemplateController extends FormBasicController { maxParticipantsEl = uifactory.addTextElement("template.maxParticipants", "template.maxParticipants", 8, maxParticipants, formLayout); maxParticipantsEl.setMandatory(true); - String maxDuration = template == null || template.getMaxDuration() == null ? null : template.getMaxDuration().toString(); + String maxDuration = null; + if(template == null) { + maxDuration = "240"; + } else if(template.getMaxDuration() != null) { + maxDuration = template.getMaxDuration().toString(); + } maxDurationEl = uifactory.addTextElement("template.maxDuration", "template.maxDuration", 8, maxDuration, formLayout); String[] onValues = new String[] { translate("yes"), translate("no") }; @@ -307,6 +337,10 @@ public class EditBigBlueButtonTemplateController extends FormBasicController { template.setDescription(descriptionEl.getValue()); template.setEnabled(enableEl.isAtLeastSelected(1)); + List<BigBlueButtonRoles> roles = rolesEl.getSelectedKeys().stream() + .map(BigBlueButtonRoles::valueOf).collect(Collectors.toList()); + template.setPermittedRolesEnum(roles); + if(StringHelper.containsNonWhitespace(maxConcurrentMeetingsEl.getValue()) && StringHelper.isLong(maxConcurrentMeetingsEl.getValue())) { template.setMaxConcurrentMeetings(Long.valueOf(maxConcurrentMeetingsEl.getValue()).intValue()); @@ -348,6 +382,7 @@ public class EditBigBlueButtonTemplateController extends FormBasicController { template.setLockSettingsLockOnJoinConfigurable(getSelected(lockSettingsLockOnJoinConfigurableEl)); template = bigBlueButtonManager.updateTemplate(template); + dbInstance.commit(); fireEvent(ureq, Event.DONE_EVENT); } diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/TemplateMinuteCellRenderer.java b/src/main/java/org/olat/modules/bigbluebutton/ui/TemplateMinuteCellRenderer.java index e2a2ebff59fe5aef76b6fa4c093208efd017abcc..353a00e475c89e6d3e1b749a2aa19668ad6504b1 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/TemplateMinuteCellRenderer.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/TemplateMinuteCellRenderer.java @@ -44,7 +44,7 @@ public class TemplateMinuteCellRenderer implements FlexiCellRenderer { public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source, URLBuilder ubu, Translator transl) { if(cellValue instanceof Number) { - translator.translate("minutes", new String[] { Integer.toString(((Number)cellValue).intValue()) }); + target.append(translator.translate("minutes", new String[] { Integer.toString(((Number)cellValue).intValue()) })); } } } diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties index c13653cf8b4cc4abe4b85a676e8a959b8639c748..7c4725999d29ff7c52649a86db9921dc495f403a 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties @@ -27,6 +27,7 @@ error.end.past=Meeting kann nicht in Vergangenheit geplant werden. error.prefix=Ein Fehler ist aufgetreten\: error.server.raw={1} <small>Schl\u00FCssel\: {0}</small> error.start.after.end=Das Datum f\u00FCr das Ende des Meetings darf nicht vor dem Beginn Datum sein. +error.too.long.time=Zeit ist zu lang. Es ist auf {0} Minuten limitiert. guest.policy.always.accept=Always accept guest.policy.always.deny=Always deny guest.policy.ask.moderator=Ask moderator @@ -65,6 +66,10 @@ recordings=Aufzeichnungen recording.browser.infos=Aufzeichnungen k\u00F6nnen nur mit Google Chrome und Firefox gesehen werden. recording.type.podcast=Podcast recording.type.presentation=Vorstellung +role.administrator=Administrator +role.author=Autor +role.coach=Coach +role.owner=Course owner server.overloaded=Es gibt kein Platz verf\u00FCgbar auf dem Server an den gew\u00E4hlten Datum. table.header.enabled=Eingeschaltet table.header.permanent=Dauernd @@ -103,6 +108,7 @@ template.max.concurrent.meetings=Max. gleichzeitige Meetings template.muteOnStart=Mute on start template.name=Name template.record=Aufzeichnen +template.roles=Erlaubt Vorlage zu verwenden template.webcamsOnlyForModerator=Webcams only for moderators templates.title=Vorlagen view=Ansehen diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties index 5567d1df68a301d754b308d94a1532e545a0096e..1728d68cdd79057f28dfe37fc32a6f5dc1206210 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties @@ -27,6 +27,7 @@ error.end.past=Meeting cannot be planned in the past. error.prefix=An error happened\: error.server.raw={1} <small>Key {0}</small> error.start.after.end=The end date of the meeting must not be before the start date. +error.too.long.time=Time is too long. It is limited to {0} minutes. guest.policy.always.accept=Always accept guest.policy.always.deny=Always deny guest.policy.ask.moderator=Ask moderator @@ -65,6 +66,10 @@ recordings=Recordings recording.browser.infos=Recordings can only be viewed with Google Chrome or Firefox. recording.type.podcast=Podcast recording.type.presentation=Presentation +role.administrator=Administrator +role.author=Author +role.coach=coach +role.owner=Kursbesitzer server.overloaded=There is no place available on the server for the choosen dates. table.header.enabled=Enabled table.header.permanent=Permanent @@ -103,6 +108,7 @@ template.max.concurrent.meetings=Max. concurrent meetings template.muteOnStart=Mute on start template.name=Name template.record=Record +template.roles=Allow to use the template template.webcamsOnlyForModerator=Webcams only for moderators templates.title=Templates view=View diff --git a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java index bc6596e92437b86ca411ea628a2af8e58e6f4e18..12e6947fd801ec0f78a97f851547cd852a016ac9 100644 --- a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java +++ b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java @@ -164,14 +164,20 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase { List<Long> concurrent = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 15), date(1, 19)); Assert.assertEquals(2, concurrent.size()); - List<Long> concurrentFollowup = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 20), date(1, 21)); - Assert.assertEquals(1, concurrentFollowup.size()); + List<Long> concurrentFollowup = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 17), date(1, 21)); + Assert.assertEquals(2, concurrentFollowup.size()); - List<Long> concurrentWidePeriod = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(0, 10), date(3, 21)); + List<Long> concurrentWidePeriod = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(0, 10), date(3, 21)); Assert.assertEquals(4, concurrentWidePeriod.size()); - List<Long> concurrentWithin = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(2, 13), date(2, 14)); + List<Long> concurrentWithin = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(2, 13), date(2, 14)); Assert.assertEquals(1, concurrentWithin.size()); + + List<Long> concurrentOverlapAfter = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 19), date(1, 21)); + Assert.assertTrue(concurrentOverlapAfter.isEmpty()); + + List<Long> concurrentOverlapBefore = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 7), date(1, 10)); + Assert.assertTrue(concurrentOverlapBefore.isEmpty()); } private BigBlueButtonMeeting createMeeting(String name, Date start, int leadTime, Date end, int followupTime,