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

OO-3752: Limit the number of shown uploaded files in evaluation form reports

parent 13a748a9
No related branches found
No related tags found
No related merge requests found
Showing
with 141 additions and 12 deletions
......@@ -22,6 +22,7 @@ package org.olat.modules.forms;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import org.olat.basesecurity.IdentityRef;
......@@ -173,6 +174,12 @@ public interface EvaluationFormManager {
public File loadResponseFile(EvaluationFormResponse response);
public VFSLeaf loadResponseLeaf(EvaluationFormResponse response);
public File createTmpDir();
public void deleteTmpDirs();
public void copyFilesTo(Collection<EvaluationFormResponse> responses, File targetDir);
public void deleteResponse(EvaluationFormResponse response);
......
......@@ -49,6 +49,8 @@ public class EvaluationFormsModule extends AbstractSpringModule implements Confi
public static final String FORMS_ENABLED = "forms.enabled";
@Autowired
private EvaluationFormManager evaluationFormMAnager;
@Autowired
private EvaluationFormHandler formHandler;
......@@ -75,6 +77,8 @@ public class EvaluationFormsModule extends AbstractSpringModule implements Confi
}
initFileUploadLimit();
evaluationFormMAnager.deleteTmpDirs();
RepositoryHandlerFactory.registerHandler(formHandler, 40);
}
......
......@@ -26,6 +26,7 @@ import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
......@@ -367,6 +368,25 @@ public class EvaluationFormManagerImpl implements EvaluationFormManager {
return evaluationFormStorage.resolve(response.getFileResponse());
}
@Override
public File createTmpDir() {
return evaluationFormStorage.createTmpDir();
}
@Override
public void deleteTmpDirs() {
evaluationFormStorage.deleteTmpDirs();
}
@Override
public void copyFilesTo(Collection<EvaluationFormResponse> responses, File targetDir) {
if (targetDir == null) return;
for (EvaluationFormResponse response: responses) {
evaluationFormStorage.copyTo(response.getFileResponse(), targetDir);
}
}
@Override
public void deleteResponse(EvaluationFormResponse response) {
......
......@@ -34,6 +34,9 @@ import org.olat.core.commons.modules.bc.FolderConfig;
import org.olat.core.commons.modules.bc.vfs.OlatRootFileImpl;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.CodeHelper;
import org.olat.core.util.FileUtils;
import org.olat.core.util.WebappHelper;
import org.olat.core.util.vfs.VFSLeaf;
import org.springframework.stereotype.Service;
......@@ -50,6 +53,8 @@ class EvaluationFormStorage {
private static final String EVALUATION_FORMS_DIRECTORY = "evaluation_form";
private static final String RESPONSES_DIRECTORY = "responses";
private static final String TMP_DIRECTORY = "evaluation_form_tmp";
private Path bcrootDirectory;
private Path rootDirectory;
......@@ -66,6 +71,19 @@ class EvaluationFormStorage {
log.error("Creation of evaluation forms responses directory failed! Path: " + responsesDirectory, e);
}
}
File createTmpDir() {
return getTmpDir().resolve(CodeHelper.getUniqueID()).toFile();
}
void deleteTmpDirs() {
FileUtils.deleteDirsAndFiles(getTmpDir().toFile(), true, false);
log.info("Evaluation form tmp dir cleaned: " + getTmpDir().toString());
}
private Path getTmpDir() {
return Paths.get(WebappHelper.getTmpDir(), TMP_DIRECTORY);
}
Path getResponsesRoot() {
return responsesDirectory;
......@@ -94,6 +112,11 @@ class EvaluationFormStorage {
return new OlatRootFileImpl("/" + relativePath.toString(), null);
}
void copyTo(Path relativePath, File targetDir) {
File file = getAbsolutePath(relativePath).toFile();
FileUtils.copyFileToDir(file, targetDir, "copy evaluation form upload file");
}
void delete(Path relativePath) {
Path absolutePath = null;
try {
......
......@@ -19,6 +19,7 @@
*/
package org.olat.modules.forms.ui;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
......@@ -26,6 +27,8 @@ import org.olat.core.commons.modules.bc.meta.MetaInfo;
import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
......@@ -35,6 +38,7 @@ import org.olat.core.util.CodeHelper;
import org.olat.core.util.Formatter;
import org.olat.core.util.vfs.VFSLeaf;
import org.olat.core.util.vfs.VFSMediaMapper;
import org.olat.fileresource.ZippedDirectoryMediaResource;
import org.olat.modules.forms.EvaluationFormManager;
import org.olat.modules.forms.EvaluationFormResponse;
import org.olat.modules.forms.EvaluationFormSession;
......@@ -50,7 +54,10 @@ import org.springframework.beans.factory.annotation.Autowired;
*/
public class FileUploadListingController extends BasicController {
private final VelocityContainer mainVC;
private Link downloadLink;
private final ResponseDataSource dataSource;
private final ReportHelper reportHelper;
......@@ -64,6 +71,18 @@ public class FileUploadListingController extends BasicController {
this.reportHelper = reportHelper;
mainVC = createVelocityContainer("file_upload_listing");
Long showCount = dataSource.getLimitedResponsesCount();
if (showCount > 0) {
Long showAll = dataSource.getAllResponsesCount();
if (showAll > showCount) {
mainVC.contextPut("downloadInfo", translate("file.upload.download.info", new String[] { showCount.toString(), showAll.toString() }));
}
downloadLink = LinkFactory.createLink("file.upload.download.link", mainVC, this);
} else {
mainVC.contextPut("noText", translate("file.upload.no.text"));
}
List<FileUploadListingWrapper> wrappers = createWrappers(ureq);
mainVC.contextPut("wrappers", wrappers);
putInitialPanel(mainVC);
......@@ -71,7 +90,7 @@ public class FileUploadListingController extends BasicController {
private List<FileUploadListingWrapper> createWrappers(UserRequest ureq) {
List<FileUploadListingWrapper> wrappers = new ArrayList<>();
List<EvaluationFormResponse> responses = dataSource.getResponses();
List<EvaluationFormResponse> responses = dataSource.getLimitedResponses();
for (EvaluationFormResponse response: responses) {
FileUploadListingWrapper wrapper = createWrapper(ureq, response);
wrappers.add(wrapper);
......@@ -109,7 +128,18 @@ public class FileUploadListingController extends BasicController {
@Override
protected void event(UserRequest ureq, Component source, Event event) {
//
if (source == downloadLink) {
doExport(ureq);
}
}
private void doExport(UserRequest ureq) {
List<EvaluationFormResponse> responses = dataSource.getAllResponses();
File tmpDir = evaluationFormManager.createTmpDir();
evaluationFormManager.copyFilesTo(responses, tmpDir);
String name = "survey_files";
ZippedDirectoryMediaResource zipResource = new ZippedDirectoryMediaResource(name, tmpDir);
ureq.getDispatchResult().setResultingMediaResource(zipResource);
}
@Override
......
#if($r.available("file.upload.download.link"))
#if($r.isNotNull($downloadInfo))
$downloadInfo
#end
$r.render("file.upload.download.link")
#end
#if($r.isNotNull($noText))
$noText
#end
#foreach($wrapper in $wrappers)
<div class="o_clearfix o_block_large o_evaluation_fileupload">
<div class="o_clearfix o_evaluation_fileupload">
<div class="o_evaluation_legend" style="border-left: 3px solid $wrapper.color">
<h6>$r.escapeHtml($wrapper.evaluator)</h6>
</div>
......
......@@ -35,6 +35,8 @@ evaluation.form.in.use=Die Ressource wird bereits verwendet. Die Bearbeitung ist
evaluation.form.without.elements=F\u00FCr diesen Fragebogen sind noch keine Fragen vorhanden.
evaluation.in.progress=Die Einsch\u00E4tzung ist gerade in Bearbeitung
evaluator=Benutzer {0}
file.upload.download.info=Es werden {0} von {1} Dateien angezeigt.
file.upload.download.link=Alle Dateien herunterladen.
file.upload.error.limit.exeeded=Die Datei ist zu gross
file.upload.error.mime.type.wrong=Dieser Dateityps ist nicht erlaubt
file.upload.limit=Maximale Dateigr\u00F6sse
......@@ -44,6 +46,7 @@ file.upload.mime.type.image=Bilder
file.upload.mime.type.pdf=PDF
file.upload.mime.type.video=Film
file.upload.mime.types=Dateityp
file.upload.no.text=Es sind keine Dateien vorhanden.
h1=h1
h2=h2
h3=h3
......
......@@ -35,6 +35,8 @@ evaluation.form.in.use=The resource is already used. Editing is limited.
evaluation.form.without.elements=This questionnaire has no questions yet.
evaluation.in.progress=The evaluation is in progress
evaluator=User {0}
file.upload.download.info={0} of {1} files are shown.
file.upload.download.link=Download all files.
file.upload.error.limit.exeeded=The file is too large
file.upload.error.mime.type.wrong=The data type is not allowed
file.upload.limit=Maximal file size
......@@ -44,6 +46,7 @@ file.upload.mime.type.image=Image
file.upload.mime.type.pdf=PDF
file.upload.mime.type.video=Video
file.upload.mime.types=File type
file.upload.no.text=No files are available.
h1=h1
h2=h2
h3=h3
......
......@@ -23,6 +23,7 @@ import java.util.List;
import org.olat.core.CoreSpringFactory;
import org.olat.modules.forms.EvaluationFormResponse;
import org.olat.modules.forms.EvaluationFormsModule;
import org.olat.modules.forms.Limit;
import org.olat.modules.forms.SessionFilter;
import org.olat.modules.forms.manager.EvaluationFormReportDAO;
......@@ -39,17 +40,38 @@ public class RawResponsesDataSource implements ResponseDataSource {
private final SessionFilter filter;
private EvaluationFormReportDAO reportDAO;
private EvaluationFormsModule evaluationFormsModule;
public RawResponsesDataSource(String responseIdentifier, SessionFilter filter) {
super();
this.responseIdentifier = responseIdentifier;
this.filter = filter;
this.reportDAO = CoreSpringFactory.getImpl(EvaluationFormReportDAO.class);
this.evaluationFormsModule = CoreSpringFactory.getImpl(EvaluationFormsModule.class);
}
@Override
public List<EvaluationFormResponse> getResponses() {
public List<EvaluationFormResponse> getAllResponses() {
return reportDAO.getResponses(responseIdentifier, filter, Limit.all());
}
@Override
public List<EvaluationFormResponse> getLimitedResponses() {
return reportDAO.getResponses(responseIdentifier, filter, getLimitMax());
}
@Override
public Long getAllResponsesCount() {
return reportDAO.getResponsesCount(responseIdentifier, filter, Limit.all());
}
@Override
public Long getLimitedResponsesCount() {
return reportDAO.getResponsesCount(responseIdentifier, filter, getLimitMax());
}
private Limit getLimitMax() {
return Limit.max(evaluationFormsModule.getReportMaxSessions());
}
}
......@@ -31,6 +31,12 @@ import org.olat.modules.forms.EvaluationFormResponse;
*/
public interface ResponseDataSource {
public List<EvaluationFormResponse> getResponses();
public List<EvaluationFormResponse> getAllResponses();
public List<EvaluationFormResponse> getLimitedResponses();
public Long getAllResponsesCount();
public Long getLimitedResponsesCount();
}
......@@ -56,7 +56,7 @@ public class TextInputLegendTextDataSource implements LegendTextDataSource {
@Override
public List<SessionText> getResponses() {
return getResponses(getPaginMax());
return getResponses(getLimitMax());
}
public List<SessionText> getResponses(Limit limit) {
......@@ -71,14 +71,14 @@ public class TextInputLegendTextDataSource implements LegendTextDataSource {
}
public Long getResponsesCount() {
return getResponsesCount(getPaginMax());
return getResponsesCount(getLimitMax());
}
public Long getResponsesCount(Limit limit) {
return reportDAO.getResponsesCount(responseIdentifier, filter, limit);
}
private Limit getPaginMax() {
private Limit getLimitMax() {
return Limit.max(evaluationFormsModule.getReportMaxSessions());
}
......
......@@ -119,6 +119,8 @@
}
.o_evaluation_fileupload {
margin-bottom: 2em;
.o_evaluation_thumb {
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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