Skip to content
Snippets Groups Projects
Commit a719a36e authored by srosse's avatar srosse
Browse files

OO-3516: implements principal role for courses

parent 3fb6c087
No related branches found
No related tags found
No related merge requests found
Showing
with 187 additions and 90 deletions
...@@ -196,13 +196,12 @@ public class ChecklistCourseNode extends AbstractAccessableCourseNode { ...@@ -196,13 +196,12 @@ public class ChecklistCourseNode extends AbstractAccessableCourseNode {
UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) { UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
ICourse course = CourseFactory.loadCourse(userCourseEnv.getCourseEnvironment().getCourseResourceableId()); ICourse course = CourseFactory.loadCourse(userCourseEnv.getCourseEnvironment().getCourseResourceableId());
CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager(); CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
boolean canEdit = cgm.isIdentityCourseAdministrator(ureq.getIdentity()); boolean canEdit = userCourseEnv.isAdmin();
boolean canManage; boolean canManage;
if(canEdit) { if(canEdit) {
canManage = true; canManage = true;
} else { } else {
canManage = cgm.isIdentityCourseCoach(ureq.getIdentity()) canManage = userCourseEnv.isCoach() || cgm.hasRight(ureq.getIdentity(), CourseRights.RIGHT_GROUPMANAGEMENT);
|| cgm.hasRight(ureq.getIdentity(), CourseRights.RIGHT_GROUPMANAGEMENT);
} }
Checklist checklist = loadOrCreateChecklist(userCourseEnv.getCourseEnvironment().getCoursePropertyManager()); Checklist checklist = loadOrCreateChecklist(userCourseEnv.getCourseEnvironment().getCoursePropertyManager());
ChecklistDisplayController checkController = new ChecklistDisplayController(ureq, wControl, checklist, ChecklistDisplayController checkController = new ChecklistDisplayController(ureq, wControl, checklist,
......
...@@ -35,7 +35,6 @@ import org.olat.course.condition.ConditionEditController; ...@@ -35,7 +35,6 @@ import org.olat.course.condition.ConditionEditController;
import org.olat.course.editor.CourseEditorEnv; import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.editor.NodeEditController; import org.olat.course.editor.NodeEditController;
import org.olat.course.editor.StatusDescription; import org.olat.course.editor.StatusDescription;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.nodes.AbstractAccessableCourseNode; import org.olat.course.nodes.AbstractAccessableCourseNode;
import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.StatusDescriptionHelper; import org.olat.course.nodes.StatusDescriptionHelper;
...@@ -134,8 +133,7 @@ public class VCCourseNode extends AbstractAccessableCourseNode { ...@@ -134,8 +133,7 @@ public class VCCourseNode extends AbstractAccessableCourseNode {
UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) { UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
updateModuleConfigDefaults(false); updateModuleConfigDefaults(false);
// check if user is moderator of the virtual classroom // check if user is moderator of the virtual classroom
CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager(); boolean moderator = userCourseEnv.isAdmin();
boolean moderator = cgm.isIdentityCourseAdministrator(ureq.getIdentity());
// load configuration // load configuration
final String providerId = getModuleConfiguration().getStringValue(CONF_PROVIDER_ID); final String providerId = getModuleConfiguration().getStringValue(CONF_PROVIDER_ID);
......
...@@ -45,7 +45,6 @@ import org.olat.core.util.event.GenericEventListener; ...@@ -45,7 +45,6 @@ import org.olat.core.util.event.GenericEventListener;
import org.olat.core.util.resource.OresHelper; import org.olat.core.util.resource.OresHelper;
import org.olat.course.CourseFactory; import org.olat.course.CourseFactory;
import org.olat.course.ICourse; import org.olat.course.ICourse;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.nodes.ObjectivesHelper; import org.olat.course.nodes.ObjectivesHelper;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.modules.ModuleConfiguration; import org.olat.modules.ModuleConfiguration;
...@@ -110,9 +109,7 @@ public class DENRunController extends BasicController implements GenericEventLis ...@@ -110,9 +109,7 @@ public class DENRunController extends BasicController implements GenericEventLis
runVC = new VelocityContainer("dateVC", VELOCITY_ROOT + "/run.html", getTranslator(), this); runVC = new VelocityContainer("dateVC", VELOCITY_ROOT + "/run.html", getTranslator(), this);
//show only the options for managing dates and participants if user is admin or course coach //show only the options for managing dates and participants if user is admin or course coach
if(userCourseEnv.isAdmin() || userCourseEnv.isCoach()) {
CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
if(cgm.isIdentityCourseAdministrator(ureq.getIdentity()) || cgm.isIdentityCourseCoach(ureq.getIdentity())) {
// subscription // subscription
subsContext = new SubscriptionContext(course, courseNode.getIdent()); subsContext = new SubscriptionContext(course, courseNode.getIdent());
// if sc is null, then no subscription is desired // if sc is null, then no subscription is desired
......
...@@ -635,7 +635,7 @@ public class CourseFactory { ...@@ -635,7 +635,7 @@ public class CourseFactory {
ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(entry); ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(entry);
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, wControl); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, wControl);
RepositoryEntrySecurity reSecurity = new RepositoryEntrySecurity(false, false, false, false, false, false, false, false, false, false, true, false); RepositoryEntrySecurity reSecurity = new RepositoryEntrySecurity(false, false, false, false, false, false, false, false, false, false, false, true, false);
return new RunMainController(ureq, bwControl, null, course, entry, reSecurity, null); return new RunMainController(ureq, bwControl, null, course, entry, reSecurity, null);
} }
} }
......
...@@ -66,25 +66,28 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -66,25 +66,28 @@ import org.springframework.beans.factory.annotation.Autowired;
*/ */
public class AssessmentModeListController extends FormBasicController implements GenericEventListener { public class AssessmentModeListController extends FormBasicController implements GenericEventListener {
private FormLink addLink;
private FormLink deleteLink;
private FlexiTableElement tableEl; private FlexiTableElement tableEl;
private FormLink addLink, deleteLink;
private AssessmentModeListModel model; private AssessmentModeListModel model;
private final TooledStackedPanel toolbarPanel; private final TooledStackedPanel toolbarPanel;
private DialogBoxController startDialogBox, stopDialogBox,deleteDialogBox; private DialogBoxController startDialogBox, stopDialogBox, deleteDialogBox;
private AssessmentModeEditController editCtrl; private AssessmentModeEditController editCtrl;
private final RepositoryEntry entry; private final RepositoryEntry entry;
private final AssessmentModeSecurityCallback secCallback;
@Autowired @Autowired
private AssessmentModeManager assessmentModeMgr; private AssessmentModeManager assessmentModeMgr;
@Autowired @Autowired
private AssessmentModeCoordinationService assessmentModeCoordinationService; private AssessmentModeCoordinationService assessmentModeCoordinationService;
public AssessmentModeListController(UserRequest ureq, WindowControl wControl, public AssessmentModeListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel,
TooledStackedPanel toolbarPanel, RepositoryEntry entry) { RepositoryEntry entry, AssessmentModeSecurityCallback secCallback) {
super(ureq, wControl, "mode_list"); super(ureq, wControl, "mode_list");
this.entry = entry; this.entry = entry;
this.secCallback = secCallback;
this.toolbarPanel = toolbarPanel; this.toolbarPanel = toolbarPanel;
toolbarPanel.addListener(this); toolbarPanel.addListener(this);
...@@ -105,13 +108,14 @@ public class AssessmentModeListController extends FormBasicController implements ...@@ -105,13 +108,14 @@ public class AssessmentModeListController extends FormBasicController implements
@Override @Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
addLink = uifactory.addFormLink("add", "add", "add.mode", null, formLayout, Link.BUTTON); if(secCallback.canEditAssessmentMode()) {
addLink.setElementCssClass("o_sel_assessment_mode_add"); addLink = uifactory.addFormLink("add", "add", "add.mode", null, formLayout, Link.BUTTON);
addLink.setIconLeftCSS("o_icon o_icon_add"); addLink.setElementCssClass("o_sel_assessment_mode_add");
addLink.setIconLeftCSS("o_icon o_icon_add");
deleteLink = uifactory.addFormLink("delete", "delete", "delete.mode", null, formLayout, Link.BUTTON); deleteLink = uifactory.addFormLink("delete", "delete", "delete.mode", null, formLayout, Link.BUTTON);
deleteLink.setIconLeftCSS("o_icon o_icon_delete"); deleteLink.setIconLeftCSS("o_icon o_icon_delete");
}
//add the table //add the table
FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
...@@ -126,16 +130,21 @@ public class AssessmentModeListController extends FormBasicController implements ...@@ -126,16 +130,21 @@ public class AssessmentModeListController extends FormBasicController implements
true, Cols.followupTime.name(), new TimeCellRenderer(getTranslator()))); true, Cols.followupTime.name(), new TimeCellRenderer(getTranslator())));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.target.i18nKey(), Cols.target.ordinal(), columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.target.i18nKey(), Cols.target.ordinal(),
true, Cols.target.name(), new TargetAudienceCellRenderer(getTranslator()))); true, Cols.target.name(), new TargetAudienceCellRenderer(getTranslator())));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("start", Cols.start.ordinal(), "start",
if(secCallback.canStartStopAssessment()) {
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("start", Cols.start.ordinal(), "start",
new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("start"), "start"), null))); new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("start"), "start"), null)));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("stop", Cols.stop.ordinal(), "stop", columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("stop", Cols.stop.ordinal(), "stop",
new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("stop"), "stop"), null))); new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("stop"), "stop"), null)));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("edit", translate("edit"), "edit")); }
if(secCallback.canEditAssessmentMode()) {
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("edit", translate("edit"), "edit"));
}
model = new AssessmentModeListModel(columnsModel, getTranslator(), assessmentModeCoordinationService); model = new AssessmentModeListModel(columnsModel, getTranslator(), assessmentModeCoordinationService);
tableEl = uifactory.addTableElement(getWindowControl(), "table", model, 20, false, getTranslator(), formLayout); tableEl = uifactory.addTableElement(getWindowControl(), "table", model, 20, false, getTranslator(), formLayout);
tableEl.setMultiSelect(true); tableEl.setMultiSelect(secCallback.canEditAssessmentMode());
tableEl.setSelectAllEnable(true); tableEl.setSelectAllEnable(secCallback.canEditAssessmentMode());
} }
private void loadModel() { private void loadModel() {
...@@ -143,9 +152,10 @@ public class AssessmentModeListController extends FormBasicController implements ...@@ -143,9 +152,10 @@ public class AssessmentModeListController extends FormBasicController implements
model.setObjects(modes); model.setObjects(modes);
tableEl.reloadData(); tableEl.reloadData();
// don't show table and button if there is nothing // don't show table and button if there is nothing
tableEl.setVisible(modes.size() > 0); tableEl.setVisible(!modes.isEmpty());
deleteLink.setVisible(modes.size() > 0); if(deleteLink != null) {
deleteLink.setVisible(!modes.isEmpty());
}
} }
@Override @Override
...@@ -210,7 +220,7 @@ public class AssessmentModeListController extends FormBasicController implements ...@@ -210,7 +220,7 @@ public class AssessmentModeListController extends FormBasicController implements
if(index == null || index.isEmpty()) { if(index == null || index.isEmpty()) {
showWarning("error.atleastone"); showWarning("error.atleastone");
} else { } else {
List<AssessmentMode> rows = new ArrayList<AssessmentMode>(index.size()); List<AssessmentMode> rows = new ArrayList<>(index.size());
for(Integer i:index) { for(Integer i:index) {
rows.add(model.getObject(i.intValue())); rows.add(model.getObject(i.intValue()));
} }
......
/**
* <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.assessment.ui.mode;
/**
*
* Initial date: 20 juil. 2018<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public interface AssessmentModeSecurityCallback {
public boolean canStartStopAssessment();
public boolean canEditAssessmentMode();
}
/**
* <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.assessment.ui.mode;
/**
*
* Initial date: 20 juil. 2018<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class AssessmentModeSecurityCallbackFactory {
public static AssessmentModeSecurityCallback getSecurityCallback(boolean canModify) {
return new AssessmentModeSecurityCallbackImpl(canModify);
}
private static class AssessmentModeSecurityCallbackImpl implements AssessmentModeSecurityCallback {
private final boolean canModify;
public AssessmentModeSecurityCallbackImpl(boolean canModify) {
this.canModify = canModify;
}
@Override
public boolean canStartStopAssessment() {
return canModify;
}
@Override
public boolean canEditAssessmentMode() {
return canModify;
}
}
}
<fieldset class="o_sel_assessment_mode_list"> <fieldset class="o_sel_assessment_mode_list">
<legend>$r.translate("modes.title")</legend> <legend>$r.translate("modes.title")</legend>
<div class="o_info">$r.translate("modes.description")</div> <div class="o_info">$r.translate("modes.description")</div>
<div class="o_button_group o_button_group_right">$r.render("add")</div> #if($r.available("add"))
<div class="o_button_group o_button_group_right">$r.render("add")</div>
#end
$r.render("table") $r.render("table")
<div class="o_button_group">$r.render("delete")</div> #if($r.available("delete"))
<div class="o_button_group">$r.render("delete")</div>
#end
</fieldset> </fieldset>
\ No newline at end of file
...@@ -84,7 +84,7 @@ public class AssessmentCourseOverviewController extends BasicController { ...@@ -84,7 +84,7 @@ public class AssessmentCourseOverviewController extends BasicController {
ICourse course = CourseFactory.loadCourse(courseEntry); ICourse course = CourseFactory.loadCourse(courseEntry);
boolean hasAssessableNodes = course.hasAssessableNodes(); boolean hasAssessableNodes = course.hasAssessableNodes();
mainVC.contextPut("hasAssessableNodes", new Boolean(hasAssessableNodes)); mainVC.contextPut("hasAssessableNodes", Boolean.valueOf(hasAssessableNodes));
// assessment changes subscription // assessment changes subscription
if (hasAssessableNodes) { if (hasAssessableNodes) {
......
...@@ -278,7 +278,7 @@ public class PersistingCourseGroupManager implements CourseGroupManager { ...@@ -278,7 +278,7 @@ public class PersistingCourseGroupManager implements CourseGroupManager {
// not really a group management method, for your convenience we have a // not really a group management method, for your convenience we have a
// shortcut here... // shortcut here...
return repositoryService.hasRoleExpanded(identity, getCourseEntry(), OrganisationRoles.administrator.name(), return repositoryService.hasRoleExpanded(identity, getCourseEntry(), OrganisationRoles.administrator.name(),
OrganisationRoles.learnresourcemanager.name(), GroupRoles.owner.name()); OrganisationRoles.principal.name(), OrganisationRoles.learnresourcemanager.name(), GroupRoles.owner.name());
} }
@Override @Override
......
...@@ -27,6 +27,7 @@ import org.olat.core.util.StringHelper; ...@@ -27,6 +27,7 @@ import org.olat.core.util.StringHelper;
import org.olat.course.assessment.ui.tool.AssessmentIdentityCourseController; import org.olat.course.assessment.ui.tool.AssessmentIdentityCourseController;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.group.ui.main.AbstractMemberListController; import org.olat.group.ui.main.AbstractMemberListController;
import org.olat.group.ui.main.MemberListSecurityCallback;
import org.olat.group.ui.main.MemberRow; import org.olat.group.ui.main.MemberRow;
import org.olat.group.ui.main.SearchMembersParams; import org.olat.group.ui.main.SearchMembersParams;
import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntry;
...@@ -43,8 +44,9 @@ public class MemberListController extends AbstractMemberListController { ...@@ -43,8 +44,9 @@ public class MemberListController extends AbstractMemberListController {
private final UserCourseEnvironment coachCourseEnv; private final UserCourseEnvironment coachCourseEnv;
public MemberListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, public MemberListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
RepositoryEntry repoEntry, UserCourseEnvironment coachCourseEnv, SearchMembersParams searchParams, String infos) { RepositoryEntry repoEntry, UserCourseEnvironment coachCourseEnv, MemberListSecurityCallback secCallback,
super(ureq, wControl, repoEntry, "all_member_list", coachCourseEnv.isCourseReadOnly(), stackPanel); SearchMembersParams searchParams, String infos) {
super(ureq, wControl, repoEntry, "all_member_list", secCallback, stackPanel);
this.searchParams = searchParams; this.searchParams = searchParams;
this.coachCourseEnv = coachCourseEnv; this.coachCourseEnv = coachCourseEnv;
......
...@@ -32,6 +32,7 @@ import org.olat.core.util.StringHelper; ...@@ -32,6 +32,7 @@ import org.olat.core.util.StringHelper;
import org.olat.course.assessment.ui.tool.AssessmentIdentityCourseController; import org.olat.course.assessment.ui.tool.AssessmentIdentityCourseController;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.group.ui.main.AbstractMemberListController; import org.olat.group.ui.main.AbstractMemberListController;
import org.olat.group.ui.main.MemberListSecurityCallback;
import org.olat.group.ui.main.MemberRow; import org.olat.group.ui.main.MemberRow;
import org.olat.group.ui.main.SearchMembersParams; import org.olat.group.ui.main.SearchMembersParams;
import org.olat.group.ui.main.SearchMembersParams.Origin; import org.olat.group.ui.main.SearchMembersParams.Origin;
...@@ -53,8 +54,8 @@ public class MemberListWithOriginFilterController extends AbstractMemberListCont ...@@ -53,8 +54,8 @@ public class MemberListWithOriginFilterController extends AbstractMemberListCont
private final UserCourseEnvironment coachCourseEnv; private final UserCourseEnvironment coachCourseEnv;
public MemberListWithOriginFilterController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, public MemberListWithOriginFilterController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel,
RepositoryEntry repoEntry, UserCourseEnvironment coachCourseEnv, SearchMembersParams searchParams, String infos) { RepositoryEntry repoEntry, UserCourseEnvironment coachCourseEnv, MemberListSecurityCallback secCallback, SearchMembersParams searchParams, String infos) {
super(ureq, wControl, repoEntry, "member_list_origin_filter", coachCourseEnv.isCourseReadOnly(), toolbarPanel); super(ureq, wControl, repoEntry, "member_list_origin_filter", secCallback, toolbarPanel);
this.searchParams = searchParams; this.searchParams = searchParams;
this.coachCourseEnv = coachCourseEnv; this.coachCourseEnv = coachCourseEnv;
......
...@@ -29,6 +29,7 @@ import org.olat.core.id.Identity; ...@@ -29,6 +29,7 @@ import org.olat.core.id.Identity;
import org.olat.course.assessment.ui.tool.AssessmentIdentityCourseController; import org.olat.course.assessment.ui.tool.AssessmentIdentityCourseController;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.group.ui.main.AbstractMemberListController; import org.olat.group.ui.main.AbstractMemberListController;
import org.olat.group.ui.main.MemberListSecurityCallback;
import org.olat.group.ui.main.MemberRow; import org.olat.group.ui.main.MemberRow;
import org.olat.group.ui.main.SearchMembersParams; import org.olat.group.ui.main.SearchMembersParams;
import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntry;
...@@ -46,8 +47,8 @@ public class MemberSearchController extends AbstractMemberListController { ...@@ -46,8 +47,8 @@ public class MemberSearchController extends AbstractMemberListController {
private AssessmentIdentityCourseController identityAssessmentController; private AssessmentIdentityCourseController identityAssessmentController;
public MemberSearchController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, public MemberSearchController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel,
RepositoryEntry repoEntry, UserCourseEnvironment coachCourseEnv) { RepositoryEntry repoEntry, UserCourseEnvironment coachCourseEnv, MemberListSecurityCallback secCallback) {
super(ureq, wControl, repoEntry, "all_member_list", coachCourseEnv.isCourseReadOnly(), toolbarPanel); super(ureq, wControl, repoEntry, "all_member_list", secCallback, toolbarPanel);
this.coachCourseEnv = coachCourseEnv; this.coachCourseEnv = coachCourseEnv;
} }
......
...@@ -47,6 +47,8 @@ import org.olat.course.CourseFactory; ...@@ -47,6 +47,8 @@ import org.olat.course.CourseFactory;
import org.olat.course.ICourse; import org.olat.course.ICourse;
import org.olat.course.groupsandrights.GroupsAndRightsController; import org.olat.course.groupsandrights.GroupsAndRightsController;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.group.ui.main.MemberListSecurityCallback;
import org.olat.group.ui.main.MemberListSecurityCallbackFactory;
import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryEntryManagedFlag;
import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.ACService;
...@@ -84,7 +86,11 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -84,7 +86,11 @@ public class MembersManagementMainController extends MainLayoutBasicController i
private RepositoryEntry repoEntry; private RepositoryEntry repoEntry;
private final UserCourseEnvironment coachCourseEnv; private final UserCourseEnvironment coachCourseEnv;
private final boolean entryAdmin, groupManagementRight, memberManagementRight; private final boolean entryAdmin;
private final boolean principal;
private final boolean groupManagementRight;
private final boolean memberManagementRight;
private final MemberListSecurityCallback secCallback;
@Autowired @Autowired
private ACService acService; private ACService acService;
...@@ -92,15 +98,18 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -92,15 +98,18 @@ public class MembersManagementMainController extends MainLayoutBasicController i
private AccessControlModule acModule; private AccessControlModule acModule;
public MembersManagementMainController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, public MembersManagementMainController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel,
RepositoryEntry re, UserCourseEnvironment coachCourseEnv, boolean entryAdmin, RepositoryEntry re, UserCourseEnvironment coachCourseEnv, boolean entryAdmin, boolean principal,
boolean groupManagementRight, boolean memberManagementRight) { boolean groupManagementRight, boolean memberManagementRight) {
super(ureq, wControl); super(ureq, wControl);
this.repoEntry = re; this.repoEntry = re;
this.toolbarPanel = toolbarPanel; this.toolbarPanel = toolbarPanel;
this.entryAdmin = entryAdmin; this.entryAdmin = entryAdmin;
this.principal = principal;
this.groupManagementRight = groupManagementRight; this.groupManagementRight = groupManagementRight;
this.memberManagementRight = memberManagementRight; this.memberManagementRight = memberManagementRight;
this.coachCourseEnv = coachCourseEnv; this.coachCourseEnv = coachCourseEnv;
secCallback = MemberListSecurityCallbackFactory.getSecurityCallback(coachCourseEnv.isCourseReadOnly(),
entryAdmin || groupManagementRight || memberManagementRight);
//logging //logging
getUserActivityLogger().setStickyActionType(ActionType.admin); getUserActivityLogger().setStickyActionType(ActionType.admin);
...@@ -119,7 +128,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -119,7 +128,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i
listenTo(columnLayoutCtr); listenTo(columnLayoutCtr);
putInitialPanel(columnLayoutCtr.getInitialComponent()); putInitialPanel(columnLayoutCtr.getInitialComponent());
if(entryAdmin || memberManagementRight) { if(entryAdmin || principal || memberManagementRight) {
selectMenuItem(ureq, CMD_MEMBERS); selectMenuItem(ureq, CMD_MEMBERS);
} else if(groupManagementRight) { } else if(groupManagementRight) {
selectMenuItem(ureq, CMD_GROUPS); selectMenuItem(ureq, CMD_GROUPS);
...@@ -133,21 +142,21 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -133,21 +142,21 @@ public class MembersManagementMainController extends MainLayoutBasicController i
root.setAltText(translate("menu.members.alt")); root.setAltText(translate("menu.members.alt"));
gtm.setRootNode(root); gtm.setRootNode(root);
if(entryAdmin || memberManagementRight) { if(entryAdmin || principal || memberManagementRight) {
GenericTreeNode node = new GenericTreeNode(translate("menu.members"), CMD_MEMBERS); GenericTreeNode node = new GenericTreeNode(translate("menu.members"), CMD_MEMBERS);
node.setAltText(translate("menu.members.alt")); node.setAltText(translate("menu.members.alt"));
node.setCssClass("o_sel_membersmgt_members"); node.setCssClass("o_sel_membersmgt_members");
root.addChild(node); root.addChild(node);
} }
if(entryAdmin || memberManagementRight || groupManagementRight) { if(entryAdmin || principal || memberManagementRight || groupManagementRight) {
GenericTreeNode node = new GenericTreeNode(translate("menu.groups"), CMD_GROUPS); GenericTreeNode node = new GenericTreeNode(translate("menu.groups"), CMD_GROUPS);
node.setAltText(translate("menu.groups.alt")); node.setAltText(translate("menu.groups.alt"));
node.setCssClass("o_sel_membersmgt_groups"); node.setCssClass("o_sel_membersmgt_groups");
root.addChild(node); root.addChild(node);
} }
if(acModule.isEnabled() && (entryAdmin || memberManagementRight)) { if(acModule.isEnabled() && (entryAdmin || principal || memberManagementRight)) {
//check if the course is managed and/or has offers //check if the course is managed and/or has offers
if(!RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.bookings) if(!RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.bookings)
|| acService.isResourceAccessControled(repoEntry.getOlatResource(), null)) { || acService.isResourceAccessControled(repoEntry.getOlatResource(), null)) {
...@@ -158,7 +167,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -158,7 +167,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i
} }
} }
if(entryAdmin) { if(entryAdmin || principal) {
GenericTreeNode node = new GenericTreeNode(translate("menu.rights"), CMD_RIGHTS); GenericTreeNode node = new GenericTreeNode(translate("menu.rights"), CMD_RIGHTS);
node.setAltText(translate("menu.rights.alt")); node.setAltText(translate("menu.rights.alt"));
node.setCssClass("o_sel_membersmgt_rights"); node.setCssClass("o_sel_membersmgt_rights");
...@@ -214,9 +223,9 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -214,9 +223,9 @@ public class MembersManagementMainController extends MainLayoutBasicController i
Controller selectedCtrl = null; Controller selectedCtrl = null;
if(CMD_MEMBERS.equals(cmd)) { if(CMD_MEMBERS.equals(cmd)) {
if(entryAdmin || memberManagementRight) { if(entryAdmin || principal || memberManagementRight) {
if(membersOverviewCtrl == null) { if(membersOverviewCtrl == null) {
membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv); membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, secCallback);
listenTo(membersOverviewCtrl); listenTo(membersOverviewCtrl);
} else if(membersDirty) { } else if(membersDirty) {
membersOverviewCtrl.reloadMembers(); membersOverviewCtrl.reloadMembers();
...@@ -225,7 +234,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -225,7 +234,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i
selectedCtrl = membersOverviewCtrl; selectedCtrl = membersOverviewCtrl;
} }
} else if(CMD_GROUPS.equals(cmd)) { } else if(CMD_GROUPS.equals(cmd)) {
if(entryAdmin || memberManagementRight || groupManagementRight) { if(entryAdmin || principal || memberManagementRight || groupManagementRight) {
if(groupsCtrl == null) { if(groupsCtrl == null) {
groupsCtrl = new CourseBusinessGroupListController(ureq, bwControl, repoEntry, entryAdmin || groupManagementRight, coachCourseEnv.isCourseReadOnly()); groupsCtrl = new CourseBusinessGroupListController(ureq, bwControl, repoEntry, entryAdmin || groupManagementRight, coachCourseEnv.isCourseReadOnly());
listenTo(groupsCtrl); listenTo(groupsCtrl);
...@@ -235,7 +244,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -235,7 +244,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i
selectedCtrl = groupsCtrl; selectedCtrl = groupsCtrl;
} }
} else if(CMD_BOOKING.equals(cmd)) { } else if(CMD_BOOKING.equals(cmd)) {
if(acModule.isEnabled() && (entryAdmin || memberManagementRight)) { if(acModule.isEnabled() && (entryAdmin || principal || memberManagementRight)) {
if(ordersController == null) { if(ordersController == null) {
ordersController = new OrdersAdminController(ureq, bwControl, toolbarPanel, repoEntry.getOlatResource()); ordersController = new OrdersAdminController(ureq, bwControl, toolbarPanel, repoEntry.getOlatResource());
listenTo(ordersController); listenTo(ordersController);
...@@ -244,7 +253,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i ...@@ -244,7 +253,7 @@ public class MembersManagementMainController extends MainLayoutBasicController i
selectedCtrl = ordersController; selectedCtrl = ordersController;
} }
} else if(CMD_RIGHTS.equals(cmd)) { } else if(CMD_RIGHTS.equals(cmd)) {
if(entryAdmin) { if(entryAdmin || principal) {
if(rightsController == null) { if(rightsController == null) {
rightsController = new GroupsAndRightsController(ureq, bwControl, repoEntry, coachCourseEnv.isCourseReadOnly()); rightsController = new GroupsAndRightsController(ureq, bwControl, repoEntry, coachCourseEnv.isCourseReadOnly());
listenTo(rightsController); listenTo(rightsController);
......
...@@ -62,6 +62,7 @@ import org.olat.group.BusinessGroupService; ...@@ -62,6 +62,7 @@ import org.olat.group.BusinessGroupService;
import org.olat.group.model.BusinessGroupMembershipChange; import org.olat.group.model.BusinessGroupMembershipChange;
import org.olat.group.ui.main.AbstractMemberListController; import org.olat.group.ui.main.AbstractMemberListController;
import org.olat.group.ui.main.DedupMembersConfirmationController; import org.olat.group.ui.main.DedupMembersConfirmationController;
import org.olat.group.ui.main.MemberListSecurityCallback;
import org.olat.group.ui.main.MemberPermissionChangeEvent; import org.olat.group.ui.main.MemberPermissionChangeEvent;
import org.olat.group.ui.main.SearchMembersParams; import org.olat.group.ui.main.SearchMembersParams;
import org.olat.modules.curriculum.CurriculumService; import org.olat.modules.curriculum.CurriculumService;
...@@ -112,6 +113,7 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -112,6 +113,7 @@ public class MembersOverviewController extends BasicController implements Activa
private boolean overrideManaged = false; private boolean overrideManaged = false;
private final RepositoryEntry repoEntry; private final RepositoryEntry repoEntry;
private final UserCourseEnvironment coachCourseEnv; private final UserCourseEnvironment coachCourseEnv;
private final MemberListSecurityCallback secCallback;
@Autowired @Autowired
private RepositoryManager repositoryManager; private RepositoryManager repositoryManager;
...@@ -123,11 +125,12 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -123,11 +125,12 @@ public class MembersOverviewController extends BasicController implements Activa
private BusinessGroupService businessGroupService; private BusinessGroupService businessGroupService;
public MembersOverviewController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, public MembersOverviewController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel,
RepositoryEntry repoEntry, UserCourseEnvironment coachCourseEnv) { RepositoryEntry repoEntry, UserCourseEnvironment coachCourseEnv, MemberListSecurityCallback secCallback) {
super(ureq, wControl); super(ureq, wControl);
this.repoEntry = repoEntry; this.repoEntry = repoEntry;
this.toolbarPanel = toolbarPanel; this.toolbarPanel = toolbarPanel;
this.coachCourseEnv = coachCourseEnv; this.coachCourseEnv = coachCourseEnv;
this.secCallback = secCallback;
mainVC = createVelocityContainer("members_overview"); mainVC = createVelocityContainer("members_overview");
segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this); segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this);
...@@ -352,12 +355,9 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -352,12 +355,9 @@ public class MembersOverviewController extends BasicController implements Activa
removeAsListenerAndDispose(importMembersWizard); removeAsListenerAndDispose(importMembersWizard);
Step start = new ImportMember_1b_ChooseMemberStep(ureq, repoEntry, null, overrideManaged); Step start = new ImportMember_1b_ChooseMemberStep(ureq, repoEntry, null, overrideManaged);
StepRunnerCallback finish = new StepRunnerCallback() { StepRunnerCallback finish = (uureq, wControl, runContext) -> {
@Override addMembers(uureq, runContext);
public Step execute(UserRequest uureq, WindowControl wControl, StepsRunContext runContext) { return StepsMainRunController.DONE_MODIFIED;
addMembers(uureq, runContext);
return StepsMainRunController.DONE_MODIFIED;
}
}; };
importMembersWizard = new StepsMainRunController(ureq, getWindowControl(), start, finish, null, importMembersWizard = new StepsMainRunController(ureq, getWindowControl(), start, finish, null,
...@@ -370,15 +370,12 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -370,15 +370,12 @@ public class MembersOverviewController extends BasicController implements Activa
removeAsListenerAndDispose(importMembersWizard); removeAsListenerAndDispose(importMembersWizard);
Step start = new ImportMember_1a_LoginListStep(ureq, repoEntry, null, overrideManaged); Step start = new ImportMember_1a_LoginListStep(ureq, repoEntry, null, overrideManaged);
StepRunnerCallback finish = new StepRunnerCallback() { StepRunnerCallback finish = (uureq, wControl, runContext) -> {
@Override addMembers(uureq, runContext);
public Step execute(UserRequest uureq, WindowControl wControl, StepsRunContext runContext) { if(runContext.containsKey("notFounds")) {
addMembers(uureq, runContext); showWarning("user.notfound", runContext.get("notFounds").toString());
if(runContext.containsKey("notFounds")) {
showWarning("user.notfound", runContext.get("notFounds").toString());
}
return StepsMainRunController.DONE_MODIFIED;
} }
return StepsMainRunController.DONE_MODIFIED;
}; };
importMembersWizard = new StepsMainRunController(ureq, getWindowControl(), start, finish, null, importMembersWizard = new StepsMainRunController(ureq, getWindowControl(), start, finish, null,
...@@ -457,7 +454,7 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -457,7 +454,7 @@ public class MembersOverviewController extends BasicController implements Activa
ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
SearchMembersParams searchParams = new SearchMembersParams(true, GroupRoles.owner, GroupRoles.coach, GroupRoles.participant); SearchMembersParams searchParams = new SearchMembersParams(true, GroupRoles.owner, GroupRoles.coach, GroupRoles.participant);
allMemberListCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, searchParams, null); allMemberListCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, secCallback, searchParams, null);
listenTo(allMemberListCtrl); listenTo(allMemberListCtrl);
} }
...@@ -475,7 +472,7 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -475,7 +472,7 @@ public class MembersOverviewController extends BasicController implements Activa
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
SearchMembersParams searchParams = new SearchMembersParams(false, GroupRoles.owner); SearchMembersParams searchParams = new SearchMembersParams(false, GroupRoles.owner);
String infos = translate("owners.infos"); String infos = translate("owners.infos");
ownersCtrl = new MemberListController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, searchParams, infos); ownersCtrl = new MemberListController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, secCallback, searchParams, infos);
listenTo(ownersCtrl); listenTo(ownersCtrl);
} }
...@@ -493,7 +490,7 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -493,7 +490,7 @@ public class MembersOverviewController extends BasicController implements Activa
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
SearchMembersParams searchParams = new SearchMembersParams(false, GroupRoles.coach); SearchMembersParams searchParams = new SearchMembersParams(false, GroupRoles.coach);
String infos = translate("tutors.infos"); String infos = translate("tutors.infos");
tutorsCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, searchParams, infos); tutorsCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, secCallback, searchParams, infos);
listenTo(tutorsCtrl); listenTo(tutorsCtrl);
} }
...@@ -511,7 +508,7 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -511,7 +508,7 @@ public class MembersOverviewController extends BasicController implements Activa
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
SearchMembersParams searchParams = new SearchMembersParams(false, GroupRoles.participant); SearchMembersParams searchParams = new SearchMembersParams(false, GroupRoles.participant);
String infos = translate("participants.infos"); String infos = translate("participants.infos");
participantsCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, searchParams, infos); participantsCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, secCallback, searchParams, infos);
listenTo(participantsCtrl); listenTo(participantsCtrl);
} }
...@@ -529,7 +526,7 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -529,7 +526,7 @@ public class MembersOverviewController extends BasicController implements Activa
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
SearchMembersParams searchParams = new SearchMembersParams(false, GroupRoles.waiting); SearchMembersParams searchParams = new SearchMembersParams(false, GroupRoles.waiting);
String infos = translate("waiting.infos"); String infos = translate("waiting.infos");
waitingCtrl = new MemberListController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, searchParams, infos); waitingCtrl = new MemberListController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, secCallback, searchParams, infos);
listenTo(waitingCtrl); listenTo(waitingCtrl);
} }
...@@ -545,7 +542,7 @@ public class MembersOverviewController extends BasicController implements Activa ...@@ -545,7 +542,7 @@ public class MembersOverviewController extends BasicController implements Activa
OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_SEARCH_MEMBERS, 0l); OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_SEARCH_MEMBERS, 0l);
ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
searchCtrl = new MemberSearchController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv); searchCtrl = new MemberSearchController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv, secCallback);
listenTo(searchCtrl); listenTo(searchCtrl);
} }
......
...@@ -109,9 +109,8 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode { ...@@ -109,9 +109,8 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode {
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message); controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
} else { } else {
// check if user is moderator of the virtual classroom // check if user is moderator of the virtual classroom
CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager(); boolean admin = userCourseEnv.isAdmin();
boolean admin = cgm.isIdentityCourseAdministrator(ureq.getIdentity()); boolean moderator = admin || userCourseEnv.isCoach();
boolean moderator = admin || cgm.isIdentityCourseCoach(ureq.getIdentity());
// create run controller // create run controller
RepositoryEntry courseEntry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); RepositoryEntry courseEntry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
......
...@@ -102,9 +102,8 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode { ...@@ -102,9 +102,8 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode {
updateModuleConfigDefaults(false); updateModuleConfigDefaults(false);
// check if user is moderator of the virtual classroom // check if user is moderator of the virtual classroom
CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager(); boolean admin = userCourseEnv.isAdmin();
boolean admin = cgm.isIdentityCourseAdministrator(ureq.getIdentity()); boolean moderator = admin || userCourseEnv.isCoach();
boolean moderator = admin || cgm.isIdentityAnyCourseCoach(ureq.getIdentity());
// create run controller // create run controller
OLATResourceable ores = OresHelper.clone(userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseResource()); OLATResourceable ores = OresHelper.clone(userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseResource());
......
...@@ -176,9 +176,8 @@ public class STCourseNode extends AbstractAccessableCourseNode implements Calcul ...@@ -176,9 +176,8 @@ public class STCourseNode extends AbstractAccessableCourseNode implements Calcul
userCourseEnv.getCourseEnvironment().isPreview()); userCourseEnv.getCourseEnvironment().isPreview());
// check if user is allowed to edit the page in the run view // check if user is allowed to edit the page in the run view
CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager(); CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager();
boolean hasEditRights = (cgm.isIdentityCourseAdministrator(ureq.getIdentity()) boolean hasEditRights = userCourseEnv.isAdmin() || cgm.hasRight(ureq.getIdentity(),CourseRights.RIGHT_COURSEEDITOR)
|| cgm.hasRight(ureq.getIdentity(),CourseRights.RIGHT_COURSEEDITOR)) || (getModuleConfiguration().getBooleanSafe(SPEditController.CONFIG_KEY_ALLOW_COACH_EDIT, false) && userCourseEnv.isCoach());
|| (getModuleConfiguration().getBooleanSafe(SPEditController.CONFIG_KEY_ALLOW_COACH_EDIT, false) && cgm.isIdentityCourseCoach(ureq.getIdentity()));
if (hasEditRights) { if (hasEditRights) {
spCtr.allowPageEditing(); spCtr.allowPageEditing();
......
...@@ -39,7 +39,6 @@ import org.olat.course.condition.ConditionEditController; ...@@ -39,7 +39,6 @@ import org.olat.course.condition.ConditionEditController;
import org.olat.course.editor.CourseEditorEnv; import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.editor.NodeEditController; import org.olat.course.editor.NodeEditController;
import org.olat.course.editor.StatusDescription; import org.olat.course.editor.StatusDescription;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.nodes.vitero.ViteroEditController; import org.olat.course.nodes.vitero.ViteroEditController;
import org.olat.course.nodes.vitero.ViteroPeekViewController; import org.olat.course.nodes.vitero.ViteroPeekViewController;
import org.olat.course.run.navigation.NodeRunConstructionResult; import org.olat.course.run.navigation.NodeRunConstructionResult;
...@@ -103,8 +102,7 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode { ...@@ -103,8 +102,7 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode {
runCtr = MessageUIFactory.createInfoMessage(ureq, wControl, title, message); runCtr = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
} else { } else {
// check if user is moderator of the virtual classroom // check if user is moderator of the virtual classroom
CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager(); boolean moderator = userCourseEnv.isAdmin();
boolean moderator = cgm.isIdentityCourseAdministrator(ureq.getIdentity());
// create run controller // create run controller
Long resourceId = userCourseEnv.getCourseEnvironment().getCourseResourceableId(); Long resourceId = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
OLATResourceable ores = OresHelper.createOLATResourceableInstance(CourseModule.class, resourceId); OLATResourceable ores = OresHelper.createOLATResourceableInstance(CourseModule.class, resourceId);
......
...@@ -53,7 +53,6 @@ import org.olat.core.util.Encoder; ...@@ -53,7 +53,6 @@ import org.olat.core.util.Encoder;
import org.olat.core.util.SortedProperties; import org.olat.core.util.SortedProperties;
import org.olat.core.util.StringHelper; import org.olat.core.util.StringHelper;
import org.olat.core.util.Util; import org.olat.core.util.Util;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.highscore.ui.HighScoreRunController; import org.olat.course.highscore.ui.HighScoreRunController;
import org.olat.course.nodes.BasicLTICourseNode; import org.olat.course.nodes.BasicLTICourseNode;
import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNode;
...@@ -477,8 +476,7 @@ public class LTIRunController extends BasicController { ...@@ -477,8 +476,7 @@ public class LTIRunController extends BasicController {
if (roles.isGuestOnly()) { if (roles.isGuestOnly()) {
return "Guest"; return "Guest";
} }
CourseGroupManager groupManager = courseEnv.getCourseGroupManager(); boolean admin = userCourseEnv.isAdmin();
boolean admin = groupManager.isIdentityCourseAdministrator(getIdentity());
if(admin) { if(admin) {
String authorRole = config.getStringValue(BasicLTICourseNode.CONFIG_KEY_AUTHORROLE); String authorRole = config.getStringValue(BasicLTICourseNode.CONFIG_KEY_AUTHORROLE);
if(StringHelper.containsNonWhitespace(authorRole)) { if(StringHelper.containsNonWhitespace(authorRole)) {
...@@ -486,7 +484,7 @@ public class LTIRunController extends BasicController { ...@@ -486,7 +484,7 @@ public class LTIRunController extends BasicController {
} }
return "Instructor,Administrator"; return "Instructor,Administrator";
} }
boolean coach = groupManager.isIdentityCourseCoach(getIdentity()); boolean coach = userCourseEnv.isCoach();
if(coach) { if(coach) {
String coachRole = config.getStringValue(BasicLTICourseNode.CONFIG_KEY_COACHROLE); String coachRole = config.getStringValue(BasicLTICourseNode.CONFIG_KEY_COACHROLE);
if(StringHelper.containsNonWhitespace(coachRole)) { if(StringHelper.containsNonWhitespace(coachRole)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment