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

OO-4080: Button to reset all data

parent 0c21828c
No related branches found
No related tags found
No related merge requests found
Showing
with 259 additions and 17 deletions
......@@ -631,6 +631,7 @@ public class IdentityListCourseNodeController extends FormBasicController
} else if(event == Event.CHANGED_EVENT) {
loadModel(ureq);
} else if(event == Event.CANCELLED_EVENT) {
loadModel(ureq);
stackPanel.popController(currentIdentityCtrl);
}
} else if(bulkToolsList != null && bulkToolsList.contains(source)) {
......
......@@ -444,7 +444,7 @@ public class MSCourseNode extends AbstractAccessableCourseNode implements Persis
Identity coachingIdentity, boolean incrementAttempts, Role by) {
AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager();
Identity mySelf = userCourseEnvironment.getIdentityEnvironment().getIdentity();
am.saveScoreEvaluation(this, coachingIdentity, mySelf, new ScoreEvaluation(scoreEvaluation), userCourseEnvironment, incrementAttempts, by);
am.saveScoreEvaluation(this, coachingIdentity, mySelf, new ScoreEvaluation(scoreEvaluation), userCourseEnvironment, incrementAttempts, by);
}
@Override
......
......@@ -25,20 +25,29 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.impl.FormEvent;
import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.BooleanNullCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.CSSIconFlexiCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.stack.TooledStackedPanel;
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.generic.closablewrapper.CloseableModalController;
import org.olat.course.assessment.bulk.BulkAssessmentToolController;
import org.olat.course.assessment.ui.tool.IdentityListCourseNodeController;
import org.olat.course.assessment.ui.tool.IdentityListCourseNodeTableModel.IdentityCourseElementCols;
import org.olat.course.nodes.MSCourseNode;
import org.olat.course.run.environment.CourseEnvironment;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.group.BusinessGroup;
import org.olat.modules.ModuleConfiguration;
import org.olat.modules.assessment.AssessmentToolOptions;
import org.olat.modules.assessment.ui.AssessedIdentityElementRow;
import org.olat.modules.assessment.ui.AssessmentToolContainer;
import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback;
......@@ -55,8 +64,13 @@ import org.springframework.beans.factory.annotation.Autowired;
*/
public class MSIdentityListCourseNodeController extends IdentityListCourseNodeController {
private Boolean hasEvaluationForm;
private FormLink resetButton;
private CloseableModalController cmc;
private MSResetDataController resetDataCtrl;
private Boolean hasEvaluationForm;
@Autowired
private MSService msService;
......@@ -76,6 +90,11 @@ public class MSIdentityListCourseNodeController extends IdentityListCourseNodeCo
coachCourseEnv.getCourseEnvironment(), (MSCourseNode)courseNode);
listenTo(bulkAssessmentToolCtrl);
formLayout.put("bulk.assessment", bulkAssessmentToolCtrl.getInitialComponent());
if (assessmentCallback.isAdmin()) {
resetButton = uifactory.addFormLink("tool.reset.data", formLayout, Link.BUTTON);
resetButton.setIconLeftCSS("o_icon o_icon_delete_item");
}
}
super.initMultiSelectionTools(ureq, formLayout);
}
......@@ -124,4 +143,47 @@ public class MSIdentityListCourseNodeController extends IdentityListCourseNodeCo
}
return hasEvaluationForm.booleanValue();
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(resetButton == source) {
doConfirmResetData(ureq);
} else {
super.formInnerEvent(ureq, source, event);
}
}
@Override
public void event(UserRequest ureq, Controller source, Event event) {
if(source == resetDataCtrl) {
if(event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
loadModel(ureq);
}
cmc.deactivate();
cleanUp();
} else {
super.event(ureq, source, event);
}
}
@Override
protected void cleanUp() {
removeAsListenerAndDispose(resetDataCtrl);
removeAsListenerAndDispose(cmc);
resetDataCtrl = null;
cmc = null;
super.cleanUp();
}
private void doConfirmResetData(UserRequest ureq) {
AssessmentToolOptions asOptions = getOptions();
CourseEnvironment courseEnv = getCourseEnvironment();
resetDataCtrl = new MSResetDataController(ureq, getWindowControl(), courseEnv, asOptions, (MSCourseNode)courseNode);
listenTo(resetDataCtrl);
String title = translate("tool.reset.data.title");
cmc = new CloseableModalController(getWindowControl(), null, resetDataCtrl.getInitialComponent(), true, title, true);
listenTo(cmc);
cmc.activate();
}
}
/**
* <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.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
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.id.Identity;
import org.olat.core.id.IdentityEnvironment;
import org.olat.core.id.Roles;
import org.olat.course.archiver.ScoreAccountingHelper;
import org.olat.course.auditing.UserNodeAuditManager;
import org.olat.course.nodes.MSCourseNode;
import org.olat.course.run.environment.CourseEnvironment;
import org.olat.course.run.scoring.ScoreEvaluation;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.run.userview.UserCourseEnvironmentImpl;
import org.olat.group.BusinessGroupService;
import org.olat.modules.assessment.AssessmentToolOptions;
import org.olat.modules.assessment.Role;
import org.olat.modules.assessment.model.AssessmentEntryStatus;
import org.olat.modules.assessment.model.AssessmentRunStatus;
import org.olat.repository.RepositoryEntry;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 21.06.2019<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class MSResetDataController extends FormBasicController {
private static final String[] confirmationKeys = new String[] { "confirm.delete" };
private MultipleSelectionElement confirmationEl;
private final CourseEnvironment courseEnv;
private final MSCourseNode courseNode;
private final List<Identity> identities;
@Autowired
private MSService msService;
@Autowired
private BusinessGroupService businessGroupService;
public MSResetDataController(UserRequest ureq, WindowControl wControl,
CourseEnvironment courseEnv, AssessmentToolOptions asOptions, MSCourseNode courseNode) {
super(ureq, wControl, "delete_data_confirmation");
this.courseEnv = courseEnv;
this.courseNode = courseNode;
if(asOptions.getGroup() == null && asOptions.getIdentities() == null) {
identities = ScoreAccountingHelper.loadUsers(courseEnv);
} else if (asOptions.getIdentities() != null) {
identities = asOptions.getIdentities();
} else {
identities = businessGroupService.getMembers(asOptions.getGroup());
}
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
FormLayoutContainer confirmCont = FormLayoutContainer.createDefaultFormLayout("confirm", getTranslator());
formLayout.add("confirm", confirmCont);
confirmCont.setRootForm(mainForm);
flc.contextPut("numIdentities", String.valueOf(identities.size()));
String[] conformationValues = new String[] { translate("tool.reset.data.confirm.message") };
confirmationEl = uifactory.addCheckboxesHorizontal("confirm.delete", "", confirmCont, confirmationKeys, conformationValues);
FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
confirmCont.add("buttons", buttonLayout);
uifactory.addFormSubmitButton("tool.reset.data.confirm.button", buttonLayout);
uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl());
}
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean allOk = true;
confirmationEl.clearError();
if(!confirmationEl.isAtLeastSelected(1)) {
confirmationEl.setErrorKey("tool.reset.data.confirm.error", null);
allOk &= false;
}
return allOk & super.validateFormLogic(ureq);
}
@Override
protected void formOK(UserRequest ureq) {
UserNodeAuditManager auditManager = courseEnv.getAuditManager();
RepositoryEntry courseEntry = courseEnv.getCourseGroupManager().getCourseEntry();
ScoreEvaluation scoreEval = new ScoreEvaluation(null, null, AssessmentEntryStatus.notStarted, null, Boolean.FALSE, 0.0d, AssessmentRunStatus.notStarted, null);
for(Identity identity:identities) {
IdentityEnvironment ienv = new IdentityEnvironment(identity, Roles.userRoles());
UserCourseEnvironment uce = new UserCourseEnvironmentImpl(ienv, courseEnv);
courseNode.updateUserScoreEvaluation(scoreEval, uce, getIdentity(), false, Role.coach);
AuditEnv auditEnv = AuditEnv.of(auditManager, courseNode, identity, getIdentity(), Role.coach);
msService.deleteSession(courseEntry, courseNode.getIdent(), identity, auditEnv);
}
fireEvent(ureq, Event.CHANGED_EVENT);
}
@Override
protected void formCancelled(UserRequest ureq) {
fireEvent(ureq, Event.CANCELLED_EVENT);
}
@Override
protected void doDispose() {
//
}
}
......@@ -49,6 +49,8 @@ public interface MSService {
List<EvaluationFormSession> getSessions(OLATResourceable ores, String nodeIdent);
void deleteSession(RepositoryEntry ores, String nodeIdent, Identity assessedIdentity, AuditEnv auditEnv);
void deleteSessions(RepositoryEntry ores, String nodeIdent);
List<RubricStatistic> getRubricStatistics(EvaluationFormSession session);
......
<div class="o_error">
$r.translate("tool.reset.data.message", $numIdentities)
</div>
$r.render("confirm")
\ No newline at end of file
#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>
#if($r.available("tool.reset.data") || $r.available("bulk.assessment"))
<div class="o_button_group o_button_group_right">
#if($r.available("tool.reset.data"))
$r.render("tool.reset.data")
#end
#if($r.available("bulk.assessment"))
$r.render("bulk.assessment")
#end
</div>
#end
$r.render("table")
<div class="o_button_group">
......
......@@ -66,4 +66,10 @@ scoring.config.enable.button=\u00C4ndern
scoring.overwriting=Es wurden bereits Bewertungen vorgenommen. Wollen Sie die Bewertungskonfiguartion trotzdem \u00E4ndern ?
scoring.overwriting.note=Hinweis \: Sie \u00E4ndern die Bewertungskonfiguration obwohl bereits Bewertungen vorgenommen wurden.
table.header.details.ms=Rubrik
tool.reset.data=Alle Daten zur\u00FCcksetzen
tool.reset.data.confirm.button=Daten zur\u00FCcksetzen
tool.reset.data.confirm.error=Bitte best\u00E4tigen Sie das zur\u00FCcksetzen der Daten.
tool.reset.data.confirm.message=Ich verstehe, dass die Daten endg\u00FCltig gel\u00F6scht werden.
tool.reset.data.message=Wollen Sie wirklich alle Bewertungen l\u00F6schen? Es wurden bereits {0} Benutzer bewertet. Die Daten k\u00F6nnen nicht wieder hergestellt werden!
tool.reset.data.title=Daten von Bewertungen zur\u00FCcksetzen
warn.nodedelete=Achtung\: Alle bisher angefallenen Daten dieses Kursbausteines werden gel\u00F6scht.
......@@ -66,4 +66,10 @@ scoring.config.enable.button=Modify
scoring.overwriting=There are already some assessments existing. Do you still want to modify your assessment configuration?
scoring.overwriting.note=Please note\: you are modifying the assessment configuration although there are already some assessments existing.
table.header.details.ms=Rubric
tool.reset.data=Reset all data
tool.reset.data.confirm.button=Reset data
tool.reset.data.confirm.error=Please confirm the reset.
tool.reset.data.confirm.message=I understand that the data will be definitely deleted.
tool.reset.data.message=Do you really want to delete all assessments? Already {0} users are assessed. It is not possible to restore the data.
tool.reset.data.title=Reset data of assessments
warn.nodedelete=Warning\: All data of this course element will be deleted.
......@@ -64,11 +64,16 @@ public class MSServiceImpl implements MSService {
@Override
public EvaluationFormSession getOrCreateSession(RepositoryEntry formEntry, RepositoryEntry ores, String nodeIdent,
Identity assessedIdentity, AuditEnv auditEnv) {
EvaluationFormSurveyIdentifier surveyIdent = of(ores, nodeIdent, assessedIdentity.getKey().toString());
EvaluationFormSurveyIdentifier surveyIdent = getSurveyIdentitfier(ores, nodeIdent, assessedIdentity);
EvaluationFormSurvey survey = loadOrCreateSurvey(formEntry, surveyIdent);
EvaluationFormParticipation participation = loadOrCreateParticipation(survey);
return loadOrCreateSesssion(participation, auditEnv);
}
private EvaluationFormSurveyIdentifier getSurveyIdentitfier(RepositoryEntry ores, String nodeIdent,
Identity assessedIdentity) {
return of(ores, nodeIdent, assessedIdentity.getKey().toString());
}
private EvaluationFormSurvey loadOrCreateSurvey(RepositoryEntry formEntry, EvaluationFormSurveyIdentifier surveyIdent) {
EvaluationFormSurvey survey = evaluationFormManager.loadSurvey(surveyIdent);
......@@ -92,7 +97,7 @@ public class MSServiceImpl implements MSService {
EvaluationFormSession session = evaluationFormManager.loadSessionByParticipation(participation);
if (session == null) {
session = evaluationFormManager.createSession(participation);
logAudit(auditEnv, "Completion of evaluation form started");
logAudit(auditEnv, "Evaluation started");
}
return session;
}
......@@ -105,14 +110,14 @@ public class MSServiceImpl implements MSService {
@Override
public EvaluationFormSession closeSession(EvaluationFormSession session, AuditEnv auditEnv) {
EvaluationFormSession finishSession = evaluationFormManager.finishSession(session);
logAudit(auditEnv, "Completion of evaluation form finished");
logAudit(auditEnv, "Evaluation finshed");
return finishSession;
}
@Override
public EvaluationFormSession reopenSession(EvaluationFormSession session, AuditEnv auditEnv) {
EvaluationFormSession reopenSession = evaluationFormManager.reopenSession(session);
logAudit(auditEnv, "Evaluation form reopened");
logAudit(auditEnv, "Evaluation reopened");
return reopenSession;
}
......@@ -127,6 +132,14 @@ public class MSServiceImpl implements MSService {
return evaluationFormManager.loadSessionsFiltered(filter, 0, -1);
}
@Override
public void deleteSession(RepositoryEntry ores, String nodeIdent, Identity assessedIdentity, AuditEnv auditEnv) {
EvaluationFormSurveyIdentifier surveyIdent = getSurveyIdentitfier(ores, nodeIdent, assessedIdentity);
EvaluationFormSurvey survey = evaluationFormManager.loadSurvey(surveyIdent);
evaluationFormManager.deleteSurvey(survey);
logAudit(auditEnv, "Evaluation deleted");
}
@Override
public void deleteSessions(RepositoryEntry ores, String nodeIdent) {
List<EvaluationFormSurvey> surveys = evaluationFormManager.loadSurveys(of(ores, nodeIdent));
......
......@@ -187,7 +187,7 @@ question.progress.score=$org.olat.modules.iq\:actualPoints
question.title=Frage {0}
questions=Anzahl Fragen im Test
reset.data=Daten zur\u00FCcksetzen
reset.test.data.acknowledge=Ich verstehe, dass die Daten werden endg\u00FCltig gel\u00F6scht.
reset.test.data.acknowledge=Ich verstehe, dass die Daten endg\u00FCltig gel\u00F6scht werden.
reset.test.data.text=Wollen Sie wirklich alle Daten von dem Test zur\u00FCcksetzen? Die Resultate von <strong>{0} Benutzern</strong> werden definitiv gel\u00F6scht.
reset.test.data.text.identity=Wollen Sie wirklich alle Daten von dem Test zur\u00FCcksetzen? Die Resultate von <strong>"{0}"</strong> werden definitiv gel\u00F6scht.
reset.test.data.text.ref=Sie k\u00F6nnen nicht alle Daten von dem Test weil noch an diesem Ressourcen "{0}" verbunden ist.
......
......@@ -180,8 +180,8 @@ $fa-css-prefix: "o_icon" !default;
.o_icon_move_left:before { content: $fa-var-angle-double-left;}
.o_icon_move_right:before { content: $fa-var-angle-double-right;}
.o_icon_move_up:before { content: $fa-var-angle-double-up;}
.o_icon_ms_done:before { content: $fa-var-check-circle;}
.o_icon_ms_pending:before { content: $fa-var-circle-o;}
.o_icon_ms_done:before { content: $fa-var-check;}
.o_icon_ms_pending:before { content: $fa-var-play;}
.o_icon_new:before { content: $fa-var-asterisk; color: $brand-success;}
.o_icon_new_document:before { content: $fa-var-file-text; }
.o_icon_new_folder:before { content: $fa-var-folder;}
......
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
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