diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java index 7118b5550102dfc1b7d0df6825fc55564cc90e59..89dad79142ec704e4574afa790a7738502189d41 100644 --- a/src/main/java/org/olat/course/CourseFactory.java +++ b/src/main/java/org/olat/course/CourseFactory.java @@ -593,7 +593,7 @@ public class CourseFactory extends BasicManager { Tracing.logError("Error deploying course from ZIP: " + exportedCourseZIPFile.getAbsolutePath(), CourseFactory.class); return null; } - File courseExportData = ImportCourseController.getExportDataDir(course); + File courseExportData = course.getCourseExportDataDir().getBasefile(); // get the export data directory // create the repository entry RepositoryEntry re = repositoryManager.createRepositoryEntryInstance("administrator"); diff --git a/src/main/java/org/olat/course/ICourse.java b/src/main/java/org/olat/course/ICourse.java index 47964e0e069d192ba04407dad0d99e2207a4924e..f6b009f2cf87bab71cb8eeb0e6c05ddfc1b87b96 100644 --- a/src/main/java/org/olat/course/ICourse.java +++ b/src/main/java/org/olat/course/ICourse.java @@ -81,6 +81,8 @@ public interface ICourse extends OLATResourceable { * @return the container to the coursefolder of this course */ public VFSContainer getCourseFolderContainer(); + + public OlatRootFolderImpl getCourseExportDataDir(); /** * @return The course title. This is the display name of the course repository entry diff --git a/src/main/java/org/olat/course/PersistingCourseImpl.java b/src/main/java/org/olat/course/PersistingCourseImpl.java index 1e3c09bd9023bd3907d8654d44883766170b59da..42f6ce84cd60ff37561260c2aefbcd1ed985d5a2 100644 --- a/src/main/java/org/olat/course/PersistingCourseImpl.java +++ b/src/main/java/org/olat/course/PersistingCourseImpl.java @@ -43,6 +43,7 @@ import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.tree.TreeVisitor; import org.olat.core.util.tree.Visitor; +import org.olat.core.util.vfs.LocalImpl; import org.olat.core.util.vfs.MergeSource; import org.olat.core.util.vfs.NamedContainerImpl; import org.olat.core.util.vfs.Quota; @@ -153,6 +154,15 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ public OlatRootFolderImpl getCourseBaseContainer() { return courseRootContainer; } + + @Override + public OlatRootFolderImpl getCourseExportDataDir() { + OlatRootFolderImpl vfsExportDir = (OlatRootFolderImpl)getCourseBaseContainer().resolve(ICourse.EXPORTED_DATA_FOLDERNAME); + if (vfsExportDir == null) { + vfsExportDir = (OlatRootFolderImpl)getCourseBaseContainer().createChildContainer(ICourse.EXPORTED_DATA_FOLDERNAME); + } + return vfsExportDir; + } /** * @see org.olat.course.ICourse#getCourseFolderPath() diff --git a/src/main/java/org/olat/course/repository/ImportCourseController.java b/src/main/java/org/olat/course/repository/ImportCourseController.java index 6aee8b5d420448a7b67c97ab99210fb0a00831d5..02bd32174ed66bc87683f1fe2a338dead69e2887 100644 --- a/src/main/java/org/olat/course/repository/ImportCourseController.java +++ b/src/main/java/org/olat/course/repository/ImportCourseController.java @@ -128,7 +128,7 @@ public class ImportCourseController extends BasicController implements IAddContr // create group management CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager(); // import groups - CourseEnvironmentMapper envMapper = cgm.importCourseBusinessGroups(getExportDataDir(course)); + CourseEnvironmentMapper envMapper = cgm.importCourseBusinessGroups(course.getCourseExportDataDir().getBasefile()); //upgrade to the current version of the course ICourse course = CourseFactory.loadCourse(cgm.getCourseResource()); course.postImport(envMapper); @@ -193,12 +193,6 @@ public class ImportCourseController extends BasicController implements IAddContr */ public void event(UserRequest ureq, Component source, Event event) { //nothing to do -/* if (source == finishedMessage) { - getWindowControl().pop(); - // save the editor tree model, to persist any changes made during import. - course.saveEditorTreeModel(); - callback.finished(ureq); - }*/ } /** @@ -342,7 +336,7 @@ public class ImportCourseController extends BasicController implements IAddContr private void processSharedFolder(UserRequest ureq) { // if shared folder controller exists we did already import this one. if (sharedFolderImportController == null) { - RepositoryEntryImportExport sfImportExport = SharedFolderManager.getInstance().getRepositoryImportExport(getExportDataDir(course)); + RepositoryEntryImportExport sfImportExport = SharedFolderManager.getInstance().getRepositoryImportExport(course.getCourseExportDataDir().getBasefile()); removeAsListenerAndDispose(sharedFolderImportController); sharedFolderImportController = new ImportSharedfolderReferencesController(sfImportExport, course, ureq, getWindowControl()); @@ -355,7 +349,7 @@ public class ImportCourseController extends BasicController implements IAddContr private void processGlossary(UserRequest ureq) { // if glossary controller exists we did already import this one. if (glossaryImportController == null) { - RepositoryEntryImportExport sfImportExport = GlossaryManager.getInstance().getRepositoryImportExport(getExportDataDir(course)); + RepositoryEntryImportExport sfImportExport = GlossaryManager.getInstance().getRepositoryImportExport(course.getCourseExportDataDir().getBasefile()); removeAsListenerAndDispose(glossaryImportController); glossaryImportController = new ImportGlossaryReferencesController(sfImportExport, course, ureq, getWindowControl()); @@ -367,7 +361,7 @@ public class ImportCourseController extends BasicController implements IAddContr private void cleanupExportDataDir() { if (course == null) return; - File fExportedDataDir = getExportDataDir(course); + File fExportedDataDir = course.getCourseExportDataDir().getBasefile(); if (fExportedDataDir.exists()) FileUtils.deleteDirsAndFiles(fExportedDataDir, true, true); } @@ -400,7 +394,7 @@ public class ImportCourseController extends BasicController implements IAddContr while (nodeListPos < nodeList.size()) { CourseEditorTreeNode nextNode = nodeList.get(nodeListPos); nodeListPos++; - Controller ctrl = nextNode.getCourseNode().importNode(getExportDataDir(course), course, false, ureq, getWindowControl()); + Controller ctrl = nextNode.getCourseNode().importNode(course.getCourseExportDataDir().getBasefile(), course, false, ureq, getWindowControl()); if (ctrl != null) { // this node needs a controller to do its import job. removeAsListenerAndDispose(activeImportController); @@ -426,19 +420,6 @@ public class ImportCourseController extends BasicController implements IAddContr return true; } - /** - * The folder where nodes export their data to. - * - * @param theCourse - * @return File - */ - public static File getExportDataDir(ICourse theCourse) { - LocalImpl vfsExportDir = (LocalImpl)theCourse.getCourseBaseContainer().resolve(ICourse.EXPORTED_DATA_FOLDERNAME); - if (vfsExportDir == null) - vfsExportDir = (OlatRootFolderImpl)theCourse.getCourseBaseContainer().createChildContainer(ICourse.EXPORTED_DATA_FOLDERNAME); - return vfsExportDir.getBasefile(); - } - protected void doDispose() { if (course != null) CourseFactory.closeCourseEditSession(course.getResourceableId(), false); } diff --git a/src/main/java/org/olat/course/repository/ImportPortfolioReferencesController.java b/src/main/java/org/olat/course/repository/ImportPortfolioReferencesController.java index 4b3bfacf7772f79be766d32dcf7b1a1358a9ae82..3dc6bafb2b172e2ac3538476355a6843c14dc513 100644 --- a/src/main/java/org/olat/course/repository/ImportPortfolioReferencesController.java +++ b/src/main/java/org/olat/course/repository/ImportPortfolioReferencesController.java @@ -115,7 +115,7 @@ public class ImportPortfolioReferencesController extends BasicController { putInitialPanel(mainPanel); } - protected void importWithoutAsking (UserRequest ureq) { + public void importWithoutAsking (UserRequest ureq) { event (ureq, importButton, Event.DONE_EVENT); fireEvent(ureq, Event.DONE_EVENT); } diff --git a/src/main/java/org/olat/course/repository/ImportReferencesController.java b/src/main/java/org/olat/course/repository/ImportReferencesController.java index 39b1ff92ab3e54c7bf54637ddb520b16ad6a729e..b7ab591175f52ef41381cb48c776deb4e985fca6 100644 --- a/src/main/java/org/olat/course/repository/ImportReferencesController.java +++ b/src/main/java/org/olat/course/repository/ImportReferencesController.java @@ -153,7 +153,7 @@ public class ImportReferencesController extends BasicController { putInitialPanel(mainPanel); } - protected void importWithoutAsking (UserRequest ureq) { + public void importWithoutAsking (UserRequest ureq) { //isolate the transaction try { DBFactory.getInstance().commitAndCloseSession(); diff --git a/src/main/java/org/olat/course/repository/ImportSharedfolderReferencesController.java b/src/main/java/org/olat/course/repository/ImportSharedfolderReferencesController.java index cf100e0c6b36dbda2dbdc3b4c78d351581eaefba..5c0c34f9713020b929385f6eeb74bf5c6841659a 100644 --- a/src/main/java/org/olat/course/repository/ImportSharedfolderReferencesController.java +++ b/src/main/java/org/olat/course/repository/ImportSharedfolderReferencesController.java @@ -123,7 +123,6 @@ public class ImportSharedfolderReferencesController extends BasicController { getWindowControl().setError("Import failed."); return; } - Translator repoTranslator = new PackageTranslator(Util.getPackageName(RepositoryManager.class), ureq.getLocale()); removeAsListenerAndDispose(repoDetailsForm); repoDetailsForm = new DetailsReadOnlyForm(ureq, getWindowControl(), importedRepositoryEntry, SharedFolderFileResource.TYPE_NAME, false); listenTo(repoDetailsForm); diff --git a/src/main/java/org/olat/repository/controllers/RepositoryAddController.java b/src/main/java/org/olat/repository/controllers/RepositoryAddController.java index a9ca18fddd66cf85e0091184ad897d25dc8a3e9b..d6d6ee8554627dfb0e494da9446f4b84b186d185 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryAddController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryAddController.java @@ -433,7 +433,6 @@ public class RepositoryAddController extends BasicController { translate("add.header.specific", new String[] {translate(ores.getResourceableTypeName())})); repositoryadd.setPage(VELOCITY_ROOT + "/addDetails.html"); - System.out.println("rrrrrrrrrrr addFinished Commit and close"); DBFactory.getInstance().commitAndCloseSession(); } diff --git a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java index 7269db3651913e90dd4f2f821bd05ccfacd047a6..f4c8f398d951e61d32d2b98c8e31e09fac79f52e 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java @@ -1561,9 +1561,8 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { Boolean isSolutionEnabled = (Boolean)moduleConfig.get(TACourseNode.CONF_SOLUTION_ENABLED); config.setIsSolutionEnabled(isSolutionEnabled == null ? Boolean.TRUE : isSolutionEnabled); //get the conditions - List lstConditions = courseNode.getConditionExpressions(); - for(Object obj : lstConditions) { - ConditionExpression cond = (ConditionExpression) obj; + List<ConditionExpression> lstConditions = courseNode.getConditionExpressions(); + for(ConditionExpression cond : lstConditions) { String id = cond.getId(); String expression = cond.getExptressionString(); if(id.equals(TACourseNode.ACCESS_TASK)) diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java index dc7edbee0f55f385a46edd3fe27f2c1c8e0d8734..75fb8a6a07e09af82f1aa387e7b0a8a9a8307054 100644 --- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java @@ -27,11 +27,11 @@ import static org.olat.restapi.security.RestSecurityHelper.isAuthor; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; -import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; @@ -51,25 +51,31 @@ import org.olat.basesecurity.Constants; import org.olat.basesecurity.SecurityGroup; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.control.Controller; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; 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.Formatter; import org.olat.core.util.StringHelper; -import org.olat.core.util.WebappHelper; import org.olat.core.util.coordinate.LockResult; import org.olat.core.util.resource.OresHelper; import org.olat.course.CourseFactory; import org.olat.course.CourseModule; import org.olat.course.ICourse; +import org.olat.course.Structure; import org.olat.course.config.CourseConfig; import org.olat.course.nodes.CourseNode; +import org.olat.course.repository.ImportGlossaryReferencesController; +import org.olat.course.repository.ImportPortfolioReferencesController; +import org.olat.course.repository.ImportReferencesController; +import org.olat.course.repository.ImportSharedfolderReferencesController; import org.olat.course.tree.CourseEditorTreeNode; +import org.olat.modules.glossary.GlossaryManager; +import org.olat.modules.sharedfolder.SharedFolderManager; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryImportExport; import org.olat.repository.RepositoryManager; import org.olat.repository.SearchRepositoryEntryParameters; import org.olat.repository.handlers.RepositoryHandler; @@ -77,6 +83,7 @@ import org.olat.repository.handlers.RepositoryHandlerFactory; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; import org.olat.restapi.security.RestSecurityHelper; +import org.olat.restapi.support.ErrorWindowControl; import org.olat.restapi.support.MediaTypeVariants; import org.olat.restapi.support.MultipartReader; import org.olat.restapi.support.ObjectFactory; @@ -226,8 +233,8 @@ public class CoursesWebService { if(!isAuthor(request)) { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - - Identity identity = RestSecurityHelper.getUserRequest(request).getIdentity(); + UserRequest ureq = RestSecurityHelper.getUserRequest(request); + Identity identity = ureq.getIdentity(); File tmpFile = null; try { @@ -238,8 +245,8 @@ public class CoursesWebService { Long accessRaw = partsReader.getLongValue("access"); int access = accessRaw != null ? accessRaw.intValue() : RepositoryEntry.ACC_OWNERS; String softKey = partsReader.getValue("softkey"); - - ICourse course = importCourse(identity, tmpFile, softKey, access); + String displayName = partsReader.getValue("displayname"); + ICourse course = importCourse(ureq, identity, tmpFile, displayName, softKey, access); CourseVO vo = ObjectFactory.get(course); return Response.ok(vo).build(); } @@ -256,12 +263,114 @@ public class CoursesWebService { return Response.ok(vo).build(); } - public static ICourse importCourse(Identity identity, File fCourseImportZIP, String softKey, int access) { - RepositoryEntry re = CourseFactory.deployCourseFromZIP(fCourseImportZIP, identity.getName(), softKey, access); - ICourse course = CourseFactory.loadCourse(re.getOlatResource()); + public static ICourse importCourse(UserRequest ureq, Identity identity, File fCourseImportZIP, + String displayName, String softKey, int access) { + + OLATResource newCourseResource = OLATResourceManager.getInstance().createOLATResourceInstance(CourseModule.class); + ICourse course = CourseFactory.importCourseFromZip(newCourseResource, fCourseImportZIP); + if (course == null) { + return null; + } + + if(!StringHelper.containsNonWhitespace(displayName)) { + RepositoryEntryImportExport importExport = new RepositoryEntryImportExport(course.getCourseExportDataDir().getBasefile()); + displayName = importExport.getDisplayName(); + } + if(!StringHelper.containsNonWhitespace(displayName)) { + displayName = "import-" + UUID.randomUUID().toString(); + } + + // create empty run structure + course = CourseFactory.openCourseEditSession(course.getResourceableId()); + Structure runStructure = course.getRunStructure(); + runStructure.getRootNode().removeAllChildren(); + CourseFactory.saveCourse(course.getResourceableId()); + + //import all references + List<CourseEditorTreeNode> nodeList = new ArrayList<CourseEditorTreeNode>(); + collectNodesAsList((CourseEditorTreeNode)course.getEditorTreeModel().getRootNode(), nodeList); + processNodeList(ureq, course, nodeList); + + CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig(); + if (courseConfig.hasCustomSharedFolder()) { + processSharedFolder(ureq, course); + } + else if (courseConfig.hasGlossary()) { + processGlossary(ureq, course); + } + + //make the repository + RepositoryEntry re = createCourseRepositoryEntry(identity, displayName, softKey, newCourseResource); + prepareSecurityGroup(identity, re, access); + + //update tree + course.getRunStructure().getRootNode().setShortTitle(Formatter.truncateOnly(course.getCourseTitle(), 25)); //do not use truncate! + course.getRunStructure().getRootNode().setLongTitle(displayName); + CourseEditorTreeNode editorRootNode = ((CourseEditorTreeNode)course.getEditorTreeModel().getRootNode()); + editorRootNode.getCourseNode().setShortTitle(Formatter.truncateOnly(course.getCourseTitle(), 25)); //do not use truncate! + editorRootNode.getCourseNode().setLongTitle(course.getCourseTitle()); + // mark entire structure as dirty/new so the user can re-publish + markDirtyNewRecursively(editorRootNode); + // root has already been created during export. Unmark it. + editorRootNode.setNewnode(false); + + CourseFactory.closeCourseEditSession(course.getResourceableId(), false); + + //publish + CourseFactory.publishCourse(course, identity, ureq.getLocale()); + return course; } + private static void processSharedFolder(UserRequest ureq, ICourse course) { + // if shared folder controller exists we did already import this one. + RepositoryEntryImportExport sfImportExport + = SharedFolderManager.getInstance().getRepositoryImportExport(course.getCourseExportDataDir().getBasefile()); + ImportSharedfolderReferencesController.doImport(sfImportExport, course, false, ureq.getIdentity()); + } + + private static void processGlossary(UserRequest ureq, ICourse course) { + // if glossary controller exists we did already import this one. + RepositoryEntryImportExport sfImportExport + = GlossaryManager.getInstance().getRepositoryImportExport(course.getCourseExportDataDir().getBasefile()); + ImportGlossaryReferencesController.doImport(sfImportExport, course, false, ureq.getIdentity()); + } + + /** + * Mark whole tree (incl. root node) "dirty" and "new" recursively. + * + * @param editorRootNode + */ + private static void markDirtyNewRecursively(CourseEditorTreeNode editorRootNode) { + editorRootNode.setDirty(true); + editorRootNode.setNewnode(true); + if (editorRootNode.getChildCount() > 0) { + for (int i = 0; i < editorRootNode.getChildCount(); i++) { + markDirtyNewRecursively((CourseEditorTreeNode)editorRootNode.getChildAt(i)); + } + } + } + + private static void collectNodesAsList(CourseEditorTreeNode rootNode, List<CourseEditorTreeNode> nl) { + nl.add(rootNode); + for (int i = 0; i < rootNode.getChildCount(); i++) { + collectNodesAsList((CourseEditorTreeNode)rootNode.getChildAt(i), nl); + } + } + + private static void processNodeList(UserRequest ureq, ICourse course, List<CourseEditorTreeNode> nodeList) { + for (CourseEditorTreeNode nextNode : nodeList) { + Controller ctrl = nextNode.getCourseNode().importNode(course.getCourseExportDataDir().getBasefile(), course, false, ureq, new ErrorWindowControl()); + if (ctrl != null) { + if (ctrl instanceof ImportReferencesController) { + ((ImportReferencesController) ctrl).importWithoutAsking (ureq); + } else if (ctrl instanceof ImportPortfolioReferencesController) { + ((ImportPortfolioReferencesController) ctrl).importWithoutAsking (ureq); + } + } + } + } + public static ICourse copyCourse(Long copyFrom, UserRequest ureq, String name, String longTitle, CourseConfigVO courseConfigVO) { String shortTitle = name; //String learningObjectives = name + " (Example of creating a new course)"; @@ -300,7 +409,7 @@ public class CoursesWebService { OLATResource ores = OLATResourceManager.getInstance().findOrPersistResourceable(newResourceable); preparedEntry.setOlatResource(ores); // create security group - prepareSecurityGroup(ureq.getIdentity(), preparedEntry); + prepareSecurityGroup(ureq.getIdentity(), preparedEntry, RepositoryEntry.ACC_OWNERS); // copy image if available RepositoryManager.getInstance().copyImage(src, preparedEntry); @@ -324,35 +433,43 @@ public class CoursesWebService { String learningObjectives = shortTitle + " (Example of creating a new course)"; try { - // create the course resource OLATResourceable oresable = OLATResourceManager.getInstance().createOLATResourceInstance(CourseModule.class); - // create a repository entry - RepositoryEntry addedEntry = RepositoryManager.getInstance().createRepositoryEntryInstance(initialAuthor.getName()); - addedEntry.setCanDownload(false); - addedEntry.setCanLaunch(true); - addedEntry.setDisplayname(shortTitle); - addedEntry.setResourcename("-"); - // Do set access for owner at the end, because unfinished course should be - // invisible - // addedEntry.setAccess(RepositoryEntry.ACC_OWNERS); - addedEntry.setAccess(0);// Access for nobody - - // Set the resource on the repository entry and save the entry. - // bind resource and repository entry - OLATResource ores = OLATResourceManager.getInstance().findOrPersistResourceable(oresable); - addedEntry.setOlatResource(ores); - + RepositoryEntry addedEntry = createCourseRepositoryEntry(initialAuthor, shortTitle, null, oresable); // create an empty course CourseFactory.createEmptyCourse(oresable, shortTitle, longTitle, learningObjectives); - prepareSecurityGroup(initialAuthor, addedEntry); + prepareSecurityGroup(initialAuthor, addedEntry, RepositoryEntry.ACC_OWNERS); return prepareCourse(addedEntry, courseConfigVO); } catch (Exception e) { throw new WebApplicationException(e); } } - private static void prepareSecurityGroup(Identity identity, RepositoryEntry addedEntry) { + private static RepositoryEntry createCourseRepositoryEntry(Identity initialAuthor, String shortTitle, + String softKey, OLATResourceable oresable) { + // create a repository entry + RepositoryEntry addedEntry = RepositoryManager.getInstance().createRepositoryEntryInstance(initialAuthor.getName()); + addedEntry.setCanDownload(false); + addedEntry.setCanLaunch(true); + addedEntry.setDisplayname(shortTitle); + addedEntry.setResourcename("-"); + if(StringHelper.containsNonWhitespace(softKey) && softKey.length() <= 30) { + addedEntry.setSoftkey(softKey); + } + // Do set access for owner at the end, because unfinished course should be + // invisible + // addedEntry.setAccess(RepositoryEntry.ACC_OWNERS); + addedEntry.setAccess(0);// Access for nobody + + // Set the resource on the repository entry and save the entry. + // bind resource and repository entry + OLATResource ores = OLATResourceManager.getInstance().findOrPersistResourceable(oresable); + addedEntry.setOlatResource(ores); + + return addedEntry;//!!!no update at this point + } + + private static void prepareSecurityGroup(Identity identity, RepositoryEntry addedEntry, int access) { // create security group BaseSecurity securityManager = BaseSecurityManager.getInstance(); SecurityGroup newGroup = securityManager.createAndPersistSecurityGroup(); @@ -381,7 +498,7 @@ public class CoursesWebService { securityManager.createAndPersistPolicy(participantGroup, Constants.PERMISSION_HASROLE, Constants.ORESOURCE_PARTICIPANT); addedEntry.setParticipantGroup(participantGroup); // Do set access for owner at the end, because unfinished course should be invisible - addedEntry.setAccess(RepositoryEntry.ACC_OWNERS); + addedEntry.setAccess(access); RepositoryManager.getInstance().saveRepositoryEntry(addedEntry); } diff --git a/src/test/java/org/olat/restapi/Course_with_blog.zip b/src/test/java/org/olat/restapi/Course_with_blog.zip new file mode 100644 index 0000000000000000000000000000000000000000..62ec56d7e6f1321396de9cc7e58a1a2969ca585e Binary files /dev/null and b/src/test/java/org/olat/restapi/Course_with_blog.zip differ diff --git a/src/test/java/org/olat/restapi/CoursesTest.java b/src/test/java/org/olat/restapi/CoursesTest.java index 69e7e282441e5bde0d0b55b168684cac1296cbef..01e1a16197e3b5800c5e27b259b798e61bfc02f7 100644 --- a/src/test/java/org/olat/restapi/CoursesTest.java +++ b/src/test/java/org/olat/restapi/CoursesTest.java @@ -174,7 +174,7 @@ public class CoursesTest extends OlatJerseyTestCase { @Test public void testImportCourse() throws IOException, URISyntaxException { - URL cpUrl = CoursesTest.class.getResource("Very_small_course.zip"); + URL cpUrl = CoursesTest.class.getResource("Course_with_blog.zip"); assertNotNull(cpUrl); File cp = new File(cpUrl.toURI());