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

OO-1604: add a warning if the file of task is missing

parent f93c9ac6
No related branches found
No related tags found
No related merge requests found
......@@ -27,7 +27,7 @@
<i class="o_icon o_icon-fw o_icon_warn"></i>
$r.translate("toggle.coursestatus.warnings", $warningsCount)
</h4>
<ul class="list-unstyled">
<ul class="o_warning list-unstyled">
#foreach($elem in $warningIsForNode)
<li>
#set ($counter = $velocityCount - 1)
......
......@@ -72,6 +72,8 @@ import org.olat.course.nodes.gta.GTAType;
import org.olat.course.nodes.gta.Task;
import org.olat.course.nodes.gta.TaskHelper;
import org.olat.course.nodes.gta.TaskList;
import org.olat.course.nodes.gta.model.TaskDefinition;
import org.olat.course.nodes.gta.model.TaskDefinitionList;
import org.olat.course.nodes.gta.ui.BulkDownloadToolController;
import org.olat.course.nodes.gta.ui.GTAAssessmentDetailsController;
import org.olat.course.nodes.gta.ui.GTAEditController;
......@@ -273,6 +275,26 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Asses
File taskDirectory = gtaManager.getTasksDirectory(course.getCourseEnvironment(), this);
if(!TaskHelper.hasDocuments(taskDirectory)) {
addStatusErrorDescription("error.missing.tasks", GTAEditController.PANE_TAB_ASSIGNMENT, sdList);
} else {
TaskDefinitionList taskList = (TaskDefinitionList)config.get(GTACourseNode.GTASK_TASKS);
if(taskList == null || taskList.getTasks() == null || taskList.getTasks().isEmpty()) {
addStatusErrorDescription("error.missing.tasks", GTAEditController.PANE_TAB_ASSIGNMENT, sdList);
} else {
String[] filenames = taskDirectory.list();
for(TaskDefinition taskDef: taskList.getTasks()) {
boolean found = false;
for(String filename:filenames) {
if(filename.equals(taskDef.getFilename())) {
found = true;
break;
}
}
if(!found) {
addStatusWarningDescription("error.missing.file", GTAEditController.PANE_TAB_ASSIGNMENT, sdList);
}
}
}
}
}
......@@ -313,6 +335,14 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Asses
status.add(sd);
}
private void addStatusWarningDescription(String key, String pane, List<StatusDescription> status) {
String[] params = new String[] { getShortTitle() };
StatusDescription sd = new StatusDescription(StatusDescription.WARNING, key, key, params, PACKAGE_GTA);
sd.setDescriptionForUnit(getIdent());
sd.setActivateableViewIdentifier(pane);
status.add(sd);
}
/**
*
* The files are exported in export/{node ident}/tasks and export/{node ident}/solutions
......
......@@ -35,7 +35,9 @@ 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.BooleanCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer;
......@@ -47,6 +49,10 @@ import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput;
import org.olat.core.gui.render.URLBuilder;
import org.olat.core.gui.translator.Translator;
import org.olat.core.util.StringHelper;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSItem;
......@@ -79,6 +85,7 @@ public class GTAAssignmentEditController extends FormBasicController {
private FlexiTableElement taskDefTableEl;
private TaskDefinitionTableModel taskModel;
private SingleSelection typeEl, previewEl, samplingEl;
private WarningFlexiCellRenderer fileExistsRenderer;
private CloseableModalController cmc;
private NewTaskController newTaskCtrl;
......@@ -134,7 +141,8 @@ public class GTAAssignmentEditController extends FormBasicController {
FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TDCols.title.i18nKey(), TDCols.title.ordinal()));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TDCols.file.i18nKey(), TDCols.file.ordinal()));
fileExistsRenderer = new WarningFlexiCellRenderer();
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TDCols.file.i18nKey(), TDCols.file.ordinal(), fileExistsRenderer));
columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("table.header.edit", TDCols.edit.ordinal(), "edit",
new BooleanCellRenderer(
new StaticFlexiCellRenderer(translate("edit"), "edit"),
......@@ -203,6 +211,7 @@ public class GTAAssignmentEditController extends FormBasicController {
}
private void updateModel() {
fileExistsRenderer.setFilenames(tasksFolder.list());
taskModel.setObjects(taskList.getTasks());
taskDefTableEl.reset();
}
......@@ -442,4 +451,37 @@ public class GTAAssignmentEditController extends FormBasicController {
updateModel();
fireEvent(ureq, Event.DONE_EVENT);
}
private class WarningFlexiCellRenderer implements FlexiCellRenderer {
private String[] tasks;
public void setFilenames(String[] tasks) {
this.tasks = tasks;
}
@Override
public void render(Renderer renderer, StringOutput target, Object cellValue, int row,
FlexiTableComponent source, URLBuilder ubu, Translator translator) {
if(cellValue instanceof String) {
String filename = (String)cellValue;
boolean found = false;
if(tasks != null && tasks.length > 0) {
for(String task:tasks) {
if(task.equals(filename)) {
found = true;
break;
}
}
}
if(!found) {
target.append("<i class='o_icon o_icon_warn'> </i> ");
}
StringHelper.escapeHtml(target, filename);
}
}
}
}
\ No newline at end of file
......@@ -61,6 +61,7 @@ error.editor.atLeastOne=Sie m\u00FCssen mindestens einen Editortyp w\u00E4hlen.
error.file.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists
error.file.invalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid
error.max.documents=Sie d\u00FCrfen nicht mehr als <b>{0}</b> Dokument(e) abgeben. Aber sie k\u00F6nnen noch ein Dokument austauschen oder editieren.
error.missing.file=Es fehlt die Datei einer Aufgabe
error.missing.group=Sie haben noch keine Gruppe gew\u00E4hlt
error.missing.score.config=Fehlende Bewertungskonfiguration
error.missing.solutions=Sie haben noch keine L\u00F6sungen hochgeladen
......
......@@ -63,6 +63,7 @@ error.editor.atLeastOne=You must choose at least one kind of editor.
error.file.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists
error.file.invalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid
error.max.documents=You are not allowed to submit more than <b>{0}</b> Documents. You may edit or change a document.
error.missing.file=The file of a task is missing
error.missing.group=You have not selected a group yet
error.missing.score.config=Missing score configuration
error.missing.solutions=You have not submitted any solutions yet
......
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