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

OO-3592: quota for participant folder defined every return or drop box

parent 4b40d9ab
No related branches found
No related tags found
No related merge requests found
Showing
with 50 additions and 65 deletions
......@@ -148,6 +148,7 @@ public class GenericQuotaEditController extends BasicController {
myContent.contextPut("repository",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO));
myContent.contextPut("coursefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE));
myContent.contextPut("nodefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES));
myContent.contextPut("pfNodefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_PFNODES));
myContent.contextPut("feeds",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS));
}
......
......@@ -35,6 +35,7 @@ public class QuotaConstants {
public static final String IDENTIFIER_DEFAULT_REPO = IDENTIFIER_DEFAULT + "REPOSITORY";
public static final String IDENTIFIER_DEFAULT_COURSE = IDENTIFIER_DEFAULT + "COURSEFOLDERS";
public static final String IDENTIFIER_DEFAULT_NODES = IDENTIFIER_DEFAULT + "NODEFOLDERS";
public static final String IDENTIFIER_DEFAULT_PFNODES = IDENTIFIER_DEFAULT + "NODEPARTFOLDERS";
public static final String IDENTIFIER_DEFAULT_FEEDS = IDENTIFIER_DEFAULT + "BLOGSPODCASTS";
}
......@@ -117,6 +117,8 @@ public class QuotaManagerImpl extends QuotaManager {
defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_COURSE, defaultQuotaCourseFolder);
Quota defaultQuotaNodeFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES);
defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_NODES, defaultQuotaNodeFolder);
Quota defaultQuotaPfNodeFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_PFNODES);
defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_PFNODES, defaultQuotaPfNodeFolder);
Quota defaultQuotaFeed = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS);
defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS, defaultQuotaFeed);
}
......
......@@ -57,6 +57,11 @@
<tr><td>$r.translate("qd.nodefolder")</td><td>$r.formatBytes($nodefolderQuotaBytes) ($nodefolder.getQuotaKB())</td>
#set ($nodefolderUlLimitBytes = $nodefolder.getUlLimitKB() * 1000)
<td>$r.formatBytes($nodefolderUlLimitBytes) ($nodefolder.getUlLimitKB())</td></tr>
#set ($pfNodefolderQuotaBytes = $pfNodefolder.getQuotaKB() * 1000)
<tr><td>$r.translate("qd.pfnodefolder")</td><td>$r.formatBytes($pfNodefolderQuotaBytes) ($pfNodefolder.getQuotaKB())</td>
#set ($pfNodefolderUlLimitBytes = $pfNodefolder.getUlLimitKB() * 1000)
<td>$r.formatBytes($pfNodefolderUlLimitBytes) ($pfNodefolder.getUlLimitKB())</td></tr>
#set ($feedsQuotaBytes = $feeds.getQuotaKB() * 1000)
<tr><td>$r.translate("qd.feeds")</td><td>$r.formatBytes($feedsQuotaBytes) ($feeds.getQuotaKB())</td>
......
......@@ -2,6 +2,7 @@
qd.coursefolder=Kursordner
qd.groups=Gruppen
qd.nodefolder=Kursbausteine
qd.pfnodefolder=Teilnehmer Ordner Kursbausteine
qd.powerusers=Poweruser (Autoren)
qd.repository=Lernressourcen
qd.title=Default Quotas
......
......@@ -3,6 +3,7 @@ qd.coursefolder=Course folder
qd.feeds=Blogs and podcasts
qd.groups=Groups
qd.nodefolder=Course elements
qd.pfnodefolder=Participant folder course elements
qd.powerusers=Power user (authors)
qd.repository=Learning resources
qd.title=Default quotas
......
......@@ -123,7 +123,7 @@ public class CmdUpload extends BasicController implements FolderCommand {
if (inheritingContainer != null) {
secCallback = inheritingContainer.getLocalSecurityCallback();
actualUsage = VFSManager.getUsageKB(inheritingContainer);
ubar.setActual(actualUsage/ 1024);
ubar.setActual(actualUsage / 1024f);
if (inheritingContainer.getLocalSecurityCallback().getQuota() != null) {
quotaKB = secCallback.getQuota().getQuotaKB().longValue();
uploadLimitKB = (int) secCallback.getQuota().getUlLimitKB().longValue();
......
......@@ -266,7 +266,7 @@ public class PFManager {
* @param dropbox
* @return the VFSSecurityCallback
*/
private VFSSecurityCallback calculateCallback (CourseEnvironment courseEnv, PFCourseNode pfNode, VFSContainer dropbox, boolean webdav) {
private VFSSecurityCallback calculateCallback(CourseEnvironment courseEnv, String quotaPath, PFCourseNode pfNode, VFSContainer dropbox, boolean webdav) {
VFSSecurityCallback callback;
SubscriptionContext folderSubContext = CourseModule.createSubscriptionContext(courseEnv, pfNode);
int count = countFiles(dropbox);
......@@ -280,9 +280,9 @@ public class PFManager {
} else if (limitCount && alterFile) {
callback = new ReadDeleteCallback(folderSubContext);
} else if (!limitCount && !alterFile) {
callback = new ReadWriteCallback(folderSubContext);
callback = new ReadWriteCallback(folderSubContext, quotaPath);
} else {
callback = new ReadWriteDeleteCallback(folderSubContext);
callback = new ReadWriteDeleteCallback(folderSubContext, quotaPath);
}
return callback;
}
......@@ -321,6 +321,7 @@ public class PFManager {
Translator translator = Util.createPackageTranslator(PFRunController.class, locale);
SubscriptionContext subsContext = CourseModule.createSubscriptionContext(courseEnv, pfNode);
String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + FILENAME_PARTICIPANTFOLDER;
String quotaPath = path + "/" + pfNode.getIdent();
VFSContainer courseElementBaseContainer = new OlatRootFolderImpl(path, null);
VirtualContainer namedCourseFolder = new VirtualContainer(identity.getName());
Path relPath = Paths.get(pfNode.getIdent(), getIdFolderName(identity));
......@@ -332,7 +333,7 @@ public class PFManager {
dropContainer.setLocalSecurityCallback(new ReadOnlyCallback(subsContext));
} else {
VFSContainer dropbox = resolveOrCreateDropFolder(courseEnv, pfNode, identity);
VFSSecurityCallback callback = calculateCallback(courseEnv, pfNode, dropbox, true);
VFSSecurityCallback callback = calculateCallback(courseEnv, quotaPath, pfNode, dropbox, true);
dropContainer.setLocalSecurityCallback(callback);
}
namedCourseFolder.addItem(dropContainer);
......@@ -358,8 +359,10 @@ public class PFManager {
Locale locale = I18nManager.getInstance().getLocaleOrDefault(identity.getUser().getPreferences().getLanguage());
Translator translator = Util.createPackageTranslator(PFRunController.class, locale);
SubscriptionContext nodefolderSubContext = CourseModule.createSubscriptionContext(courseEnv, pfNode);
List<Identity> participants = getParticipants(identity, courseEnv, admin);
String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + FILENAME_PARTICIPANTFOLDER;
List<Identity> participants = getParticipants(identity, courseEnv, admin);
String courseContainerRelPath = courseEnv.getCourseBaseContainer().getRelPath();
String path = courseContainerRelPath + "/" + FILENAME_PARTICIPANTFOLDER;
String quotaPath = path + "/" + pfNode.getIdent();
VFSContainer courseElementBaseContainer = new OlatRootFolderImpl(path, null);
VirtualContainer namedCourseFolder = new VirtualContainer(translator.translate("participant.folder"));
for (Identity participant : participants) {
......@@ -375,7 +378,7 @@ public class PFManager {
//if coach is also participant, can user his/her webdav folder with participant rights
if (identity.equals(participant)){
VFSContainer dropbox = resolveOrCreateDropFolder(courseEnv, pfNode, identity);
VFSSecurityCallback callback = calculateCallback(courseEnv, pfNode, dropbox, true);
VFSSecurityCallback callback = calculateCallback(courseEnv, quotaPath, pfNode, dropbox, true);
dropContainer.setLocalSecurityCallback(callback);
} else {
dropContainer.setLocalSecurityCallback(new ReadOnlyCallback(nodefolderSubContext));
......@@ -386,7 +389,7 @@ public class PFManager {
if (pfNode.hasCoachBoxConfigured()){
VFSContainer returnContainer = new NamedContainerImpl(translator.translate("return.box"),
VFSManager.resolveOrCreateContainerFromPath(userBaseContainer, FILENAME_RETURNBOX));
returnContainer.setLocalSecurityCallback(new ReadWriteDeleteCallback(nodefolderSubContext));
returnContainer.setLocalSecurityCallback(new ReadWriteDeleteCallback(nodefolderSubContext, quotaPath));
participantFolder.addItem(returnContainer);
}
}
......@@ -410,6 +413,7 @@ public class PFManager {
participants = new ArrayList<>(new HashSet<>(participants));
String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + FILENAME_PARTICIPANTFOLDER;
String quotaPath = path + "/" + pfNode.getIdent();
VFSContainer courseElementBaseContainer = new OlatRootFolderImpl(path, null);
VirtualContainer namedCourseFolder = new VirtualContainer(translator.translate("participant.folder"));
for (Identity participant : participants) {
......@@ -430,7 +434,7 @@ public class PFManager {
if (pfNode.hasCoachBoxConfigured()){
VFSContainer returnContainer = new NamedContainerImpl(translator.translate("return.box"),
VFSManager.resolveOrCreateContainerFromPath(userBaseContainer, FILENAME_RETURNBOX));
returnContainer.setLocalSecurityCallback(new ReadWriteDeleteCallback(nodefolderSubContext));
returnContainer.setLocalSecurityCallback(new ReadWriteDeleteCallback(nodefolderSubContext, quotaPath));
participantFolder.addItem(returnContainer);
}
}
......@@ -454,6 +458,7 @@ public class PFManager {
SubscriptionContext nodefolderSubContext = CourseModule.createSubscriptionContext(courseEnv, pfNode);
String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + FILENAME_PARTICIPANTFOLDER;
String quotaPath = path + "/" + pfNode.getIdent();
VFSContainer courseElementBaseContainer = new OlatRootFolderImpl(path, null);
Path relPath = Paths.get(pfNode.getIdent(), getIdFolderName(identity));
......@@ -488,10 +493,10 @@ public class PFManager {
} else {
if (isCoach) {
dropContainer.setLocalSecurityCallback(new ReadOnlyCallback(nodefolderSubContext));
returnContainer.setLocalSecurityCallback(new ReadWriteDeleteCallback(nodefolderSubContext));
returnContainer.setLocalSecurityCallback(new ReadWriteDeleteCallback(nodefolderSubContext, quotaPath));
} else {
VFSContainer dropbox = resolveOrCreateDropFolder(courseEnv, pfNode, identity);
VFSSecurityCallback callback = calculateCallback(courseEnv, pfNode, dropbox, false);
VFSSecurityCallback callback = calculateCallback(courseEnv, path, pfNode, dropbox, false);
dropContainer.setLocalSecurityCallback(callback);
returnContainer.setLocalSecurityCallback(new ReadOnlyCallback(nodefolderSubContext));
}
......
......@@ -19,8 +19,10 @@
*/
package org.olat.course.nodes.pf.manager;
import org.olat.admin.quota.QuotaConstants;
import org.olat.core.commons.services.notifications.SubscriptionContext;
import org.olat.core.util.vfs.Quota;
import org.olat.core.util.vfs.QuotaManager;
import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
/**
*
......@@ -30,10 +32,15 @@ import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
public class ReadWriteCallback implements VFSSecurityCallback {
private SubscriptionContext subsContext;
private Quota quota;
private final String folderPath;
private final String defaultQuota;
public ReadWriteCallback(SubscriptionContext subsContext) {
public ReadWriteCallback(SubscriptionContext subsContext, String folderPath) {
super();
this.subsContext = subsContext;
this.folderPath = folderPath;
this.defaultQuota = QuotaConstants.IDENTIFIER_DEFAULT_PFNODES;
}
@Override
......@@ -73,13 +80,21 @@ public class ReadWriteCallback implements VFSSecurityCallback {
@Override
public Quota getQuota() {
return null;
if(quota == null) {
QuotaManager qm = QuotaManager.getInstance();
Quota q = qm.getCustomQuota(folderPath);
if (q == null) {
Quota defQuota = qm.getDefaultQuota(defaultQuota);
q = QuotaManager.getInstance().createQuota(folderPath, defQuota.getQuotaKB(), defQuota.getUlLimitKB());
}
setQuota(q);
}
return quota;
}
@Override
public void setQuota(Quota quota) {
this.quota = quota;
}
@Override
......
......@@ -20,35 +20,15 @@
package org.olat.course.nodes.pf.manager;
import org.olat.core.commons.services.notifications.SubscriptionContext;
import org.olat.core.util.vfs.Quota;
import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
/**
*
* @author Fabian Kiefer, fabian.kiefer@frentix.com, http://www.frentix.com
*
*/
public class ReadWriteDeleteCallback implements VFSSecurityCallback {
public class ReadWriteDeleteCallback extends ReadWriteCallback {
private SubscriptionContext subsContext;
public ReadWriteDeleteCallback(SubscriptionContext subsContext) {
super();
this.subsContext = subsContext;
}
@Override
public boolean canRead() {
return true;
}
@Override
public boolean canWrite() {
return true;
}
@Override
public boolean canCreateFolder() {
return true;
public ReadWriteDeleteCallback(SubscriptionContext subsContext, String folderPath) {
super(subsContext, folderPath);
}
@Override
......@@ -56,34 +36,8 @@ public class ReadWriteDeleteCallback implements VFSSecurityCallback {
return true;
}
@Override
public boolean canList() {
return true;
}
@Override
public boolean canCopy() {
return true;
}
@Override
public boolean canDeleteRevisionsPermanently() {
return false;
}
@Override
public Quota getQuota() {
return null;
}
@Override
public void setQuota(Quota quota) {
}
@Override
public SubscriptionContext getSubscriptionContext() {
return subsContext;
}
}
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