Skip to content
Snippets Groups Projects
Commit e2925d12 authored by aboeckle's avatar aboeckle
Browse files

OO-4529 Option to allow coaches to reset password for their users

parent a893f8a4
No related branches found
No related tags found
No related merge requests found
......@@ -43,6 +43,8 @@ public class CoachingModule extends AbstractSpringModule implements ConfigOnOff
@Value("${coaching.enabled:true}")
private boolean enabled;
@Value("${password.change.by.coach.allowed:false}")
private boolean resetPasswordEnabled;
@Autowired
public CoachingModule(CoordinatorManager coordinatorManager) {
......@@ -60,6 +62,10 @@ public class CoachingModule extends AbstractSpringModule implements ConfigOnOff
setStringProperty("coaching.enabled", Boolean.toString(enabled), true);
}
}
public boolean isResetPasswordEnabled() {
return resetPasswordEnabled;
}
@Override
public void init() {
......@@ -83,7 +89,4 @@ public class CoachingModule extends AbstractSpringModule implements ConfigOnOff
enabled = "true".equals(enabledObj);
}
}
}
......@@ -26,6 +26,7 @@ import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
import org.olat.NewControllerFactory;
import org.olat.admin.user.UserChangePasswordController;
import org.olat.basesecurity.BaseSecurityModule;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
......@@ -72,6 +73,7 @@ import org.olat.modules.assessment.AssessmentService;
import org.olat.modules.assessment.ui.ScoreCellRenderer;
import org.olat.modules.assessment.ui.component.LearningProgressCompletionCellRenderer;
import org.olat.modules.co.ContactFormController;
import org.olat.modules.coach.CoachingModule;
import org.olat.modules.coach.CoachingService;
import org.olat.modules.coach.model.EfficiencyStatementEntry;
import org.olat.modules.coach.model.IdentityRepositoryEntryKey;
......@@ -100,6 +102,7 @@ import org.springframework.beans.factory.annotation.Autowired;
public class StudentCoursesController extends FormBasicController implements Activateable2, GenericEventListener, TooledController {
private final Link homeLink, contactLink;
private Link resetLink;
private Link nextStudent, detailsStudentCmp, previousStudent;
private FlexiTableElement tableEl;
......@@ -109,6 +112,7 @@ public class StudentCoursesController extends FormBasicController implements Act
private CloseableModalController cmc;
private ContactFormController contactCtrl;
private UserDetailsController statementCtrl;
private UserChangePasswordController userChangePasswordController;
private boolean hasChanged = false;
......@@ -135,6 +139,8 @@ public class StudentCoursesController extends FormBasicController implements Act
private CertificatesManager certificatesManager;
@Autowired
private AssessmentService assessmentService;
@Autowired
private CoachingModule coachingModule;
public StudentCoursesController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
StudentStatEntry statEntry, Identity student, int index, int numOfStudents, boolean fullAccess) {
......@@ -161,6 +167,12 @@ public class StudentCoursesController extends FormBasicController implements Act
homeLink.setIconLeftCSS("o_icon o_icon_home");
flc.getFormItemComponent().put("home", homeLink);
if (coachingModule.isResetPasswordEnabled()) {
resetLink = LinkFactory.createButton("reset.link", flc.getFormItemComponent(), this);
resetLink.setIconLeftCSS("o_icon o_icon_password");
flc.getFormItemComponent().put("reset", resetLink);
}
CoordinatorManager.getInstance().getCoordinator().getEventBus()
.registerFor(this, getIdentity(), CertificatesManager.ORES_CERTIFICATE_EVENT);
}
......@@ -336,6 +348,8 @@ public class StudentCoursesController extends FormBasicController implements Act
openHome(ureq);
} else if (source == contactLink) {
contact(ureq);
} else if (source == resetLink) {
resetPassword(ureq);
} else if(stackPanel == source) {
if(event instanceof PopEvent) {
PopEvent pe = (PopEvent)event;
......@@ -361,14 +375,22 @@ public class StudentCoursesController extends FormBasicController implements Act
} else if (source == cmc) {
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(contactCtrl);
removeAsListenerAndDispose(userChangePasswordController);
cmc = null;
contactCtrl = null;
userChangePasswordController = null;
} else if (source == contactCtrl) {
cmc.deactivate();
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(contactCtrl);
cmc = null;
contactCtrl = null;
} else if (source == userChangePasswordController) {
cmc.deactivate();
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(userChangePasswordController);
cmc = null;
userChangePasswordController = null;
}
super.event(ureq, source, event);
}
......@@ -406,6 +428,16 @@ public class StudentCoursesController extends FormBasicController implements Act
listenTo(cmc);
}
private void resetPassword(UserRequest ureq) {
removeAsListenerAndDispose(cmc);
userChangePasswordController = new UserChangePasswordController(ureq, getWindowControl(), student);;
listenTo(userChangePasswordController);
cmc = new CloseableModalController(getWindowControl(), translate("close"), userChangePasswordController.getInitialComponent());
cmc.activate();
listenTo(cmc);
}
private void nextEntry(UserRequest ureq) {
EfficiencyStatementEntry currentEntry = statementCtrl.getEntry();
int nextIndex = model.getObjects().indexOf(currentEntry) + 1;
......
<div class="o_header_with_buttons">
<h3><i class="o_icon o_icon_user"> </i> $studentName</h3>
<div class="o_button_group"><div class="btn-group">
#if($r.available("reset"))
$r.render("reset")
#end
#if($r.available("home"))
$r.render("home")
#end
......
......@@ -47,6 +47,7 @@ search.menu.title=Benutzersuche
search=Suchen
site.title.alt=Coaching
site.title=Coaching
reset.link=Passwort zur\u00FCcksetzen
results=Resultate
student.name=Name
students.details={0} {1}/{2}
......
......@@ -41,6 +41,7 @@ previous.course=$\:previous
previous.group=$\:previous
previous.student=$\:previous
progress.of={0} of {1}
reset.link=Reset password
results=Results
search=Search
search.form.login=User name
......
......@@ -1702,10 +1702,15 @@ live.stream.player.profile.values=both,stream1,stream2
vfs.largefiles.upperborder=157286400
vfs.largefiles.lowerborder=26214400
##############################################################################
###############################################################################
# Options for the imprint
###############################################################################
impressum.enabled=${topnav.impressum}
impressum.position=footer
impressum.contact.enabled=true
impressum.contact.mail=${supportemail}
\ No newline at end of file
impressum.contact.mail=${supportemail}
###############################################################################
# Allow coaches to set new passwords for their students
###############################################################################
password.change.by.coach.allowed.values=true,false
password.change.by.coach.allowed=false
\ No newline at end of file
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