From 486d98ab42926ac838cee89af7d9fdeef4af6f90 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Wed, 26 Sep 2012 16:06:19 +0200 Subject: [PATCH] OO-347: make the course import of the REST API a real import and not a "deploy" one --- .../java/org/olat/course/CourseFactory.java | 2 +- src/main/java/org/olat/course/ICourse.java | 2 + .../org/olat/course/PersistingCourseImpl.java | 10 + .../repository/ImportCourseController.java | 29 +-- .../ImportPortfolioReferencesController.java | 2 +- .../ImportReferencesController.java | 2 +- ...mportSharedfolderReferencesController.java | 1 - .../controllers/RepositoryAddController.java | 1 - .../course/CourseElementWebService.java | 5 +- .../repository/course/CoursesWebService.java | 181 ++++++++++++++---- .../org/olat/restapi/Course_with_blog.zip | Bin 0 -> 20281 bytes .../java/org/olat/restapi/CoursesTest.java | 2 +- 12 files changed, 172 insertions(+), 65 deletions(-) create mode 100644 src/test/java/org/olat/restapi/Course_with_blog.zip diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java index 7118b555010..89dad79142e 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 47964e0e069..f6b009f2cf8 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 1e3c09bd902..42f6ce84cd6 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 6aee8b5d420..02bd32174ed 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 4b3bfacf777..3dc6bafb2b1 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 39b1ff92ab3..b7ab591175f 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 cf100e0c6b3..5c0c34f9713 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 a9ca18fddd6..d6d6ee85546 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 7269db36519..f4c8f398d95 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 dc7edbee0f5..75fb8a6a07e 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 GIT binary patch literal 20281 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 M!2V_WMhNBq03+UB4FCWD literal 0 HcmV?d00001 diff --git a/src/test/java/org/olat/restapi/CoursesTest.java b/src/test/java/org/olat/restapi/CoursesTest.java index 69e7e282441..01e1a16197e 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()); -- GitLab