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

OO-2456 refactor in 2 packages add method to access from archieve tool

parent aca8fd45
No related branches found
No related tags found
No related merge requests found
Showing
with 285 additions and 64 deletions
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* frentix GmbH, http://www.frentix.com * frentix GmbH, http://www.frentix.com
* <p> * <p>
*/ */
package org.olat.ims.qti.resultexport; package org.olat.core.gui.util;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
......
...@@ -87,8 +87,6 @@ import org.olat.ims.qti.process.AssessmentInstance; ...@@ -87,8 +87,6 @@ import org.olat.ims.qti.process.AssessmentInstance;
import org.olat.ims.qti.process.FilePersister; import org.olat.ims.qti.process.FilePersister;
import org.olat.ims.qti.resultexport.QTI12ExportResultsReportController; import org.olat.ims.qti.resultexport.QTI12ExportResultsReportController;
import org.olat.ims.qti.resultexport.QTI12ResultsExportMediaResource; import org.olat.ims.qti.resultexport.QTI12ResultsExportMediaResource;
import org.olat.ims.qti.resultexport.QTI21ExportResultsReportController;
import org.olat.ims.qti.resultexport.QTI21ResultsExportMediaResource;
import org.olat.ims.qti.statistics.QTIStatisticResourceResult; import org.olat.ims.qti.statistics.QTIStatisticResourceResult;
import org.olat.ims.qti.statistics.QTIStatisticSearchParams; import org.olat.ims.qti.statistics.QTIStatisticSearchParams;
import org.olat.ims.qti.statistics.QTIType; import org.olat.ims.qti.statistics.QTIType;
...@@ -99,6 +97,8 @@ import org.olat.ims.qti21.QTI21Service; ...@@ -99,6 +97,8 @@ import org.olat.ims.qti21.QTI21Service;
import org.olat.ims.qti21.manager.AssessmentTestSessionDAO; import org.olat.ims.qti21.manager.AssessmentTestSessionDAO;
import org.olat.ims.qti21.manager.archive.QTI21ArchiveFormat; import org.olat.ims.qti21.manager.archive.QTI21ArchiveFormat;
import org.olat.ims.qti21.model.QTI21StatisticSearchParams; import org.olat.ims.qti21.model.QTI21StatisticSearchParams;
import org.olat.ims.qti21.resultexport.QTI21ExportResultsReportController;
import org.olat.ims.qti21.resultexport.QTI21ResultsExportMediaResource;
import org.olat.ims.qti21.ui.QTI21AssessmentDetailsController; import org.olat.ims.qti21.ui.QTI21AssessmentDetailsController;
import org.olat.ims.qti21.ui.QTI21ResetToolController; import org.olat.ims.qti21.ui.QTI21ResetToolController;
import org.olat.ims.qti21.ui.QTI21RetrieveTestsToolController; import org.olat.ims.qti21.ui.QTI21RetrieveTestsToolController;
...@@ -656,8 +656,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe ...@@ -656,8 +656,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
} else if(ImsQTI21Resource.TYPE_NAME.equals(re.getOlatResource().getResourceableTypeName())) { } else if(ImsQTI21Resource.TYPE_NAME.equals(re.getOlatResource().getResourceableTypeName())) {
// 2a) create export resource // 2a) create export resource
QTI21Service qtiService = CoreSpringFactory.getImpl(QTI21Service.class); QTI21Service qtiService = CoreSpringFactory.getImpl(QTI21Service.class);
new QTI21ResultsExportMediaResource(courseEnv, identities, this, new QTI21ResultsExportMediaResource(courseEnv, identities, this, qtiService, ureq, locale).exportTestResults(exportStream);
qtiService, ureq, exportStream, locale).prepare(null);;
// excel results // excel results
QTI21ArchiveFormat qaf = new QTI21ArchiveFormat(locale, true, true, true); QTI21ArchiveFormat qaf = new QTI21ArchiveFormat(locale, true, true, true);
RepositoryEntry courseEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); RepositoryEntry courseEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
...@@ -665,7 +664,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe ...@@ -665,7 +664,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
return true; return true;
} else { } else {
// 2b) create export resource // 2b) create export resource
new QTI12ResultsExportMediaResource(courseEnv, locale, identities, this, exportStream).prepare(null); new QTI12ResultsExportMediaResource(courseEnv, locale, identities, this).exportTestResults(exportStream);
// excel results // excel results
String shortTitle = getShortTitle(); String shortTitle = getShortTitle();
QTIExportManager qem = QTIExportManager.getInstance(); QTIExportManager qem = QTIExportManager.getInstance();
......
...@@ -84,7 +84,6 @@ public class QTI12ResultsExportMediaResource implements MediaResource { ...@@ -84,7 +84,6 @@ public class QTI12ResultsExportMediaResource implements MediaResource {
private CourseEnvironment courseEnv; private CourseEnvironment courseEnv;
private UserRequest ureq; private UserRequest ureq;
private Locale locale; private Locale locale;
private ZipOutputStream exportStream;
private String title, exportFolderName; private String title, exportFolderName;
private Translator translator; private Translator translator;
...@@ -104,18 +103,15 @@ public class QTI12ResultsExportMediaResource implements MediaResource { ...@@ -104,18 +103,15 @@ public class QTI12ResultsExportMediaResource implements MediaResource {
qtiResultManager = QTIResultManager.getInstance(); qtiResultManager = QTIResultManager.getInstance();
} }
public QTI12ResultsExportMediaResource(CourseEnvironment courseEnv, Locale locale, List<Identity> identities, public QTI12ResultsExportMediaResource(CourseEnvironment courseEnv, Locale locale, List<Identity> identities,
QTICourseNode courseNode, ZipOutputStream exportStream) { QTICourseNode courseNode) {
this.courseNode = courseNode; this.courseNode = courseNode;
this.courseEnv = courseEnv; this.courseEnv = courseEnv;
this.locale = locale; this.locale = locale;
this.title = "qti12export"; this.title = "qti12export";
this.identities = identities; this.identities = identities;
this.velocityHelper = VelocityHelper.getInstance(); this.velocityHelper = VelocityHelper.getInstance();
this.exportStream = exportStream;
translator = new PackageTranslator(QTI12ResultsExportMediaResource.class.getPackage().getName(), locale); translator = new PackageTranslator(QTI12ResultsExportMediaResource.class.getPackage().getName(), locale);
this.exportFolderName = translator.translate("export.folder.name"); this.exportFolderName = translator.translate("export.folder.name");
...@@ -150,21 +146,35 @@ public class QTI12ResultsExportMediaResource implements MediaResource { ...@@ -150,21 +146,35 @@ public class QTI12ResultsExportMediaResource implements MediaResource {
@Override @Override
public void prepare(HttpServletResponse hres) { public void prepare(HttpServletResponse hres) {
boolean hasServletResponse = hres != null; String label = StringHelper.transformDisplayNameToFileSystemName(title);
if (label != null && !label.toLowerCase().endsWith(".zip")) {
if (hasServletResponse) { label += ".zip";
String label = StringHelper.transformDisplayNameToFileSystemName(title);
if (label != null && !label.toLowerCase().endsWith(".zip")) {
label += ".zip";
}
String urlEncodedLabel = StringHelper.urlEncodeUTF8(label);
hres.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + urlEncodedLabel);
hres.setHeader("Content-Description", urlEncodedLabel);
} }
String urlEncodedLabel = StringHelper.urlEncodeUTF8(label);
hres.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + urlEncodedLabel);
hres.setHeader("Content-Description", urlEncodedLabel);
try { try {
createZipStream(hres, hasServletResponse); ZipOutputStream zout = new ZipOutputStream(hres.getOutputStream());
zout.setLevel(9);
List<AssessedMember> assessedMembers = createAssessedMembersDetail(zout);
//convert velocity template to zip entry
String usersHTML = createMemberListingHTML(assessedMembers);
convertToZipEntry(zout, exportFolderName + "/index.html", usersHTML);
//Copy resource files or file trees to export file tree
File sasstheme = new File(WebappHelper.getContextRealPath("/static/offline/qti"));
fsToZip(zout, sasstheme.toPath(), exportFolderName + "/css/offline/qti/");
File fontawesome = new File(WebappHelper.getContextRealPath("/static/font-awesome"));
fsToZip(zout, fontawesome.toPath(), exportFolderName + "/css/font-awesome/");
zout.close();
} catch (Exception e) { } catch (Exception e) {
log.error("Unknown error while assessment result resource export", e); log.error("Unknown error while assessment result resource export", e);
} }
...@@ -230,11 +240,13 @@ public class QTI12ResultsExportMediaResource implements MediaResource { ...@@ -230,11 +240,13 @@ public class QTI12ResultsExportMediaResource implements MediaResource {
return assessedMembers; return assessedMembers;
} }
private void createZipStream (HttpServletResponse hres, boolean hasServletResponse) throws Exception { /**
* Adds the result export to existing zip stream.
ZipOutputStream zout = hasServletResponse ? new ZipOutputStream(hres.getOutputStream()) : exportStream; *
zout.setLevel(9); * @throws Exception
*/
public void exportTestResults(ZipOutputStream zout) throws IOException {
List<AssessedMember> assessedMembers = createAssessedMembersDetail(zout); List<AssessedMember> assessedMembers = createAssessedMembersDetail(zout);
//convert velocity template to zip entry //convert velocity template to zip entry
...@@ -247,10 +259,6 @@ public class QTI12ResultsExportMediaResource implements MediaResource { ...@@ -247,10 +259,6 @@ public class QTI12ResultsExportMediaResource implements MediaResource {
File fontawesome = new File(WebappHelper.getContextRealPath("/static/font-awesome")); File fontawesome = new File(WebappHelper.getContextRealPath("/static/font-awesome"));
fsToZip(zout, fontawesome.toPath(), exportFolderName + "/css/font-awesome/"); fsToZip(zout, fontawesome.toPath(), exportFolderName + "/css/font-awesome/");
if (hasServletResponse) {
zout.close();
}
} }
private String createLink(String name, String href, boolean userview){ private String createLink(String name, String href, boolean userview){
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* frentix GmbH, http://www.frentix.com * frentix GmbH, http://www.frentix.com
* <p> * <p>
*/ */
package org.olat.ims.qti.resultexport; package org.olat.ims.qti21.resultexport;
import java.util.List; import java.util.List;
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* frentix GmbH, http://www.frentix.com * frentix GmbH, http://www.frentix.com
* <p> * <p>
*/ */
package org.olat.ims.qti.resultexport; package org.olat.ims.qti21.resultexport;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
...@@ -57,6 +57,7 @@ import org.olat.core.gui.render.StringOutput; ...@@ -57,6 +57,7 @@ import org.olat.core.gui.render.StringOutput;
import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.render.URLBuilder;
import org.olat.core.gui.render.velocity.VelocityHelper; import org.olat.core.gui.render.velocity.VelocityHelper;
import org.olat.core.gui.translator.Translator; import org.olat.core.gui.translator.Translator;
import org.olat.core.gui.util.WindowControlMocker;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.id.UserConstants; import org.olat.core.id.UserConstants;
import org.olat.core.logging.OLog; import org.olat.core.logging.OLog;
...@@ -68,6 +69,9 @@ import org.olat.core.util.WebappHelper; ...@@ -68,6 +69,9 @@ import org.olat.core.util.WebappHelper;
import org.olat.course.nodes.QTICourseNode; import org.olat.course.nodes.QTICourseNode;
import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.environment.CourseEnvironment;
import org.olat.fileresource.FileResourceManager; import org.olat.fileresource.FileResourceManager;
import org.olat.ims.qti.resultexport.AssessedMember;
import org.olat.ims.qti.resultexport.QTI12ExportResultsReportController;
import org.olat.ims.qti.resultexport.ResultDetail;
import org.olat.ims.qti21.AssessmentTestSession; import org.olat.ims.qti21.AssessmentTestSession;
import org.olat.ims.qti21.QTI21DeliveryOptions.ShowResultsOnFinish; import org.olat.ims.qti21.QTI21DeliveryOptions.ShowResultsOnFinish;
import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.QTI21Service;
...@@ -96,8 +100,6 @@ public class QTI21ResultsExportMediaResource implements MediaResource { ...@@ -96,8 +100,6 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
private RepositoryEntry entry; private RepositoryEntry entry;
private UserRequest ureq; private UserRequest ureq;
private ZipOutputStream exportStream;
private Locale locale;
public QTI21ResultsExportMediaResource(CourseEnvironment courseEnv, List<Identity> identities, public QTI21ResultsExportMediaResource(CourseEnvironment courseEnv, List<Identity> identities,
...@@ -111,8 +113,8 @@ public class QTI21ResultsExportMediaResource implements MediaResource { ...@@ -111,8 +113,8 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
this.entry = courseEnv.getCourseGroupManager().getCourseEntry(); this.entry = courseEnv.getCourseGroupManager().getCourseEntry();
} }
public QTI21ResultsExportMediaResource(CourseEnvironment courseEnv, List<Identity> identities, public QTI21ResultsExportMediaResource(CourseEnvironment courseEnv, List<Identity> identities, QTICourseNode courseNode,
QTICourseNode courseNode, QTI21Service qtiService, UserRequest ureq, ZipOutputStream exportStream, Locale locale) { QTI21Service qtiService, UserRequest ureq, Locale locale) {
this.title = "qti21export"; this.title = "qti21export";
this.courseNode = courseNode; this.courseNode = courseNode;
this.identities = identities; this.identities = identities;
...@@ -120,9 +122,8 @@ public class QTI21ResultsExportMediaResource implements MediaResource { ...@@ -120,9 +122,8 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
this.qtiService = qtiService; this.qtiService = qtiService;
this.ureq = ureq; this.ureq = ureq;
this.entry = courseEnv.getCourseGroupManager().getCourseEntry(); this.entry = courseEnv.getCourseGroupManager().getCourseEntry();
this.exportStream = exportStream; this.translator = Util.createPackageTranslator(QTI21ResultsExportMediaResource.class, locale);
this.locale = locale; this.exportFolderName = translator.translate("export.folder.name");
} }
@Override @Override
...@@ -153,23 +154,37 @@ public class QTI21ResultsExportMediaResource implements MediaResource { ...@@ -153,23 +154,37 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
@Override @Override
public void prepare(HttpServletResponse hres) { public void prepare(HttpServletResponse hres) {
//init package translator //init package translator
translator = Util.createPackageTranslator(QTI21ResultsExportMediaResource.class, hres == null ? locale : hres.getLocale()); translator = Util.createPackageTranslator(QTI21ResultsExportMediaResource.class, hres.getLocale());
exportFolderName = translator.translate("export.folder.name"); exportFolderName = translator.translate("export.folder.name");
boolean hasServletResponse = hres != null; String label = StringHelper.transformDisplayNameToFileSystemName(title);
if (hasServletResponse) { if (label != null && !label.toLowerCase().endsWith(".zip")) {
String label = StringHelper.transformDisplayNameToFileSystemName(title); label += ".zip";
if (label != null && !label.toLowerCase().endsWith(".zip")) {
label += ".zip";
}
String urlEncodedLabel = StringHelper.urlEncodeUTF8(label);
hres.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + urlEncodedLabel);
hres.setHeader("Content-Description", urlEncodedLabel);
} }
String urlEncodedLabel = StringHelper.urlEncodeUTF8(label);
hres.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + urlEncodedLabel);
hres.setHeader("Content-Description", urlEncodedLabel);
try { try {
createZipStream(hres, hasServletResponse); ZipOutputStream zout = new ZipOutputStream(hres.getOutputStream());
zout.setLevel(9);
List<AssessedMember> assessedMembers = createAssessedMembersDetail(zout);
//convert velocity template to zip entry
String membersHTML = createMemberListingHTML(assessedMembers);
convertToZipEntry(zout, exportFolderName + "/index.html", membersHTML);
//Copy resource files or file trees to export file tree
File sasstheme = new File(WebappHelper.getContextRealPath("/static/offline/qti"));
fsToZip(zout, sasstheme.toPath(), exportFolderName + "/css/offline/qti/");
File fontawesome = new File(WebappHelper.getContextRealPath("/static/font-awesome"));
fsToZip(zout, fontawesome.toPath(), exportFolderName + "/css/font-awesome/");
zout.close();
} catch (Exception e) { } catch (Exception e) {
log.error("Unknown error while assessment result resource export", e); log.error("Unknown error while assessment result resource export", e);
} }
...@@ -246,9 +261,12 @@ public class QTI21ResultsExportMediaResource implements MediaResource { ...@@ -246,9 +261,12 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
} }
private void createZipStream (HttpServletResponse hres, boolean hasServletResponse) throws IOException { /**
ZipOutputStream zout = hasServletResponse ? new ZipOutputStream(hres.getOutputStream()) : exportStream; * Adds the result export to existing zip stream.
zout.setLevel(9); *
* @throws IOException
*/
public void exportTestResults (ZipOutputStream zout) throws IOException {
List<AssessedMember> assessedMembers = createAssessedMembersDetail(zout); List<AssessedMember> assessedMembers = createAssessedMembersDetail(zout);
...@@ -262,13 +280,9 @@ public class QTI21ResultsExportMediaResource implements MediaResource { ...@@ -262,13 +280,9 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
File fontawesome = new File(WebappHelper.getContextRealPath("/static/font-awesome")); File fontawesome = new File(WebappHelper.getContextRealPath("/static/font-awesome"));
fsToZip(zout, fontawesome.toPath(), exportFolderName + "/css/font-awesome/"); fsToZip(zout, fontawesome.toPath(), exportFolderName + "/css/font-awesome/");
if (hasServletResponse) {
zout.close();
}
} }
private String createLink(String name, String href, boolean userview){ private String createLink(String name, String href, boolean userview) {
String targetLink = userview ? "_blank" : "_self"; String targetLink = userview ? "_blank" : "_self";
return "<a href='" + href + "' target='" + targetLink + "' class='userLink'>" + name + "</a>"; return "<a href='" + href + "' target='" + targetLink + "' class='userLink'>" + name + "</a>";
} }
......
<!DOCTYPE HTML>
<html>
<head>
<title>$rootTitle</title>
<link rel='stylesheet' href='../../../css/offline/qti/theme.css' />
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
</head>
<body class="o_page_margins">
<div id="o_main">$r.render("results")</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="../../css/offline/qti/theme.css" />
<title>$title</title>
<script type="text/javascript" src="../../css/offline/qti/jquery-2.1.3.min.js" ></script>
<script >
$.noConflict();
jQuery(document).ready(function(){
jQuery("#results tbody tr").click(function (){
jQuery(this).addClass("success");
jQuery(this).siblings().removeClass("success");
});});
</script>
</head>
<body class="o_page_margins">
<h2>$title</h2>
<a class='btn btn-default' href='../../index.html'><i class="o_icon o_icon_back o_icon-fw"> </i> $return</a>
<div id="o_main">
<table id='oneUser' class='table table-striped table-hover'>
<thead>
<tr>
<th>$t.translate("table.all.username")</th>
<th>$t.translate("table.all.lastname")</th>
<th>$t.translate("table.all.firstname")</th>
<th>$t.translate("table.user.email")</th>
</tr>
</thead>
<tbody>
<tr>
<td>$assessedMember.username</td>
<td>$assessedMember.lastname</td>
<td>$assessedMember.firstname</td>
<td>$assessedMember.email</td>
</tr>
</tbody>
</table>
</div>
#if ($hasResults)
<div>
<table id='results' class='table table-striped table-hover'>
<thead>
<tr>
<th>$t.translate("table.user.id")</th>
<th>$t.translate("table.user.date")</th>
<th>$t.translate("table.user.duration")</th>
<th>$t.translate("table.user.score")</th>
<th>$t.translate("table.all.passed")</th>
<th>$t.translate("button.show")</th>
</tr>
</thead>
<tbody>
#foreach( $assessment in $assessments )
<tr onclick="window.open('$assessment.link','_blank');">
<td>$assessment.assessmentID</td>
<td>$assessment.assessmentDate</td>
<td>$assessment.duration</td>
<td>$assessment.score</td>
<td>$assessment.passed</td>
<td><span class="btn btn-default btn-sm">$t.translate("button.show")</span></td>
</tr>
#end
</tbody>
</table>
</div>
#end
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="css/offline/qti/theme.css" />
<title>$rootTitle</title>
</head>
<body class="o_page_margins">
<h2>$rootTitle</h2>
<div id="o_main">
<table id='allUsers' class='table table-striped table-hover'>
<thead>
<tr>
<th>$t.translate("table.all.username")</th>
<th>$t.translate("table.all.lastname")</th>
<th>$t.translate("table.all.firstname")</th>
<th>$t.translate("table.all.tries")</th>
</tr>
</thead>
<tbody>
#foreach( $member in $assessedMembers )
<tr>
<td>$member.username</td>
<td>$member.lastname</td>
<td>$member.firstname</td>
<td>$member.tries</td>
</tr>
#end
</tbody>
</table>
</div>
</body>
</html>
\ No newline at end of file
#Tue Nov 15 10:04:42 CET 2016
button.export=Resultate exportieren
button.return=Zur\u00FCck
button.show=Anzeigen
detail.results=Detaillierte Resultate
error.no.assessed.users=Keine Bewertungen vorhanden
table.all.firstname=Vorname
table.all.id=ID
table.all.lastname=Nachname
table.all.passed=Bestanden
table.all.tries=Versuche
table.all.username=Benutzername
table.grading=Bewertung
table.overview=\u00DCbersicht
table.user.attempt=Versuch_
table.user.date=Datum
table.user.duration=Dauer
table.user.email=Email
table.user.id=ID
table.user.score=Punkte
table.user.trial=Versuch
export.folder.name=Resultate
\ No newline at end of file
button.export=Export Results
button.return=Return
button.show=Display
table.overview=Overview
table.grading=Grading
detail.results=Detailed Results
table.user.id=ID
table.user.email=Email
table.user.date=Date
table.user.duration=Duration
table.user.trial=Attempt
table.user.score=Score
table.all.id=ID
table.all.username=Username
table.all.firstname=Firstname
table.all.lastname=Lastname
table.all.tries=Attempts
table.user.attempt=Attempt_
table.all.passed=Passed
error.no.assessed.users=No Assessments available
export.folder.name=Results
\ No newline at end of file
#Tue Nov 15 08:58:19 CET 2016
button.export=Exporter les r\u00E9sultats
button.return=Retour
button.show=Afficher
detail.results=R\u00E9sultats d\u00E9taill\u00E9s
error.no.assessed.users=Aucun r\u00E9sultat disponible
table.all.firstname=Pr\u00E9nom
table.all.id=ID
table.all.lastname=Nom
table.all.passed=R\u00E9ussi
table.all.tries=Essais
table.all.username=Nom d'utilisateur
table.grading=Evaluation
table.overview=Aper\u00E7u
table.user.attempt=Essai_
table.user.date=Date
table.user.duration=Dur\u00E9e
table.user.email=Courriel
table.user.id=ID
table.user.score=Points
table.user.trial=Essai
#Tue Nov 22 16:08:46 CET 2016
button.export=Exportar resultados
button.return=Retornar
button.show=Exibir
detail.results=Resultados detalhados
error.no.assessed.users=Sem avalia\u00E7\u00F5es dispon\u00EDveis
table.all.firstname=Primeiro nome
table.all.id=ID
table.all.lastname=\u00DAltimo nome
table.all.passed=Aprovado
table.all.tries=Tentativas
table.all.username=Usu\u00E1rio
table.grading=Classifica\u00E7\u00E3o
table.overview=Vis\u00E3o geral
table.user.attempt=Tentativa_
table.user.date=Data
table.user.duration=Dura\u00E7\u00E3o
table.user.email=Email
table.user.id=ID
table.user.score=Pontua\u00E7\u00E3o
table.user.trial=Tentativa
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