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

Merge OpenOLAT 10.3 to OpenOLAT default branch with b9f80303a999c0c6cc7372cb6d64667474b489c0

parents a55c994c 8de8a24c
No related branches found
No related tags found
No related merge requests found
Showing
with 241 additions and 62 deletions
......@@ -66,6 +66,7 @@ import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.editor.NodeEditController;
import org.olat.course.editor.PublishEvents;
import org.olat.course.editor.StatusDescription;
import org.olat.course.export.CourseEnvironmentMapper;
import org.olat.course.nodes.gta.GTAManager;
import org.olat.course.nodes.gta.GTAType;
import org.olat.course.nodes.gta.Task;
......@@ -351,6 +352,22 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Asses
FileUtils.copyDirContentsToDir(fSolImportDir, solutionsDirectory, false, "import task course node solutions");
}
@Override
public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, ICourse sourceCourse) {
super.postCopy(envMapper, processType, course, sourceCourse);
GTAManager gtaManager = CoreSpringFactory.getImpl(GTAManager.class);
//copy tasks
File sourceTaskDirectory = gtaManager.getTasksDirectory(sourceCourse.getCourseEnvironment(), this);
File copyTaskDirectory = gtaManager.getTasksDirectory(course.getCourseEnvironment(), this);
FileUtils.copyDirContentsToDir(sourceTaskDirectory, copyTaskDirectory, false, "copy task course node");
//copy solutions
File sourceSolutionsDirectory = gtaManager.getSolutionsDirectory(sourceCourse.getCourseEnvironment(), this);
File copySolutionsDirectory = gtaManager.getSolutionsDirectory(course.getCourseEnvironment(), this);
FileUtils.copyDirContentsToDir(sourceSolutionsDirectory, copySolutionsDirectory, false, "copy task course node solutions");
}
@Override
public CourseNode createInstanceForCopy(boolean isNewTitle, ICourse course) {
GTACourseNode cNode = (GTACourseNode)super.createInstanceForCopy(isNewTitle, course);
......
......@@ -139,7 +139,24 @@ public interface GTAManager {
*/
public List<IdentityRef> getDuplicatedMemberships(GTACourseNode gtaNode);
/**
* Are users already processing the tasks?
*
* @param entry
* @param gtaNode
* @return
*/
public boolean isTasksInProcess(RepositoryEntryRef entry, GTACourseNode gtaNode);
/**
* Are users already processing this task?
*
* @param entry
* @param gtaNode
* @param taskName
* @return
*/
public boolean isTaskInProcess(RepositoryEntryRef entry, GTACourseNode gtaNode, String taskName);
public TaskList createIfNotExists(RepositoryEntry entry, GTACourseNode cNode);
......
......@@ -417,6 +417,27 @@ public class GTAManagerImpl implements GTAManager {
return new Membership(coach, participant);
}
@Override
public boolean isTasksInProcess(RepositoryEntryRef entry, GTACourseNode cNode) {
List<Number> numOfTasks = dbInstance.getCurrentEntityManager()
.createNamedQuery("isTasksInProcess", Number.class)
.setParameter("entryKey", entry.getKey())
.setParameter("courseNodeIdent", cNode.getIdent())
.getResultList();
return numOfTasks != null && !numOfTasks.isEmpty() && numOfTasks.get(0) != null && numOfTasks.get(0).intValue() > 0;
}
@Override
public boolean isTaskInProcess(RepositoryEntryRef entry, GTACourseNode cNode, String taskName) {
List<Number> numOfTasks = dbInstance.getCurrentEntityManager()
.createNamedQuery("isTaskInProcess", Number.class)
.setParameter("entryKey", entry.getKey())
.setParameter("courseNodeIdent", cNode.getIdent())
.setParameter("taskName", taskName)
.getResultList();
return numOfTasks != null && !numOfTasks.isEmpty() && numOfTasks.get(0) != null && numOfTasks.get(0).intValue() > 0;
}
@Override
public TaskList createIfNotExists(RepositoryEntry entry, GTACourseNode cNode) {
TaskList tasks = getTaskList(entry, cNode);
......
......@@ -58,7 +58,9 @@ import org.olat.group.BusinessGroupImpl;
@Table(name="o_gta_task")
@NamedQueries({
@NamedQuery(name="countTaskByNameAndTaskList", query="select count(task) from gtatask task where task.taskList.key=:taskListKey and task.taskName=:taskName"),
@NamedQuery(name="tasksByTaskList", query="select task.taskName from gtatask task where task.taskList.key=:taskListKey")
@NamedQuery(name="tasksByTaskList", query="select task.taskName from gtatask task where task.taskList.key=:taskListKey"),
@NamedQuery(name="isTaskInProcess", query="select count(task) from gtatask task inner join task.taskList tasklist where task.taskName=:taskName and tasklist.entry.key=:entryKey and tasklist.courseNodeIdent=:courseNodeIdent"),
@NamedQuery(name="isTasksInProcess", query="select count(task) from gtatask task inner join task.taskList tasklist where tasklist.entry.key=:entryKey and tasklist.courseNodeIdent=:courseNodeIdent")
})
public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo {
......
......@@ -163,15 +163,27 @@ public class BeforeDateTaskRuleEditor extends RuleEditorFragment {
if(AssignTaskRuleSPI.class.getSimpleName().equals(ruleType)) {
boolean assignment = config.getBooleanSafe(GTACourseNode.GTASK_ASSIGNMENT);
Date dueDate = config.getDateValue(GTACourseNode.GTASK_ASSIGNMENT_DEADLINE);
if(assignment && dueDate != null) {
nodes.add(courseNode);
if(assignment) {
Date dueDate = config.getDateValue(GTACourseNode.GTASK_ASSIGNMENT_DEADLINE);
int numOfDays = config.getIntegerSafe(GTACourseNode.GTASK_ASSIGNMENT_DEADLINE_RELATIVE, -1);
String relativeTo = config.getStringValue(GTACourseNode.GTASK_ASSIGNMENT_DEADLINE_RELATIVE_TO);
if(dueDate != null) {
nodes.add(courseNode);
} else if(numOfDays >= 0 && StringHelper.containsNonWhitespace(relativeTo)) {
nodes.add(courseNode);
}
}
} else if(SubmissionTaskRuleSPI.class.getSimpleName().equals(ruleType)) {
boolean submit = config.getBooleanSafe(GTACourseNode.GTASK_SUBMIT);
Date dueDate = config.getDateValue(GTACourseNode.GTASK_SUBMIT_DEADLINE);
if(submit && dueDate != null) {
nodes.add(courseNode);
if(submit) {
Date dueDate = config.getDateValue(GTACourseNode.GTASK_SUBMIT_DEADLINE);
int numOfDays = config.getIntegerSafe(GTACourseNode.GTASK_SUBMIT_DEADLINE_RELATIVE, -1);
String relativeTo = config.getStringValue(GTACourseNode.GTASK_SUBMIT_DEADLINE_RELATIVE_TO);
if(dueDate != null) {
nodes.add(courseNode);
} else if(numOfDays >= 0 && StringHelper.containsNonWhitespace(relativeTo)) {
nodes.add(courseNode);
}
}
}
}
......
......@@ -49,52 +49,69 @@ import org.springframework.beans.factory.annotation.Autowired;
*/
public class GTAAssignedTaskController extends BasicController {
private final Link downloadButton, downloadLink;
private Link downloadButton, downloadLink;
private final File taskFile;
private File taskFile;
@Autowired
private GTAManager gtaManager;
/**
*
* @param ureq
* @param wControl
* @param task The task
* @param taskDef The task definition if any
* @param courseEnv The course environment
* @param gtaNode The course node
* @param i18nDescription The description of the step
* @param i18nWarning The warning message if the assignee wasn't able to choose a task
* @param message
*/
public GTAAssignedTaskController(UserRequest ureq, WindowControl wControl, Task task,
TaskDefinition taskDef, CourseEnvironment courseEnv, GTACourseNode gtaNode,
String i18nDescription, String message) {
String i18nDescription, String i18nWarning, String message) {
super(ureq, wControl);
File taskDir = gtaManager.getTasksDirectory(courseEnv, gtaNode);
taskFile = new File(taskDir, task.getTaskName());
VelocityContainer mainVC = createVelocityContainer("assigned_task");
mainVC.contextPut("description", translate(i18nDescription));
if(StringHelper.containsNonWhitespace(message)) {
mainVC.contextPut("message", message);
}
double fileSizeInMB = taskFile.length() / (1024.0d * 1024.0d);
String[] infos = new String[] { taskFile.getName(), TaskHelper.format(fileSizeInMB) };
String taskInfos = translate("download.task.infos", infos);
String cssIcon = CSSHelper.createFiletypeIconCssClassFor(taskFile.getName());
if(taskDef != null) {
mainVC.contextPut("taskDescription", taskDef.getDescription());
}
// two links to same file: explicit button and task name
downloadButton = LinkFactory.createCustomLink("download.task", "download.task", null, Link.BUTTON + Link.NONTRANSLATED, mainVC, this);
downloadButton.setCustomDisplayText(translate("download.task"));
downloadButton.setTitle(taskInfos);
downloadButton.setIconLeftCSS("o_icon o_icon_download");
downloadButton.setTarget("_blank");
downloadLink = LinkFactory.createCustomLink("download.link", "download.link", null, Link.NONTRANSLATED, mainVC, this);
if(taskDef != null) {
downloadLink.setCustomDisplayText(StringHelper.escapeHtml(taskDef.getTitle()));
downloadLink.setIconLeftCSS("o_icon " + cssIcon);
File taskDir = gtaManager.getTasksDirectory(courseEnv, gtaNode);
if(task == null || !StringHelper.containsNonWhitespace(task.getTaskName())) {
mainVC.contextPut("warningMsg", translate(i18nWarning));
} else {
downloadLink.setCustomDisplayText(StringHelper.escapeHtml(taskFile.getName()));
downloadLink.setIconLeftCSS("o_icon " + cssIcon + " o_icon_warning");
downloadLink.setEnabled(false);
taskFile = new File(taskDir, task.getTaskName());
double fileSizeInMB = taskFile.length() / (1024.0d * 1024.0d);
String[] infos = new String[] { taskFile.getName(), TaskHelper.format(fileSizeInMB) };
String taskInfos = translate("download.task.infos", infos);
String cssIcon = CSSHelper.createFiletypeIconCssClassFor(taskFile.getName());
if(taskDef != null) {
mainVC.contextPut("taskDescription", taskDef.getDescription());
}
// two links to same file: explicit button and task name
downloadButton = LinkFactory.createCustomLink("download.task", "download.task", null, Link.BUTTON + Link.NONTRANSLATED, mainVC, this);
downloadButton.setCustomDisplayText(translate("download.task"));
downloadButton.setTitle(taskInfos);
downloadButton.setIconLeftCSS("o_icon o_icon_download");
downloadButton.setTarget("_blank");
downloadLink = LinkFactory.createCustomLink("download.link", "download.link", null, Link.NONTRANSLATED, mainVC, this);
if(taskDef != null) {
downloadLink.setCustomDisplayText(StringHelper.escapeHtml(taskDef.getTitle()));
downloadLink.setIconLeftCSS("o_icon " + cssIcon);
} else {
downloadLink.setCustomDisplayText(StringHelper.escapeHtml(taskFile.getName()));
downloadLink.setIconLeftCSS("o_icon " + cssIcon + " o_icon_warning");
downloadLink.setEnabled(false);
}
downloadLink.setTitle(taskInfos);
downloadLink.setTarget("_blank");
}
downloadLink.setTitle(taskInfos);
downloadLink.setTarget("_blank");
putInitialPanel(mainVC);
}
......
......@@ -45,6 +45,8 @@ 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.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.util.StringHelper;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSItem;
......@@ -80,6 +82,7 @@ public class GTAAssignmentEditController extends FormBasicController {
private CloseableModalController cmc;
private NewTaskController newTaskCtrl;
private DialogBoxController confirmDeleteCtrl;
private EditTaskController addTaskCtrl, editTaskCtrl;
private HTMLEditorController newTaskEditorCtrl, editTaskEditorCtrl;
......@@ -136,6 +139,7 @@ public class GTAAssignmentEditController extends FormBasicController {
new BooleanCellRenderer(
new StaticFlexiCellRenderer(translate("edit"), "edit"),
new StaticFlexiCellRenderer(translate("replace"), "edit"))));
columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("table.header.edit", translate("delete"), "delete"));
taskModel = new TaskDefinitionTableModel(columnsModel);
taskDefTableEl = uifactory.addTableElement(getWindowControl(), "taskTable", taskModel, getTranslator(), tasksCont);
......@@ -248,6 +252,12 @@ public class GTAAssignmentEditController extends FormBasicController {
} else if(editTaskEditorCtrl == source) {
cmc.deactivate();
cleanUp();
} else if(confirmDeleteCtrl == source) {
if(DialogBoxUIFactory.isOkEvent(event) || DialogBoxUIFactory.isYesEvent(event)) {
TaskDefinition row = (TaskDefinition)confirmDeleteCtrl.getUserObject();
doDelete(ureq, row);
fireEvent(ureq, Event.DONE_EVENT);
}
} else if(cmc == source) {
cleanUp();
}
......@@ -294,6 +304,13 @@ public class GTAAssignmentEditController extends FormBasicController {
TaskDefinition row = taskModel.getObject(se.getIndex());
if("edit".equals(se.getCommand())) {
doEdit(ureq, row);
} else if("delete".equals(se.getCommand())) {
RepositoryEntry entry = courseEditorEnv.getCourseGroupManager().getCourseEntry();
if(gtaManager.isTaskInProcess(entry, gtaNode, row.getFilename())) {
doConfirmDelete(ureq, row);
} else {
doDelete(ureq, row);
}
}
}
} else if(typeEl == source) {
......@@ -406,4 +423,23 @@ public class GTAAssignmentEditController extends FormBasicController {
listenTo(cmc);
cmc.activate();
}
private void doConfirmDelete(UserRequest ureq, TaskDefinition row) {
String title = translate("warning.tasks.in.process.delete.title");
String text = translate("warning.tasks.in.process.delete.text");
confirmDeleteCtrl = activateOkCancelDialog(ureq, title, text, confirmDeleteCtrl);
confirmDeleteCtrl.setUserObject(row);
}
private void doDelete(UserRequest ureq, TaskDefinition taskDef) {
taskList.getTasks().remove(taskDef);
VFSItem item = tasksContainer.resolve(taskDef.getFilename());
if(item != null) {
item.delete();
}
updateModel();
fireEvent(ureq, Event.DONE_EVENT);
}
}
\ No newline at end of file
......@@ -153,7 +153,7 @@ public class GTACoachController extends GTAAbstractController {
TaskDefinition taskDef = getTaskDefinition(assignedTask);
assignedTaskCtrl = new GTAAssignedTaskController(ureq, getWindowControl(), assignedTask,
taskDef, courseEnv, gtaNode,
"coach.task.assigned.description", null);
"coach.task.assigned.description", "warning.no.task.choosed.coach", null);
listenTo(assignedTaskCtrl);
mainVC.put("assignedTask", assignedTaskCtrl.getInitialComponent());
}
......
......@@ -193,7 +193,7 @@ public class GTAParticipantController extends GTAAbstractController {
TaskDefinition taskDef = getTaskDefinition(assignedTask);
assignedTaskCtrl = new GTAAssignedTaskController(ureq, getWindowControl(), assignedTask,
taskDef, courseEnv, gtaNode,
"task.assigned.description", message);
"task.assigned.description", "warning.no.task.choosed", message);
listenTo(assignedTaskCtrl);
mainVC.put("myAssignedTask", assignedTaskCtrl.getInitialComponent());
}
......
......@@ -115,6 +115,7 @@ public class GTASampleSolutionsEditController extends FormBasicController {
new BooleanCellRenderer(
new StaticFlexiCellRenderer(translate("edit"), "edit"),
new StaticFlexiCellRenderer(translate("replace"), "edit"))));
columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("table.header.edit", translate("delete"), "delete"));
solutionModel = new SolutionTableModel(columnsModel);
solutionTable = uifactory.addTableElement(getWindowControl(), "table", solutionModel, getTranslator(), formLayout);
......@@ -213,6 +214,8 @@ public class GTASampleSolutionsEditController extends FormBasicController {
SolutionRow row = solutionModel.getObject(se.getIndex());
if("edit".equals(se.getCommand())) {
doEdit(ureq, row.getSolution());
} else if("delete".equals(se.getCommand())) {
doDelete(ureq, row);
}
}
}
......@@ -294,4 +297,16 @@ public class GTASampleSolutionsEditController extends FormBasicController {
listenTo(cmc);
cmc.activate();
}
private void doDelete(UserRequest ureq, SolutionRow solution) {
String documentName = solution.getSolution().getFilename();
VFSItem item = solutionContainer.resolve(documentName);
if(item != null) {
item.delete();
}
solutions.getSolutions().remove(solution.getSolution());
fireEvent(ureq, Event.DONE_EVENT);
updateModel();
}
}
......@@ -40,12 +40,15 @@ 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.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper;
import org.olat.course.condition.AreaSelectionController;
import org.olat.course.condition.GroupSelectionController;
import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.nodes.GTACourseNode;
import org.olat.course.nodes.gta.GTAManager;
import org.olat.course.nodes.gta.GTARelativeToDates;
import org.olat.course.nodes.gta.GTAType;
import org.olat.group.BusinessGroupService;
......@@ -71,6 +74,7 @@ public class GTAWorkflowEditController extends FormBasicController {
private final String[] relativeDatesValues;
private CloseableModalController cmc;
private DialogBoxController confirmChangesCtrl;
private AreaSelectionController areaSelectionCtrl;
private GroupSelectionController groupSelectionCtrl;
......@@ -89,6 +93,8 @@ public class GTAWorkflowEditController extends FormBasicController {
private List<Long> areaKeys;
private List<Long> groupKeys;
@Autowired
private GTAManager gtaManager;
@Autowired
private BGAreaManager areaManager;
@Autowired
......@@ -458,6 +464,22 @@ public class GTAWorkflowEditController extends FormBasicController {
@Override
protected void formOK(UserRequest ureq) {
RepositoryEntry entry = courseEditorEnv.getCourseGroupManager().getCourseEntry();
if(gtaManager.isTasksInProcess(entry, gtaNode)) {
doConfirmChanges(ureq);
} else {
commitChanges();
fireEvent(ureq, Event.DONE_EVENT);
}
}
private void doConfirmChanges(UserRequest ureq) {
String title = translate("warning.tasks.in.process.title");
String text = translate("warning.tasks.in.process.text");
confirmChangesCtrl = activateOkCancelDialog(ureq, title, text, confirmChangesCtrl);
}
private void commitChanges() {
if(typeEl.isSelected(0)) {
config.setStringValue(GTACourseNode.GTASK_TYPE, GTAType.group.name());
config.setList(GTACourseNode.GTASK_AREAS, areaKeys);
......@@ -519,7 +541,6 @@ public class GTAWorkflowEditController extends FormBasicController {
}
config.setBooleanEntry(GTACourseNode.GTASK_GRADING, gradingEl.isAtLeastSelected(1));
fireEvent(ureq, Event.DONE_EVENT);
}
private void setRelativeDates(TextElement daysEl, String daysKey, SingleSelection relativeToEl, String relativeToKey) {
......@@ -586,7 +607,6 @@ public class GTAWorkflowEditController extends FormBasicController {
revisionEl.select(keys[0], review);
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(groupSelectionCtrl == source) {
......@@ -619,6 +639,11 @@ public class GTAWorkflowEditController extends FormBasicController {
cmc.deactivate();
cleanUp();
}
} else if(confirmChangesCtrl == source) {
if(DialogBoxUIFactory.isOkEvent(event) || DialogBoxUIFactory.isYesEvent(event)) {
commitChanges();
fireEvent(ureq, Event.DONE_EVENT);
}
} else if(cmc == source) {
cleanUp();
}
......
#if($message && !$message.isEmpty())
<div class="o_info">$r.xssScan($message)</div>
#end
#if($warningMsg && !$warningMsg.isEmpty())
<div class="o_warning">$r.xssScan($warningMsg)</div>
#end
#if($r.available("download.task"))
<div>$description
<div class="pull-right">
$r.render("download.task")
</div>
</div>
<h5>
$r.render("download.link")
</h5>
<p>$r.xssScan($taskDescription)</p>
#end
#if($r.available("download.link"))
<h5>$r.render("download.link")</h5>
#end
#if($taskDescription && !$taskDescription.isEmpty())
<p>$r.xssScan($taskDescription)</p>
#end
......@@ -52,7 +52,7 @@ download.task=Aufgabe herunterladen
download.task.infos={0} ({1} MB)
edit.task=Aufgabe bearbeiten
editor.title=Abgabe Konfiguration
embedded.editor=Abgabe mit externem Editor (PDF)
embedded.editor=Abgabe mit internem Texteditor
enabled=eingeschaltet
error.assignment.closed=Zuweisung ist geschlossen.
error.duplicate.coaching=Der Teilnehmer ist Teilnehmer von mehreren Gruppen f\u00FCr diese Aufgabe.
......@@ -71,7 +71,7 @@ error.not.member.message=Reserviert f\u00FCr die Teilnehmer der Aufgabe
error.not.member.title=Reserviert f\u00FCr die Teilnehmer der Aufgabe
error.number.format=Geben Sie eine Zahl zwischen 1 und 12 ein oder lassen Sie das Feld leer.
error.select.atleastonestep=Sie haben keine Schritte gew\u00E4hlt
external.editor=Abgabe mit internem Texteditor
external.editor=Abgabe mit externem Editor (PDF)
file.name=Dateiname
file.name.example=Dokument.html
grading=Bewertung
......@@ -215,4 +215,12 @@ uploaded.by=hochgeladen von {0}
wait.for.solutions=Die Musterl\u00F6sung wird zum angegebenen Zeitpunkt freigegeben.
warning.group.pick.task=Dies ist eine Gruppenaufgabe\! Die hier getroffene Auswahl ist f\u00FCr alle Mitglieder der Gruppe "{0}" g\u00FCltig\! Stellen Sie sicher, dass diese Auswahl zuvor innerhalb Ihrer Gruppe diskutiert wurde\! Nur ein Gruppenmitglied kann die Gruppenaufgabe ausw\u00E4hlen.
warning.group.submit=Dies ist eine Gruppenaufgabe\! Das abgegebene Dokument ist f\u00FCr alle Mitglieder der Gruppe "{0}" g\u00FCltig\! Stellen Sie sicher dass diese L\u00F6sung zuvor innerhalb Ihrer Gruppe diskutiert wurde\! Nur ein Gruppenmitglied kann eine L\u00F6sung im Namen aller Gruppenmitglieder abgeben.
warning.group.task=Dies ist eine Gruppenaufgabe\! Aufgabenzuweisung, Abgabe sowie die Bewertung werden f\u00FCr die Gruppe vorgenommen. Besprechen Sie mit den anderen Teilnehmern ihrer Gruppe wie sie gemeinsam die Aufgabe ausw\u00E4hlen und bearbeiten wollen.
\ No newline at end of file
warning.group.task=Dies ist eine Gruppenaufgabe\! Aufgabenzuweisung, Abgabe sowie die Bewertung werden f\u00FCr die Gruppe vorgenommen. Besprechen Sie mit den anderen Teilnehmern ihrer Gruppe wie sie gemeinsam die Aufgabe ausw\u00E4hlen und bearbeiten wollen.
warning.no.task.choosed=Wie es scheint war es Ihnen aufgrund von nderungen am Kurselement nicht mglich eine Aufgabe fr dieses Aufgabenelement auszuwhlen.
warning.no.task.choosed.coach=Wie es scheint war es der Assignee aufgrund von nderungen am Kurselement nicht mglich eine Aufgabe fr dieses Aufgabenelement auszuwhlen.
warning.tasks.in.process.title=Aufgabenprozess bereits gestartet
warning.tasks.in.process.text=Es gibt bereits Benutzer die den Aufgabenprozess gestartet haben. nderungen an der Workflow-Konfiguration kann fr diese Benutzer zu Problemen fhren.
warning.tasks.in.process.delete.title=$\:warning.tasks.in.process.title
warning.tasks.in.process.delete.text=Wollen Sie wirklich dieser Aufgabe lschen? Es gibt bereits Benutzer die den Aufgabenprozess gestartet haben. Das kann fr diese Benutzer zu Problemen fhren.
......@@ -54,7 +54,7 @@ download.task=Download task
download.task.infos={0} ({1} MB)
edit.task=Edit task
editor.title=Submission configuration
embedded.editor=Submit files created with external editor (e.g. PDF)
embedded.editor=Submit with embedded text editor
enabled=enabled
error.assignment.closed=Assignment is closed
error.duplicate.coaching=This user is a member of multiple groups in this task.
......@@ -73,7 +73,7 @@ error.not.member.message=Reserved for task members
error.not.member.title=Reserved for task members
error.number.format=Enter a number between 1 and 12 or leave the field blank.
error.select.atleastonestep=You have not selected any steps
external.editor=Submit with embedded text editor
external.editor=Submit files created with external editor (e.g. PDF)
file.name=File name
file.name.example=Document.html
grading=Grading
......@@ -216,3 +216,11 @@ wait.for.solutions=The sample solution will be displayed at the date specified a
warning.group.pick.task=This is a group task\! The selection made here is valid for all members of the group "{0}"\! Make sure you discussed this selection within the group prior to selecting a task\! Only one member of the group can select the task for the group.
warning.group.submit=This is a group task\! The submitted document is valid for all members of the group "{0}"\! Make sure you discussed this solution document prior to uploading it here\! Only one member of the group can submit a solution on behalf of all group members.
warning.group.task=This is a group task\! The task assignment, submission of documents and grading are performed as a group. Contact your group peers on how to proceed on deciding for a task and to collaboratively solve the task.
warning.no.task.choosed=It seems that due to a change in the course element configuration, you weren't able to choose a task for this task element.
warning.no.task.choosed.coach=It seems that due to a change in the course element configuration, the assignee wasn't able to choose a task for this task element.
warning.tasks.in.process.title=Task already started
warning.tasks.in.process.text=There are already users who have started the task process. Changing the workflow configuration could result in problems for these users.
warning.tasks.in.process.delete.title=$\:warning.tasks.in.process.title
warning.tasks.in.process.delete.text=Do you really wan to delete this task? There are already users who have started the task process. It could result in problems for these users.
......@@ -45,7 +45,7 @@ download.task=T\u00E9l\u00E9charger les devoirs
download.task.infos={0} ({1} MB)
edit.task=Editer le devoir
editor.title=Configuration du d\u00E9p\u00F4t de documents
embedded.editor=D\u00E9p\u00F4t avec un \u00E9diteur externe (PDF)
embedded.editor=D\u00E9p\u00F4t avec l'\u00E9diteur de text interne
enabled=activ\u00E9
error.assignment.closed=Le d\u00E9lai d'affectation des devoirs est d\u00E9pass\u00E9.
error.duplicate.coaching=Le participant est participant dans plusieurs groupes pour ce devoir.
......@@ -64,7 +64,7 @@ error.not.member.message=R\u00E9serv\u00E9 aux participants aux devoirs
error.not.member.title=R\u00E9serv\u00E9 aux participants du devoir
error.number.format=Donnez un nombre entre 1 et 12 ou laissez le champ libre.
error.select.atleastonestep=Vous n'avez s\u00E9lectionn\u00E9 aucune \u00E9tape.
external.editor=D\u00E9p\u00F4t avec l'\u00E9diteur de text interne
external.editor=D\u00E9p\u00F4t avec un \u00E9diteur externe (PDF)
file.name=Nom du document
file.name.example=Document.html
grading=Evaluation
......
......@@ -278,7 +278,7 @@ public class CourseReminderListController extends FormBasicController implements
private void doDuplicate(ReminderRow row) {
Reminder reminder = reminderManager.loadByKey(row.getKey());
reminderManager.duplicate(reminder);
reminderManager.duplicate(reminder, getIdentity());
updateModel();
}
......
......@@ -3,10 +3,7 @@
<legend>
$r.contextHelpWithWrapper($package, $packageHtml,"help.hover.statistic")
$r.translate("statistic.title")</legend>
<div class="o_desc">$r.translate("statistic.intro", $statsSince)
#if(!$r.translate('statistic.intro.more').startsWith('no translation::::'))
$r.translate('statistic.intro.more')
#end</div>
<div class="o_desc">$r.translate("statistic.intro", $statsSince)</div>
</fieldset>
$r.render("statisticResult")
#if($hasChart)
......
......@@ -2,8 +2,7 @@ menu.createstatfile=Nach Studienlevel
menu.createstatfile.alt=Statistik gruppiert nach Studienlevel anzeigen
statistic.title=Statistik gruppiert nach Studienlevel
statistic.intro=Diese Statistik zeigt alle Zugriffe auf die Kursbausteine basierend auf allen verf\u00FCgbaren Kursdaten (seit {0}) gruppiert nach Studienlevel.
statistic.intro.more=Weitere Details zum Studienlevel finden Sie <a href="http://www.switch.ch/aai/support/documents/studybranch.html" target="_blank">hier</a>.
statistic.intro=Diese Statistik zeigt alle Zugriffe auf die Kursbausteine basierend auf allen verf\u00FCgbaren Kursdaten (seit {0}) gruppiert nach Studienlevel. Weitere Details zum Studienlevel finden Sie <a href="https://www.switch.ch/aai/support/documents/attributes/" target="_blank">hier</a>.
statistic.chart.intro=Diese Grafik zeigt alle Zugriffe {0} basierend auf allen verf\u00FCgbaren Kursdaten (seit {1}) gruppiert nach Studienlevel.
statistic.chart.pernode.intro=Diese Grafik zeigt alle Zugriffe auf die Kursbausteine von Personen mit Studienlevel <i>{0}</i>.
statistic.chart.pernode.total.intro=Diese Grafik zeigt alle Zugriffe auf die Kursbausteine basierend auf allen verfgbaren Kursdaten (seit {0}).
......
......@@ -9,6 +9,5 @@ stat.table.header.total=\u03A3\u03CD\u03BD\u03BF\u03BB\u03BF
statistic.chart.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03B4\u03B5\u03AF\u03C7\u03BD\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 {0} \u03C0\u03BF\u03C5 \u03B2\u03B1\u03C3\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B1 (\u03B1\u03C0\u03CC \u03C4\u03B9\u03C2 {1}) \u03C4\u03B1\u03BE\u03B9\u03BD\u03BF\u03BC\u03B7\u03BC\u03AD\u03BD\u03B1 \u03B1\u03BD\u03AC \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03BC\u03B5\u03BB\u03AD\u03C4\u03B7\u03C2.
statistic.chart.pernode.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03B4\u03B5\u03AF\u03C7\u03BD\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C3\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03B1\u03C0\u03CC \u03AC\u03C4\u03BF\u03BC\u03B1 \u03BC\u03B5 \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03BC\u03B5\u03BB\u03AD\u03C4\u03B7\u03C2 <i>{0}</i>.
statistic.chart.pernode.total.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03B4\u03B5\u03AF\u03C7\u03BD\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C3\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B2\u03B1\u03C3\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B1 (\u03B1\u03C0\u03CC \u03C4\u03B9\u03C2 {0}).
statistic.intro=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C3\u03C4\u03B1\u03C4\u03B9\u03C3\u03C4\u03B9\u03BA\u03AE \u03B4\u03B5\u03AF\u03C7\u03BD\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C3\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B2\u03B1\u03C3\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B1 (\u03B1\u03C0\u03CC \u03C4\u03B9\u03C2 {0}) \u03C4\u03B1\u03BE\u03B9\u03BD\u03BF\u03BC\u03B7\u03BC\u03AD\u03BD\u03B1 \u03B1\u03BD\u03AC \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03BC\u03B5\u03BB\u03AD\u03C4\u03B7\u03C2.
statistic.intro.more=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03C4\u03BF \u03C0\u03B5\u03B4\u03AF\u03BF \u03C3\u03C0\u03BF\u03C5\u03B4\u03CE\u03BD \u03B8\u03B1 \u03B2\u03C1\u03B5\u03AF\u03C4\u03B5 <a href\="http\://www.switch.ch/aai/support/documents/studybranch.html" target\="_blank">\u03B5\u03B4\u03CE</a>.
statistic.intro=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C3\u03C4\u03B1\u03C4\u03B9\u03C3\u03C4\u03B9\u03BA\u03AE \u03B4\u03B5\u03AF\u03C7\u03BD\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C3\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B2\u03B1\u03C3\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B1 (\u03B1\u03C0\u03CC \u03C4\u03B9\u03C2 {0}) \u03C4\u03B1\u03BE\u03B9\u03BD\u03BF\u03BC\u03B7\u03BC\u03AD\u03BD\u03B1 \u03B1\u03BD\u03AC \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03BC\u03B5\u03BB\u03AD\u03C4\u03B7\u03C2. \u03A0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03C4\u03BF \u03C0\u03B5\u03B4\u03AF\u03BF \u03C3\u03C0\u03BF\u03C5\u03B4\u03CE\u03BD \u03B8\u03B1 \u03B2\u03C1\u03B5\u03AF\u03C4\u03B5 <a href\="https://www.switch.ch/aai/support/documents/attributes/" target\="_blank">\u03B5\u03B4\u03CE</a>.
statistic.title=\u03A3\u03C4\u03B1\u03C4\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC \u03C4\u03B1\u03BE\u03B9\u03BD\u03BF\u03BC\u03B7\u03BC\u03AD\u03BD\u03B1 \u03B1\u03BD\u03AC \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03BC\u03B5\u03BB\u03AD\u03C4\u03B7\u03C2
......@@ -9,6 +9,5 @@ stat.table.header.total=Total
statistic.chart.intro=This chart shows all accesses {0} based on the entire course data available (since {1}) sorted by level of study.
statistic.chart.pernode.intro=This chart shows all accesses to course elements by persons with study level <i>{0}</i>.
statistic.chart.pernode.total.intro=This chart shows all accesses to course elements based on the entire course data available (since {0}).
statistic.intro=This statistic shows all accesses to course elements based on the entire course data available (since {0}) sorted by study level.
statistic.intro.more=For further information on study levels please go to <a href\="http\://www.switch.ch/aai/support/documents/studybranch.html" target\="_blank"></a>.
statistic.intro=This statistic shows all accesses to course elements based on the entire course data available (since {0}) sorted by study level. For further information on study levels please go to <a href="https://www.switch.ch/aai/support/documents/attributes/" target\="_blank">Switch AAI</a>.
statistic.title=Statistics sorted by level of study
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