Skip to content
Snippets Groups Projects
Commit 9c2cbe00 authored by fkiefer's avatar fkiefer
Browse files

OO-2456 rearrange qti archiver, rename export resources

parent 84908f97
No related branches found
No related tags found
No related merge requests found
Showing
with 67 additions and 44 deletions
......@@ -180,7 +180,6 @@ public class OnyxExportManager {
private String createTargetFilename(final String shortTitle, final String type) {
final StringBuilder tf = new StringBuilder();
tf.append(type);
tf.append(Formatter.makeStringFilesystemSave(shortTitle));
tf.append("_");
final DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd__hh-mm-ss__SSS");
......
......@@ -60,6 +60,7 @@ import org.olat.core.helpers.Settings;
public class Formatter {
private static final DateFormat formatterDatetimeFilesystem = new SimpleDateFormat("yyyy-MM-dd'T'HH-mm-ss_SSS");
private static final DateFormat formatterDatetime = new SimpleDateFormat("yyyy-MM-dd'T'HH-mm");
private static final DateFormat formatDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
private static final DateFormat shortFormatDateFileSystem = new SimpleDateFormat("yyyyMMdd");
......@@ -303,6 +304,19 @@ public class Formatter {
}
}
/**
* Use this for naming files or directories with a timestamp. No Seconds and millis!
* As windows does not like ":" in filenames formatDateAndTime(d) does not work
*
* @param d the date to be formatted
* @return a String with the formatted date and time
*/
public static String formatDatetimeSave(Date d) {
synchronized (formatterDatetime) {
return formatterDatetime.format(d);
}
}
public static Date parseDatetimeFilesystemSave(String d) throws ParseException {
synchronized (formatterDatetimeFilesystem) {
return formatterDatetimeFilesystem.parse(d);
......
......@@ -94,9 +94,9 @@ public class ArchiveResource implements MediaResource {
log.error("", e);
}
String label = courseNode.getType() + "_"
+ StringHelper.transformDisplayNameToFileSystemName(courseNode.getShortName())
+ "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis()))
String label = //courseNode.getType() + "_" +
StringHelper.transformDisplayNameToFileSystemName(courseNode.getShortName())
+ "_" + Formatter.formatDatetimeSave(new Date(System.currentTimeMillis()))
+ ".zip";
String urlEncodedLabel = StringHelper.urlEncodeUTF8(label);
hres.setHeader("Content-Disposition","attachment; filename*=UTF-8''" + urlEncodedLabel);
......
......@@ -52,13 +52,14 @@ import org.olat.course.nodes.CheckListCourseNode;
import org.olat.course.nodes.DialogCourseNode;
import org.olat.course.nodes.FOCourseNode;
import org.olat.course.nodes.GTACourseNode;
import org.olat.course.nodes.IQSELFCourseNode;
import org.olat.course.nodes.IQSURVCourseNode;
import org.olat.course.nodes.IQTESTCourseNode;
import org.olat.course.nodes.PFCourseNode;
import org.olat.course.nodes.ProjectBrokerCourseNode;
import org.olat.course.nodes.ScormCourseNode;
import org.olat.course.nodes.TACourseNode;
import org.olat.course.nodes.WikiCourseNode;
import org.olat.ims.qti.export.CourseQTIArchiveController;
/**
* Initial Date: May 26, 2004
......@@ -69,7 +70,8 @@ public class ArchiverMainController extends MainLayoutBasicController {
private static boolean extensionLogged = false;
private static final String CMD_INDEX = "index";
private static final String CMD_QTIRESULTS = "qtiresults";
private static final String CMD_QTISURVRESULTS = "qtisurvresults";
private static final String CMD_QTITESTRESULTS = "qtitestresults";
private static final String CMD_SCOREACCOUNTING = "scoreaccounting";
private static final String CMD_ARCHIVELOGFILES = "archivelogfiles";
private static final String CMD_HANDEDINTASKS = "handedintasks";
......@@ -179,10 +181,17 @@ public class ArchiverMainController extends MainLayoutBasicController {
if (archiverCallback.mayArchiveQtiResults()) {
gtn = new GenericTreeNode();
gtn.setTitle(translate("menu.qtiresults"));
gtn.setUserObject(CMD_QTIRESULTS);
gtn.setUserObject(CMD_QTISURVRESULTS);
gtn.setAltText(translate("menu.qtiresults.alt"));
root.addChild(gtn);
}
if (archiverCallback.mayArchiveQtiTestResults()) {
gtn = new GenericTreeNode();
gtn.setTitle(translate("menu.qtitestresults"));
gtn.setUserObject(CMD_QTITESTRESULTS);
gtn.setAltText("menu.qtitestresults.alt");
root.addChild(gtn);
}
if (archiverCallback.mayArchiveProperties()) {
gtn = new GenericTreeNode();
gtn.setTitle(translate("menu.scoreaccounting"));
......@@ -292,12 +301,15 @@ public class ArchiverMainController extends MainLayoutBasicController {
main.setContent(intro);
} else {
removeAsListenerAndDispose(contentCtr);
if (menuCommand.equals(CMD_QTIRESULTS)) {
contentCtr = new CourseQTIArchiveController(ureq, getWindowControl(), ores);
if (menuCommand.equals(CMD_QTISURVRESULTS)) {
contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, new IQSURVCourseNode());
main.setContent(contentCtr.getInitialComponent());
} else if (menuCommand.equals(CMD_SCOREACCOUNTING)) {
contentCtr = new ScoreAccountingArchiveController(ureq, getWindowControl(), ores, new IQTESTCourseNode());
} else if (menuCommand.equals(CMD_QTITESTRESULTS)) {
contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, new IQTESTCourseNode(), new IQSELFCourseNode());
main.setContent(contentCtr.getInitialComponent());
} else if (menuCommand.equals(CMD_SCOREACCOUNTING)) {
contentCtr = new ScoreAccountingArchiveController(ureq, getWindowControl(), ores);
main.setContent(contentCtr.getInitialComponent());
} else if (menuCommand.equals(CMD_ARCHIVELOGFILES)) {
contentCtr = new CourseLogsArchiveController(ureq, getWindowControl(), ores);
main.setContent(contentCtr.getInitialComponent());
......
......@@ -31,6 +31,11 @@ public class FullAccessArchiverCallback implements IArchiverCallback {
public boolean mayArchiveQtiResults() {
return true;
}
@Override
public boolean mayArchiveQtiTestResults() {
return true;
}
@Override
public boolean mayArchiveLogfiles() {
......
......@@ -34,6 +34,11 @@ public interface IArchiverCallback {
* @return true if user has rights to archive course qti results, false otherwhise
*/
public boolean mayArchiveQtiResults();
/**
* @return true if user has rights to archive course qti test results, false otherwhise
*/
public boolean mayArchiveQtiTestResults();
/**
* @return true if user has rights to archive logfiles, false otherwhise
*/
......
......@@ -48,7 +48,6 @@ import org.olat.core.util.ExportUtil;
import org.olat.course.CourseFactory;
import org.olat.course.ICourse;
import org.olat.course.nodes.AssessableCourseNode;
import org.olat.course.nodes.CourseNode;
/**
* Description: Course-Results-Archiver using ScoreAccountingHelper.class
......@@ -64,7 +63,6 @@ public class ScoreAccountingArchiveController extends BasicController {
private VelocityContainer vcFeedback;
private Link startButton, downloadButton;
private GenericArchiveController genericArchiveController;
/**
* Constructor for the score accounting archive controller
......@@ -72,15 +70,13 @@ public class ScoreAccountingArchiveController extends BasicController {
* @param course
*/
public ScoreAccountingArchiveController(UserRequest ureq, WindowControl wControl,
OLATResourceable ores, CourseNode... nodeTypes) {
OLATResourceable ores) {
super(ureq, wControl);
this.ores = ores;
myPanel = putInitialPanel(myPanel);
myContent = createVelocityContainer("start");
startButton = LinkFactory.createButtonSmall("cmd.start", myContent, this);
genericArchiveController = new GenericArchiveController(ureq, wControl, ores, nodeTypes);
myContent.put("genericarchive", genericArchiveController.getInitialComponent());
myPanel.setContent(myContent);
}
......@@ -120,7 +116,6 @@ public class ScoreAccountingArchiveController extends BasicController {
vcFeedback.contextPut("body", translate("course.res.feedback", new String[] { downloadFile.getName() }));
downloadButton = LinkFactory.createButtonSmall("cmd.download", vcFeedback, this);
downloadButton.setUserObject(downloadFile);
vcFeedback.put("genericarchive", genericArchiveController.getInitialComponent());
myPanel.setContent(vcFeedback);
}
......
......@@ -3,7 +3,4 @@
$body
</p>
<p>$r.render("cmd.download")</p>
<div class="o_block_bottom">
$r.render("genericarchive")
</div>
......@@ -5,6 +5,3 @@
<p>
$r.render("cmd.start")
</p>
<div class="o_block_bottom">
$r.render("genericarchive")
</div>
\ No newline at end of file
......@@ -34,6 +34,7 @@ course.res.intro=Klicken Sie den untenstehenden 'Start'-Knopf um Endresultate vo
course.res.title=Kursresultate
dialog=Dateidiskussionen
iqtest=Testergebnisse
iqsurv=Ergebnisse des Fragebogens
pf=Teilnehmer Ordner
fo=Forums
gta=Aufgaben und Gruppenaufgaben
......@@ -66,8 +67,10 @@ menu.index=Archivierung
menu.index.alt=Datenarchivierung eines OLAT-Kurses
menu.projectbroker=Themenvergabe
menu.projectbroker.alt=Daten der Bausteine "Themenvergabe" archivieren
menu.qtiresults=Test und Fragebogen
menu.qtiresults.alt=Daten von Tests und Fragebogen archivieren
menu.qtiresults=Fragebogen
menu.qtiresults.alt=Daten von Fragebogen archivieren
menu.qtitestresults=Tests
menu.qtitestresults.alt=Daten von Tests archivieren
menu.scoreaccounting=Kursresultate
menu.scoreaccounting.alt=Endresultate von Tests, Bewertungen und Aufgaben archivieren
menu.scorm=SCORM Resultate
......@@ -77,6 +80,7 @@ menu.wikis.alt=Wikis archivieren
nodechoose.intro.pf=W\u00E4hlen Sie einen Kursbaustein aus, um dessen Ordnerinhalte zu archivieren.
nodechoose.intro.cl=W\u00E4hlen Sie im folgenden Dialog den Checklisten Baustein aus, der ausgewertet werden soll
nodechoose.intro.iqtest=W\u00E4hlen Sie einen Kursbaustein aus, um dessen Testergebnisse zu archivieren.
nodechoose.intro.iqsurv=W\u00E4hlen Sie einen Kursbaustein aus, um dessen Testergebnisse zu archivieren.
nodechoose.intro.dialog=W\u00E4hlen Sie einen Kursbaustein aus, um dessen Dateidiskussion zu archivieren.
nodechoose.intro.fo=W\u00E4hlen Sie einen Kursbaustein aus, um dessen Forum zu archivieren.
nodechoose.intro.gta=W\u00E4hlen Sie einen Kursbaustein aus, um dessen Gruppenaufgaben zu archivieren.
......
......@@ -34,7 +34,8 @@ course.res.intro=Click the 'Start' button below in order to archive final result
course.res.title=Course results
pf=Participant Folder
dialog=File dialogs
iqtest=Test results
iqtest=Test and self-test results
iqsurv=Questionnaire results
fo=Forums
gta=Tasks and group tasks
index.intro=By means of this tool you can archive various data from your OLAT course.<p> Choose a topic from the menu on the left to start.
......@@ -66,8 +67,10 @@ menu.index=Archiving
menu.index.alt=Archive data from your OLAT course
menu.projectbroker=Topic assignment
menu.projectbroker.alt=Archive data of topic assignment
menu.qtiresults=Tests and questionnaires
menu.qtiresults.alt=Archive data from tests and questionnaires
menu.qtiresults=Questionnaires
menu.qtiresults.alt=Archive data from questionnaires
menu.qtitestresults=Tests
menu.qtitestresults.alt=Archive data from tests
menu.scoreaccounting=Course results
menu.scoreaccounting.alt=Archive final results from tests, assessments and tasks
menu.scorm=SCORM results
......@@ -77,6 +80,7 @@ menu.wikis.alt=Archive Wikis
nodechoose.intro.pf=Choose a course element to archive the content of the participant folder.
nodechoose.intro.cl=Please select the checklist element you wish to archive.
nodechoose.intro.iqtest=Select a course element to archive its test results.
nodechoose.intro.iqsurv=Select a course element to archive its test results.
nodechoose.intro.dialog=Select a course element to archive its file dialog.
nodechoose.intro.fo=Select a course element to archive its forum.
nodechoose.intro.gta=Choose a course element to archive the group tasks.
......
......@@ -49,9 +49,7 @@ import org.olat.course.CourseFactory;
import org.olat.course.ICourse;
import org.olat.course.assessment.model.AssessmentNodeData;
import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.IQSELFCourseNode;
import org.olat.course.nodes.IQSURVCourseNode;
import org.olat.course.nodes.IQTESTCourseNode;
/**
*
......@@ -180,17 +178,12 @@ public class CourseQTIArchiveController extends BasicController {
}
}
if (childrenData.size() > 0
|| courseNode instanceof IQTESTCourseNode
|| courseNode instanceof IQSELFCourseNode
|| courseNode instanceof IQSURVCourseNode) {
if (childrenData.size() > 0 || courseNode instanceof IQSURVCourseNode) {
// Store node data in hash map. This hash map serves as data model for
// the tasks overview table. Leave user data empty since not used in
// this table. (use only node data)
AssessmentNodeData nodeData = new AssessmentNodeData(recursionLevel, courseNode);
if (courseNode instanceof IQTESTCourseNode
|| courseNode instanceof IQSELFCourseNode
|| courseNode instanceof IQSURVCourseNode){
if (courseNode instanceof IQSURVCourseNode) {
nodeData.setSelectable(true);
} else {
nodeData.setSelectable(false);
......
......@@ -116,7 +116,7 @@ public class QTIExportManager extends BasicManager{
qef.setQTIItemObjectList(qtiItemObjectList);
if (results.size() > 0) {
createContentOfExportFile(results, qtiItemObjectList, qef);
String targetFileName = getFilename(shortTitle, qef, fileNameSuffix);
String targetFileName = getFilename(shortTitle, fileNameSuffix);
exportStream.putNextEntry(new ZipEntry(targetFileName));
IOUtils.write(qef.getReport(), exportStream);
......@@ -191,17 +191,16 @@ public class QTIExportManager extends BasicManager{
*/
private String writeContentToFile(String shortTitle, File exportDirectory, String charset, QTIExportFormatter qef, String fileNameSuffix) {
// defining target filename
String targetFileName = getFilename(shortTitle, qef, fileNameSuffix);
String targetFileName = getFilename(shortTitle, fileNameSuffix);
File savedFile = ExportUtil.writeContentToFile(targetFileName, qef.getReport(), exportDirectory, charset);
return savedFile.getName();
}
private String getFilename(String shortTitle, QTIExportFormatter qef, String fileNameSuffix) {
private String getFilename(String shortTitle, String fileNameSuffix) {
StringBuilder tf = new StringBuilder();
tf.append(qef.getFileNamePrefix());
tf.append(Formatter.makeStringFilesystemSave(shortTitle));
tf.append("_");
DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd__hh-mm-ss__SSS");
DateFormat myformat = new SimpleDateFormat("yyyy-MM-dd__hh-mm");
String timestamp = myformat.format(new Date());
tf.append(timestamp);
tf.append(fileNameSuffix);
......
......@@ -198,8 +198,7 @@ public class QTI21ArchiveFormat {
ICourse course = CourseFactory.loadCourse(courseEntry);
CourseNode courseNode = course.getRunStructure().getNode(subIdent);
String label = courseNode.getType() + "_"
+ StringHelper.transformDisplayNameToFileSystemName(courseNode.getShortName())
String label = StringHelper.transformDisplayNameToFileSystemName(courseNode.getShortName())
+ "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis()))
+ ".xlsx";
......
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