Skip to content
Snippets Groups Projects
Commit 2cdbbbbc authored by uhensler's avatar uhensler
Browse files

OO-4080: Show all users with their assessment in course run time to coaches

parent 32757b19
No related branches found
No related tags found
No related merge requests found
Showing
with 271 additions and 16 deletions
......@@ -59,6 +59,7 @@ import org.olat.course.nodes.ms.MSCourseNodeRunController;
import org.olat.course.nodes.ms.MSEvaluationFormExecutionController;
import org.olat.course.nodes.ms.MSIdentityListCourseNodeController;
import org.olat.course.nodes.ms.MSResultDetailsController;
import org.olat.course.nodes.ms.MSRunController;
import org.olat.course.nodes.ms.MSService;
import org.olat.course.nodes.ms.MinMax;
import org.olat.course.properties.CoursePropertyManager;
......@@ -202,7 +203,7 @@ public class MSCourseNode extends AbstractAccessableCourseNode implements Persis
String message = trans.translate("guestnoaccess.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
} else {
controller = new MSCourseNodeRunController(ureq, wControl, userCourseEnv, this, true, true);
controller = new MSRunController(ureq, wControl, userCourseEnv, this);
}
Controller wrappedCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_ms_icon");
......@@ -544,7 +545,7 @@ public class MSCourseNode extends AbstractAccessableCourseNode implements Persis
RepositoryEntry courseEntry, BusinessGroup group, UserCourseEnvironment coachCourseEnv,
AssessmentToolContainer toolContainer, AssessmentToolSecurityCallback assessmentCallback) {
return new MSIdentityListCourseNodeController(ureq, wControl, stackPanel,
courseEntry, group, this, coachCourseEnv, toolContainer, assessmentCallback);
courseEntry, group, this, coachCourseEnv, toolContainer, assessmentCallback, true);
}
@Override
......
/**
* <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.ms;
import java.util.List;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.stack.TooledStackedPanel;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.course.groupsandrights.CourseRights;
import org.olat.course.nodes.MSCourseNode;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.group.BusinessGroup;
import org.olat.modules.assessment.ui.AssessmentToolContainer;
import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
import org.olat.repository.model.RepositoryEntrySecurity;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 17 Jun 2019<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class MSCoachRunController extends BasicController {
private MSIdentityListCourseNodeController identitityListCtrl;
@Autowired
private RepositoryManager repositoryManager;
public MSCoachRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, MSCourseNode msCourseNode) {
super(ureq, wControl);
TooledStackedPanel stackPanel = new TooledStackedPanel("msCoachStackPanel", getTranslator(), this);
stackPanel.setToolbarAutoEnabled(false);
stackPanel.setToolbarEnabled(false);
stackPanel.setShowCloseLink(true, false);
stackPanel.setCssClass("o_ms_stack_panel");
putInitialPanel(stackPanel);
// see CourseRuntimeController.doAssessmentTool(ureq);
boolean hasAssessmentRight = userCourseEnv.getCourseEnvironment().getCourseGroupManager()
.getRights(getIdentity()).contains(CourseRights.RIGHT_ASSESSMENT);
RepositoryEntry courseEntry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(ureq, courseEntry);
boolean admin = reSecurity.isEntryAdmin() || reSecurity.isPrincipal() || reSecurity.isMasterCoach()
|| hasAssessmentRight;
boolean nonMembers = reSecurity.isEntryAdmin();
List<BusinessGroup> coachedGroups = null;
if (reSecurity.isGroupCoach()) {
coachedGroups = userCourseEnv.getCoachedGroups();
}
AssessmentToolSecurityCallback secCallBack = new AssessmentToolSecurityCallback(admin, nonMembers,
reSecurity.isCourseCoach(), reSecurity.isGroupCoach(), reSecurity.isCurriculumCoach(), coachedGroups);
identitityListCtrl = new MSIdentityListCourseNodeController(ureq, wControl, stackPanel, courseEntry, null,
msCourseNode, userCourseEnv, new AssessmentToolContainer(), secCallBack, false);
listenTo(identitityListCtrl);
identitityListCtrl.activate(ureq, null, null);
stackPanel.pushController(translate("breadcrumb.users"), identitityListCtrl);
}
@Override
protected void doDispose() {
//
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
//
}
}
......@@ -20,8 +20,6 @@
package org.olat.course.nodes.ms;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.olat.core.gui.UserRequest;
......@@ -61,8 +59,11 @@ public class MSIdentityListCourseNodeController extends IdentityListCourseNodeCo
public MSIdentityListCourseNodeController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
RepositoryEntry courseEntry, BusinessGroup group, MSCourseNode courseNode, UserCourseEnvironment coachCourseEnv,
AssessmentToolContainer toolContainer, AssessmentToolSecurityCallback assessmentCallback) {
AssessmentToolContainer toolContainer, AssessmentToolSecurityCallback assessmentCallback, boolean showTitle) {
super(ureq, wControl, stackPanel, courseEntry, group, courseNode, coachCourseEnv, toolContainer, assessmentCallback);
flc.contextPut("showTitle", Boolean.valueOf(showTitle));
flc.setDirty(true);
}
@Override
......@@ -90,16 +91,15 @@ public class MSIdentityListCourseNodeController extends IdentityListCourseNodeCo
protected void loadModel(UserRequest ureq) {
super.loadModel(ureq);
if (hasEvaluationForm) {
if (hasEvaluationForm()) {
List<EvaluationFormSession> sessions = msService.getDoneSessions(getCourseRepositoryEntry(), courseNode.getIdent());
Map<String, EvaluationFormSession> identToSesssion = sessions.stream()
.collect(Collectors.toMap(
s -> s.getSurvey().getIdentifier().getSubident2(),
Function.identity()));
List<String> idents = sessions.stream()
.map(s -> s.getSurvey().getIdentifier().getSubident2())
.collect(Collectors.toList());
for (AssessedIdentityElementRow row : usersTableModel.getObjects()) {
String ident = row.getIdentityKey().toString();
Boolean sessionDone = identToSesssion.containsKey(ident);
Boolean sessionDone = idents.contains(ident);
row.setDetails(sessionDone);
}
}
......
/**
* <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.ms;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.segmentedview.SegmentViewComponent;
import org.olat.core.gui.components.segmentedview.SegmentViewEvent;
import org.olat.core.gui.components.segmentedview.SegmentViewFactory;
import org.olat.core.gui.components.velocity.VelocityContainer;
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.gui.control.controller.BasicController;
import org.olat.core.util.resource.OresHelper;
import org.olat.course.nodes.MSCourseNode;
import org.olat.course.run.userview.UserCourseEnvironment;
/**
*
* Initial date: 17 Jun 2019<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class MSRunController extends BasicController {
private static final String PLAY_RES_TYPE = "my";
private static final String EDIT_RES_TYPE = "all";
private VelocityContainer mainVC;
private SegmentViewComponent segmentView;
private Link myLink;
private Link allLink;
private Controller myCtrl;
private Controller coachCtrl;
private final MSCourseNode msCourseNode;
private final UserCourseEnvironment userCourseEnv;
public MSRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, MSCourseNode msCourseNode) {
super(ureq, wControl);
this.userCourseEnv = userCourseEnv;
this.msCourseNode = msCourseNode;
mainVC = createVelocityContainer("run_segments");
segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this);
if (userCourseEnv.isParticipant()) {
myLink = LinkFactory.createLink("segment.my", mainVC, this);
segmentView.addSegment(myLink, true);
}
if (userCourseEnv.isCoach() || userCourseEnv.isAdmin()) {
allLink = LinkFactory.createLink("segment.all", mainVC, this);
segmentView.addSegment(allLink, false);
}
boolean segmentViewVisible = segmentView.getSegments().size() > 1;
segmentView.setVisible(segmentViewVisible);
if (myLink != null ) {
doOpenMy(ureq);
} else if (allLink != null) {
doOpenCoach(ureq);
}
putInitialPanel(mainVC);
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if (source == segmentView) {
if(event instanceof SegmentViewEvent) {
SegmentViewEvent sve = (SegmentViewEvent)event;
String segmentCName = sve.getComponentName();
Component clickedLink = mainVC.getComponent(segmentCName);
if (clickedLink == myLink) {
doOpenMy(ureq);
} else if (clickedLink == allLink){
doOpenCoach(ureq);
}
}
}
}
private void doOpenMy(UserRequest ureq) {
if (myCtrl == null) {
WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType(PLAY_RES_TYPE), null);
myCtrl = new MSCourseNodeRunController(ureq, swControl, userCourseEnv, msCourseNode, true, true);
listenTo(myCtrl);
} else {
addToHistory(ureq, myCtrl);
}
segmentView.select(myLink);
mainVC.put("segmentCmp", myCtrl.getInitialComponent());
}
private void doOpenCoach(UserRequest ureq) {
if (coachCtrl == null) {
WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType(EDIT_RES_TYPE), null);
coachCtrl = new MSCoachRunController(ureq, swControl, userCourseEnv, msCourseNode);
listenTo(coachCtrl);
} else {
addToHistory(ureq, coachCtrl);
}
segmentView.select(allLink);
mainVC.put("segmentCmp", coachCtrl.getInitialComponent());
}
@Override
protected void doDispose() {
//
}
}
<h2><i class="o_icon o_st_icon"> </i> $r.escapeHtml($courseNodeTitle)#if($r.isNotEmpty($businessGroupName)) <small><i class="o_icon o_icon_group"> </i> $r.escapeHtml($businessGroupName)</small>#end</h2>
#if($showTitle)
<h2><i class="o_icon $courseNodeCssClass"> </i> $r.escapeHtml($courseNodeTitle)#if($r.isNotEmpty($businessGroupName)) <small><i class="o_icon o_icon_group"> </i> $r.escapeHtml($businessGroupName)</small>#end</h2>
#end
#if($r.available("bulk.assessment"))
<div class="o_button_group o_button_group_right">
$r.render("bulk.assessment")
......
<div class="clearfix">
#if($r.visible("segments"))
$r.render("segments")<br/>
#end
#if($r.available("segmentCmp"))
$r.render("segmentCmp")
#end
</div>
\ No newline at end of file
#Mon Mar 02 09:54:04 CET 2009
assessment.documents.title=Bewertungsdokumente
breadcrumb.users=Benutzer
comment.nocomment=Es liegt kein Kommentar vor
comment.title=Kommentar
condition.accessibility.title=Zugang
......@@ -54,6 +55,8 @@ passed.yourpassed=Status
result.details.open=Details anzeigen
result.details.score=Punktzahl in Rubrik {0}
result.details.title=Rubrik-Bewertungen
segment.all=Alle Teilnehmer
segment.my=Meine Bewertung
score.max=Punktemaximum
score.min=Punkteminimum
score.noscore=Information nicht verf\u00FCgbar
......
#Sun Jan 23 12:26:04 CET 2011
assessment.documents.title=Assessment documents
breadcrumb.users=Users
comment.nocomment=No comments available
comment.title=Comments
condition.accessibility.title=Access
......@@ -54,6 +55,8 @@ passed.yourpassed=Status
result.details.open=Open details
result.details.score=Score in rubric {0}
result.details.title=Rubric assessments
segment.all=All participants
segment.my=My assessment
score.max=Maximum score
score.min=Minimum score
score.noscore=Information not available
......
......@@ -321,3 +321,8 @@ div.o_correction_navigation {
}
}
}
.o_ms_stack_panel {
.o_toolbar {
margin-top: 0px;
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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