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

OO-2059: fix copy of checklist course element

parent cdbba681
No related branches found
No related tags found
No related merge requests found
...@@ -21,8 +21,10 @@ package org.olat.course.export; ...@@ -21,8 +21,10 @@ package org.olat.course.export;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
...@@ -40,6 +42,7 @@ public class CourseEnvironmentMapper { ...@@ -40,6 +42,7 @@ public class CourseEnvironmentMapper {
private final List<BGAreaReference> areas = new ArrayList<BGAreaReference>(); private final List<BGAreaReference> areas = new ArrayList<BGAreaReference>();
private final List<BusinessGroupReference> groups = new ArrayList<BusinessGroupReference>(); private final List<BusinessGroupReference> groups = new ArrayList<BusinessGroupReference>();
private final Map<String,Map<String,String>> mapUniqueKeys = new HashMap<>();
private Identity author; private Identity author;
...@@ -54,6 +57,24 @@ public class CourseEnvironmentMapper { ...@@ -54,6 +57,24 @@ public class CourseEnvironmentMapper {
public void setAuthor(Identity author) { public void setAuthor(Identity author) {
this.author = author; this.author = author;
} }
public void addUniqueKeyPair(String ident, String sourceKey, String targetKey) {
Map<String,String> map;
if(mapUniqueKeys.containsKey(ident)) {
map = mapUniqueKeys.get(ident);
} else {
map = new HashMap<>();
mapUniqueKeys.put(ident, map);
}
map.put(sourceKey, targetKey);
}
public String getTargetUniqueKey(String ident, String sourceKey) {
if(mapUniqueKeys.containsKey(ident)) {
return mapUniqueKeys.get(ident).get(sourceKey);
}
return null;
}
public List<BGAreaReference> getAreas() { public List<BGAreaReference> getAreas() {
return areas; return areas;
......
...@@ -60,6 +60,7 @@ import org.olat.course.editor.CourseEditorEnv; ...@@ -60,6 +60,7 @@ import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.editor.NodeEditController; import org.olat.course.editor.NodeEditController;
import org.olat.course.editor.PublishEvents; import org.olat.course.editor.PublishEvents;
import org.olat.course.editor.StatusDescription; import org.olat.course.editor.StatusDescription;
import org.olat.course.export.CourseEnvironmentMapper;
import org.olat.course.nodes.cl.CheckboxManager; import org.olat.course.nodes.cl.CheckboxManager;
import org.olat.course.nodes.cl.model.Checkbox; import org.olat.course.nodes.cl.model.Checkbox;
import org.olat.course.nodes.cl.model.CheckboxList; import org.olat.course.nodes.cl.model.CheckboxList;
...@@ -477,7 +478,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements ...@@ -477,7 +478,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
Set<String> usedNames = new HashSet<String>(); Set<String> usedNames = new HashSet<String>();
for(Checkbox checkbox:list.getList()) { for(Checkbox checkbox:list.getList()) {
VFSContainer dir = checkboxManager.getFileContainer(course.getCourseEnvironment(), this, checkbox); VFSContainer dir = checkboxManager.getFileContainer(course.getCourseEnvironment(), this);
if(dir != null) { if(dir != null) {
VFSItem item = dir.resolve(checkbox.getFilename()); VFSItem item = dir.resolve(checkbox.getFilename());
if(item instanceof VFSLeaf) { if(item instanceof VFSLeaf) {
...@@ -504,7 +505,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements ...@@ -504,7 +505,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
CheckboxList list = (CheckboxList)config.get(CONFIG_KEY_CHECKBOX); CheckboxList list = (CheckboxList)config.get(CONFIG_KEY_CHECKBOX);
if(list != null && list.getList() != null) { if(list != null && list.getList() != null) {
for(Checkbox checkbox:list.getList()) { for(Checkbox checkbox:list.getList()) {
File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this, checkbox); File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this);
if(dir.exists()) { if(dir.exists()) {
File fFileExportDir = new File(fExportDirectory, "checklistfiles/" + getIdent() + "/" + checkbox.getCheckboxId()); File fFileExportDir = new File(fExportDirectory, "checklistfiles/" + getIdent() + "/" + checkbox.getCheckboxId());
fFileExportDir.mkdirs(); fFileExportDir.mkdirs();
...@@ -526,7 +527,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements ...@@ -526,7 +527,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
String newCheckboxId = UUID.randomUUID().toString(); String newCheckboxId = UUID.randomUUID().toString();
checkbox.setCheckboxId(newCheckboxId); checkbox.setCheckboxId(newCheckboxId);
if(fFileImportDir.exists()) { if(fFileImportDir.exists()) {
File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this, checkbox); File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this);
dir.mkdirs(); dir.mkdirs();
FileUtils.copyDirContentsToDir(fFileImportDir, dir, false, "import file of checkbox"); FileUtils.copyDirContentsToDir(fFileImportDir, dir, false, "import file of checkbox");
} }
...@@ -614,6 +615,56 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements ...@@ -614,6 +615,56 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
userCourseEnv.getScoreAccounting().scoreInfoChanged(this, sceval); userCourseEnv.getScoreAccounting().scoreInfoChanged(this, sceval);
} }
@Override
public CourseNode createInstanceForCopy(boolean isNewTitle, ICourse course, Identity author) {
CheckListCourseNode cNode = (CheckListCourseNode)super.createInstanceForCopy(isNewTitle, course, author);
CheckboxManager checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class);
CheckboxList list = (CheckboxList)cNode.getModuleConfiguration().get(CONFIG_KEY_CHECKBOX);
for(Checkbox checkbox:list.getList()) {
checkbox.setCheckboxId(UUID.randomUUID().toString());
}
// the ident of the course node is the same
File sourceDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this);
if(sourceDir.exists()) {
File targetDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), cNode);
if(!targetDir.exists()) {
targetDir.mkdirs();
FileUtils.copyDirContentsToDir(sourceDir, targetDir, false, "copy files of checkbox");
}
}
return cNode;
}
@Override
public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, ICourse sourceCourse) {
ModuleConfiguration config = getModuleConfiguration();
CheckboxManager checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class);
CheckboxList list = (CheckboxList)config.get(CONFIG_KEY_CHECKBOX);
for(Checkbox checkbox:list.getList()) {
String sourceId = checkbox.getCheckboxId();
String targetId = envMapper.getTargetUniqueKey(getIdent(), sourceId);
if(targetId == null) {
targetId = UUID.randomUUID().toString();
envMapper.addUniqueKeyPair(getIdent(), sourceId, targetId);
}
checkbox.setCheckboxId(targetId);
}
// the ident of the course node is the same
File sourceDir = checkboxManager.getFileDirectory(sourceCourse.getCourseEnvironment(), this);
if(sourceDir.exists()) {
File targetDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this);
if(!targetDir.exists()) {
targetDir.mkdirs();
FileUtils.copyDirContentsToDir(sourceDir, targetDir, false, "copy files of checkbox");
}
}
checkboxManager.syncCheckbox(list, course, getIdent());
super.postCopy(envMapper, processType, course, sourceCourse);
}
@Override @Override
public void updateOnPublish(Locale locale, ICourse course, Identity publisher, PublishEvents publishEvents) { public void updateOnPublish(Locale locale, ICourse course, Identity publisher, PublishEvents publishEvents) {
......
...@@ -28,7 +28,6 @@ import org.olat.core.util.vfs.VFSContainer; ...@@ -28,7 +28,6 @@ import org.olat.core.util.vfs.VFSContainer;
import org.olat.course.nodes.CheckListCourseNode; import org.olat.course.nodes.CheckListCourseNode;
import org.olat.course.nodes.cl.model.AssessmentBatch; import org.olat.course.nodes.cl.model.AssessmentBatch;
import org.olat.course.nodes.cl.model.AssessmentData; import org.olat.course.nodes.cl.model.AssessmentData;
import org.olat.course.nodes.cl.model.Checkbox;
import org.olat.course.nodes.cl.model.CheckboxList; import org.olat.course.nodes.cl.model.CheckboxList;
import org.olat.course.nodes.cl.model.DBCheck; import org.olat.course.nodes.cl.model.DBCheck;
import org.olat.course.nodes.cl.model.DBCheckbox; import org.olat.course.nodes.cl.model.DBCheckbox;
...@@ -96,7 +95,7 @@ public interface CheckboxManager { ...@@ -96,7 +95,7 @@ public interface CheckboxManager {
*/ */
public List<AssessmentData> getAssessmentDatas(OLATResourceable ores, String resSubPath, RepositoryEntry re, List<BusinessGroup> groups); public List<AssessmentData> getAssessmentDatas(OLATResourceable ores, String resSubPath, RepositoryEntry re, List<BusinessGroup> groups);
public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox); public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode);
public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox); public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode);
} }
...@@ -510,14 +510,14 @@ public class CheckboxManagerImpl implements CheckboxManager { ...@@ -510,14 +510,14 @@ public class CheckboxManagerImpl implements CheckboxManager {
} }
@Override @Override
public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox) { public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode) {
String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + CheckListCourseNode.FOLDER_NAME + "/" + cNode.getIdent(); String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + CheckListCourseNode.FOLDER_NAME + "/" + cNode.getIdent();
OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(path, null); OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(path, null);
return rootFolder; return rootFolder;
} }
@Override @Override
public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox) { public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode) {
String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + CheckListCourseNode.FOLDER_NAME + "/" + cNode.getIdent(); String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + CheckListCourseNode.FOLDER_NAME + "/" + cNode.getIdent();
File rootFolder = new File(FolderConfig.getCanonicalRoot(), path); File rootFolder = new File(FolderConfig.getCanonicalRoot(), path);
return rootFolder; return rootFolder;
......
...@@ -148,7 +148,7 @@ public class CheckListBoxListEditController extends FormBasicController { ...@@ -148,7 +148,7 @@ public class CheckListBoxListEditController extends FormBasicController {
if(list != null && list.getList() != null) { if(list != null && list.getList() != null) {
for(Checkbox checkbox:list.getList()) { for(Checkbox checkbox:list.getList()) {
DownloadLink download = null; DownloadLink download = null;
VFSContainer container = checkboxManager.getFileContainer(courseEnv, courseNode, checkbox); VFSContainer container = checkboxManager.getFileContainer(courseEnv, courseNode);
if(container != null) { if(container != null) {
VFSItem item = container.resolve(checkbox.getFilename()); VFSItem item = container.resolve(checkbox.getFilename());
if(item instanceof VFSLeaf) { if(item instanceof VFSLeaf) {
......
...@@ -204,7 +204,7 @@ public class CheckListRunController extends FormBasicController implements Contr ...@@ -204,7 +204,7 @@ public class CheckListRunController extends FormBasicController implements Contr
DownloadLink downloadLink = null; DownloadLink downloadLink = null;
if(StringHelper.containsNonWhitespace(checkbox.getFilename())) { if(StringHelper.containsNonWhitespace(checkbox.getFilename())) {
VFSContainer container = checkboxManager.getFileContainer(userCourseEnv.getCourseEnvironment(), courseNode, checkbox); VFSContainer container = checkboxManager.getFileContainer(userCourseEnv.getCourseEnvironment(), courseNode);
VFSItem item = container.resolve(checkbox.getFilename()); VFSItem item = container.resolve(checkbox.getFilename());
if(item instanceof VFSLeaf) { if(item instanceof VFSLeaf) {
String name = "file_" + checkbox.getCheckboxId(); String name = "file_" + checkbox.getCheckboxId();
......
...@@ -305,7 +305,7 @@ public class CheckboxEditController extends FormBasicController { ...@@ -305,7 +305,7 @@ public class CheckboxEditController extends FormBasicController {
} else { } else {
ICourse course = CourseFactory.loadCourse(courseOres); ICourse course = CourseFactory.loadCourse(courseOres);
CourseEnvironment courseEnv = course.getCourseEnvironment(); CourseEnvironment courseEnv = course.getCourseEnvironment();
container = checkboxManager.getFileContainer(courseEnv, courseNode, checkbox); container = checkboxManager.getFileContainer(courseEnv, courseNode);
} }
return container; return container;
} }
......
...@@ -103,7 +103,7 @@ public class CheckListStepRunnerCallback implements StepRunnerCallback { ...@@ -103,7 +103,7 @@ public class CheckListStepRunnerCallback implements StepRunnerCallback {
VFSContainer tmpContainer = new LocalFolderImpl(path); VFSContainer tmpContainer = new LocalFolderImpl(path);
VFSItem item = tmpContainer.resolve(templateBox.getFilename()); VFSItem item = tmpContainer.resolve(templateBox.getFilename());
if(item instanceof VFSLeaf) { if(item instanceof VFSLeaf) {
VFSContainer container = checkboxManager.getFileContainer(courseEnv, checkNode, checkbox); VFSContainer container = checkboxManager.getFileContainer(courseEnv, checkNode);
VFSManager.copyContent(tmpContainer, container); VFSManager.copyContent(tmpContainer, container);
tmpContainer.deleteSilently(); tmpContainer.deleteSilently();
} }
......
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