From 30a79e2172f422edf9fffb886edab5462a083bbb Mon Sep 17 00:00:00 2001 From: uhensler <urs.hensler@frentix.com> Date: Mon, 24 Feb 2020 10:33:14 +0100 Subject: [PATCH] OO-4241: Enable course element "Topic assignment" in learning path courses --- .../course/nodes/ProjectBrokerCourseNode.java | 365 +++++++++--------- .../ProjectBrokerControllerFactory.java | 2 +- .../ProjectBrokerCourseEditorController.java | 31 +- .../ProjectBrokerLearningPathNodeHandler.java | 80 ++++ .../_content/edit_condition.html | 12 - .../_i18n/LocalStrings_ar.properties | 2 - .../_i18n/LocalStrings_de.properties | 5 +- .../_i18n/LocalStrings_el.properties | 3 - .../_i18n/LocalStrings_en.properties | 3 - .../_i18n/LocalStrings_fr.properties | 3 - .../_i18n/LocalStrings_it.properties | 3 - .../_i18n/LocalStrings_nl_NL.properties | 3 - .../_i18n/LocalStrings_pl.properties | 2 - .../_i18n/LocalStrings_pt_BR.properties | 3 - .../_i18n/LocalStrings_zh_CN.properties | 3 - 15 files changed, 278 insertions(+), 242 deletions(-) create mode 100644 src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerLearningPathNodeHandler.java delete mode 100644 src/main/java/org/olat/course/nodes/projectbroker/_content/edit_condition.html diff --git a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java index d8ea39eb0fc..f2a7abef45f 100644 --- a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java +++ b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java @@ -30,7 +30,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; -import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -59,7 +58,6 @@ import org.olat.core.id.Organisation; import org.olat.core.id.Roles; import org.olat.core.id.context.BusinessControl; import org.olat.core.id.context.BusinessControlFactory; -import org.olat.core.logging.OLATRuntimeException; import org.olat.core.logging.Tracing; import org.olat.core.util.DirectoryFilter; import org.olat.core.util.ExportUtil; @@ -79,8 +77,7 @@ import org.olat.core.util.vfs.filters.VFSSystemItemFilter; import org.olat.core.util.xml.XStreamHelper; import org.olat.course.ICourse; import org.olat.course.condition.Condition; -import org.olat.course.condition.interpreter.ConditionExpression; -import org.olat.course.condition.interpreter.ConditionInterpreter; +import org.olat.course.editor.ConditionAccessEditConfig; import org.olat.course.editor.CourseEditorEnv; import org.olat.course.editor.NodeEditController; import org.olat.course.editor.StatusDescription; @@ -100,7 +97,6 @@ import org.olat.course.properties.CoursePropertyManager; import org.olat.course.properties.PersistingCoursePropertyManager; import org.olat.course.run.navigation.NodeRunConstructionResult; import org.olat.course.run.userview.CourseNodeSecurityCallback; -import org.olat.course.run.userview.NodeEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; @@ -113,11 +109,11 @@ import org.olat.resource.OLATResource; import com.thoughtworks.xstream.XStream; /** - * - * @author Christian Guretzki + * + * @author Christian Guretzki */ -public class ProjectBrokerCourseNode extends GenericCourseNode { +public class ProjectBrokerCourseNode extends AbstractAccessableCourseNode { private static final long serialVersionUID = -8177448874150049173L; private static final Logger log = Tracing.createLoggerFor(ProjectBrokerCourseNode.class); @@ -126,16 +122,16 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { private transient static final String PACKAGE = Util.getPackageName(ProjectBrokerCourseNode.class); public transient static final String TYPE = "projectbroker"; - + // NLS support: - + private transient static final String NLS_GUESTNOACCESS_TITLE = "guestnoaccess.title"; private transient static final String NLS_GUESTNOACCESS_MESSAGE = "guestnoaccess.message"; private transient static final String NLS_ERROR_MISSINGSCORECONFIG_SHORT = "error.missingscoreconfig.short"; private transient static final String NLS_WARN_NODEDELETE = "warn.nodedelete"; // MUST BE NON TRANSIENT - private static final int CURRENT_CONFIG_VERSION = 2; + private static final int CURRENT_CONFIG_VERSION = 3; /** CONF_DROPBOX_ENABLED configuration parameter key. */ public transient static final String CONF_DROPBOX_ENABLED = "dropbox_enabled"; @@ -164,28 +160,37 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { public transient static final String CONF_PROJECTBROKER_KEY = "conf_projectbroker_id"; public transient static final String CONF_NODE_SHORT_TITLE_KEY = "conf_node_short_title"; - + // MUST BE NON TRANSIENT - private Condition conditionDrop, conditionScoring, conditionReturnbox; - private Condition conditionProjectBroker; + private Condition conditionDrop, conditionScoring, conditionReturnbox; + private Condition conditionProjectBroker; public ProjectBrokerCourseNode() { this(null); } - + public ProjectBrokerCourseNode(INode parent) { super(TYPE, parent); } @Override - public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - ProjectBrokerCourseEditorController childTabCntrllr = ProjectBrokerControllerFactory.createCourseEditController(ureq, wControl, course, euce, this ); - CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); - NodeEditController editController = new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); + public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, + ICourse course, UserCourseEnvironment euce) { + ProjectBrokerCourseEditorController childTabCntrllr = ProjectBrokerControllerFactory + .createCourseEditController(ureq, wControl, course, euce, this); + CourseNode chosenNode = course.getEditorTreeModel() + .getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); + NodeEditController editController = new NodeEditController(ureq, wControl, course, chosenNode, euce, + childTabCntrllr); editController.addControllerListener(childTabCntrllr); return editController; } + @Override + public ConditionAccessEditConfig getAccessEditConfig() { + return ConditionAccessEditConfig.regular(false); + } + @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { @@ -202,37 +207,40 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { if (nodecmd != null) { try { Long projectId = Long.valueOf(nodecmd); - BusinessControlFactory bcf = BusinessControlFactory.getInstance(); - BusinessControl businessControl = bcf.createFromString("[Project:"+projectId+"]"); + BusinessControlFactory bcf = BusinessControlFactory.getInstance(); + BusinessControl businessControl = bcf.createFromString("[Project:" + projectId + "]"); wControl = bcf.createBusinessWindowControl(businessControl, wControl); } catch (NumberFormatException e) { // ups, nodecmd is not a message, what the heck is it then? log.warn("Could not create message ID from given nodemcd::" + nodecmd, e); } } - controller = ProjectBrokerControllerFactory.createRunController(ureq, wControl,userCourseEnv, this); + controller = ProjectBrokerControllerFactory.createRunController(ureq, wControl, userCourseEnv, this); } - Controller wrapperCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_projectbroker_icon"); + Controller wrapperCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, + "o_projectbroker_icon"); return new NodeRunConstructionResult(wrapperCtrl); } @Override - public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { - return ProjectBrokerControllerFactory.createPreviewController(ureq, wControl,userCourseEnv, this); + public Controller createPreviewController(UserRequest ureq, WindowControl wControl, + UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { + return ProjectBrokerControllerFactory.createPreviewController(ureq, wControl, userCourseEnv, this); } @Override - public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, - CourseNodeSecurityCallback nodeSecCallback) { + public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, + UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { if (nodeSecCallback.isAccessible()) { - Controller peekViewController = ProjectBrokerControllerFactory.createPeekViewRunController(ureq, wControl, userCourseEnv, this); - return peekViewController; + Controller peekViewController = ProjectBrokerControllerFactory.createPeekViewRunController(ureq, wControl, + userCourseEnv, this); + return peekViewController; } else { // use standard peekview return super.createPeekViewRunController(ureq, wControl, userCourseEnv, nodeSecCallback); } - } - + } + @Override public RepositoryEntry getReferencedRepositoryEntry() { return null; @@ -245,12 +253,15 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { @Override public StatusDescription isConfigValid() { - if (oneClickStatusCache != null) { return oneClickStatusCache[0]; } + if (oneClickStatusCache != null) { + return oneClickStatusCache[0]; + } boolean isValid = true; Boolean hasScoring = (Boolean) getModuleConfiguration().get(CONF_SCORING_ENABLED); if (hasScoring.booleanValue()) { - if (!MSEditFormController.isConfigValid(getModuleConfiguration())) isValid = false; + if (!MSEditFormController.isConfigValid(getModuleConfiguration())) + isValid = false; } StatusDescription sd = StatusDescription.NOERROR; if (!isValid) { @@ -268,38 +279,30 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { @Override public StatusDescription[] isConfigValid(CourseEditorEnv cev) { oneClickStatusCache = null; - // only here we know which translator to take for translating condition error messages + // only here we know which translator to take for translating condition error + // messages // check if group-manager is already initialized - List<StatusDescription> sds = isConfigValidWithTranslator(cev, PACKAGE_PROJECTBROKER, getConditionExpressions()); + List<StatusDescription> sds = isConfigValidWithTranslator(cev, PACKAGE_PROJECTBROKER, + getConditionExpressions()); oneClickStatusCache = StatusDescriptionHelper.sort(sds); return oneClickStatusCache; } - @Override - public void calcAccessAndVisibility(ConditionInterpreter ci, NodeEvaluation nodeEval) { - if (ci == null) throw new OLATRuntimeException("no condition interpreter <" + getIdent() + " " + getShortName() + ">", - new IllegalArgumentException()); - if (nodeEval == null) throw new OLATRuntimeException("node Evaluationt is null!! for <" + getIdent() + " " + getShortName() + ">", - new IllegalArgumentException()); - // evaluate the preconditions - boolean projectBrokerAccess = (getConditionProjectBroker().getConditionExpression() == null ? true : ci.evaluateCondition(conditionProjectBroker)); - nodeEval.putAccessStatus(ACCESS_PROJECTBROKER, projectBrokerAccess); - // add a dummy access-status to open course node in general otherwise the hole project-broker could be closed - boolean visible = (getPreConditionVisibility().getConditionExpression() == null ? true : ci - .evaluateCondition(getPreConditionVisibility())); - nodeEval.setVisible(visible); - } - @Override public String informOnDelete(Locale locale, ICourse course) { Translator trans = new PackageTranslator(PACKAGE_PROJECTBROKER, locale); CoursePropertyManager cpm = PersistingCoursePropertyManager.getInstance(course); List<Property> list = cpm.listCourseNodeProperties(this, null, null, null); - if (list.size() != 0) return trans.translate(NLS_WARN_NODEDELETE); // properties exist - File fDropboxFolder = new File(FolderConfig.getCanonicalRoot() + DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this)); - if (fDropboxFolder.exists() && fDropboxFolder.list().length > 0) return trans.translate(NLS_WARN_NODEDELETE); // Dropbox folder contains files - File fReturnboxFolder = new File(FolderConfig.getCanonicalRoot() + ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this)); - if (fReturnboxFolder.exists() && fReturnboxFolder.list().length > 0) return trans.translate(NLS_WARN_NODEDELETE); // Returnbox folder contains files + if (list.size() != 0) + return trans.translate(NLS_WARN_NODEDELETE); // properties exist + File fDropboxFolder = new File(FolderConfig.getCanonicalRoot() + + DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this)); + if (fDropboxFolder.exists() && fDropboxFolder.list().length > 0) + return trans.translate(NLS_WARN_NODEDELETE); // Dropbox folder contains files + File fReturnboxFolder = new File(FolderConfig.getCanonicalRoot() + + ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this)); + if (fReturnboxFolder.exists() && fReturnboxFolder.list().length > 0) + return trans.translate(NLS_WARN_NODEDELETE); // Returnbox folder contains files return null; // no data yet. } @@ -309,15 +312,18 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class); Long projectBrokerId = projectBrokerManager.getProjectBrokerId(cpm, this); - File fDropBox = new File(FolderConfig.getCanonicalRoot() + DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this)); + File fDropBox = new File(FolderConfig.getCanonicalRoot() + + DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this)); if (fDropBox.exists()) { FileUtils.deleteDirsAndFiles(fDropBox, true, true); } - File fReturnBox = new File(FolderConfig.getCanonicalRoot() + ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this)); + File fReturnBox = new File(FolderConfig.getCanonicalRoot() + + ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this)); if (fReturnBox.exists()) { FileUtils.deleteDirsAndFiles(fReturnBox, true, true); } - File attachmentDir = new File(FolderConfig.getCanonicalRoot() + projectBrokerManager.getAttachmentBasePathRelToFolderRoot(course.getCourseEnvironment(), this)); + File attachmentDir = new File(FolderConfig.getCanonicalRoot() + + projectBrokerManager.getAttachmentBasePathRelToFolderRoot(course.getCourseEnvironment(), this)); if (attachmentDir.exists()) { FileUtils.deleteDirsAndFiles(attachmentDir, true, true); } @@ -327,7 +333,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { } // Delete all properties... cpm.deleteNodeProperties(this, null); - + OLATResource resource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource(); CoreSpringFactory.getImpl(TaskExecutorManager.class).delete(resource, getIdent()); } @@ -417,9 +423,10 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { } @Override - public void postImport(File importDirectory, ICourse course, CourseEnvironmentMapper envMapper, Processing processType) { + public void postImport(File importDirectory, ICourse course, CourseEnvironmentMapper envMapper, + Processing processType) { // initialize managers - if(processType == Processing.editor && importDirectory != null) { + if (processType == Processing.editor && importDirectory != null) { ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class); CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); // create a new projectBroker @@ -428,20 +435,21 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { // get the node folder inside of the importDirectory File folderNodeData = new File(importDirectory, getIdent()); - //for the broker prefs + // for the broker prefs File projectBrokerFile = new File(folderNodeData, "projectbroker.xml"); - if(projectBrokerFile.exists()) { + if (projectBrokerFile.exists()) { XStream xstream = XStreamHelper.createXStreamInstance(); ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class); - ProjectBrokerConfig brokerConfig = (ProjectBrokerConfig)XStreamHelper.readObject(xstream, projectBrokerFile); - if(brokerConfig != null && brokerConfig.getAccountGroupKey() != null) { + ProjectBrokerConfig brokerConfig = (ProjectBrokerConfig) XStreamHelper.readObject(xstream, + projectBrokerFile); + if (brokerConfig != null && brokerConfig.getAccountGroupKey() != null) { Long accountGroupKey = envMapper.toGroupKeyFromOriginalKey(brokerConfig.getAccountGroupKey()); - if(accountGroupKey != null) { + if (accountGroupKey != null) { projectGroupManager.saveAccountManagerGroupKey(accountGroupKey, cpm, this); } } } - + // loop through the project directories if (folderNodeData.exists()) { for (File projectDir : folderNodeData.listFiles(DirectoryFilter.DIRECTORY_FILTER)) { @@ -453,45 +461,50 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { } super.postImport(importDirectory, course, envMapper, processType); } - - private void importProject(File projectDir, File projectFile, ProjectBroker projectBroker, ICourse course, CourseEnvironmentMapper envMapper) { + + private void importProject(File projectDir, File projectFile, ProjectBroker projectBroker, ICourse course, + CourseEnvironmentMapper envMapper) { XStream xstream = XStreamHelper.createXStreamInstance(); BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class); CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class); ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class); - + // read the projectConfiguration from the importDirectory try { @SuppressWarnings("unchecked") - Map<String, Object> projectConfig = (HashMap<String, Object>) XStreamHelper.readObject(xstream, projectFile); - String projectTitle = (String)projectConfig.get("title"); - + Map<String, Object> projectConfig = (HashMap<String, Object>) XStreamHelper.readObject(xstream, + projectFile); + String projectTitle = (String) projectConfig.get("title"); + Long originalGroupKey = null; - if(projectConfig.containsKey("businessGroupKey")) { - originalGroupKey = (Long)projectConfig.get("businessGroupKey"); + if (projectConfig.containsKey("businessGroupKey")) { + originalGroupKey = (Long) projectConfig.get("businessGroupKey"); } else { - for(BusinessGroupReference ref:envMapper.getGroups()) { - if(ref.getName().endsWith(projectTitle)) { + for (BusinessGroupReference ref : envMapper.getGroups()) { + if (ref.getName().endsWith(projectTitle)) { originalGroupKey = ref.getOriginalKey(); } } } BusinessGroup projectGroup = null; - if(originalGroupKey != null) { + if (originalGroupKey != null) { Long groupKey = envMapper.toGroupKeyFromOriginalKey(originalGroupKey); projectGroup = bgs.loadBusinessGroup(groupKey); } - if(projectGroup == null) { - projectGroup = projectGroupManager.createProjectGroupFor(projectBroker.getKey(), envMapper.getAuthor(), projectTitle, (String)projectConfig.get("description"), course.getResourceableId()); + if (projectGroup == null) { + projectGroup = projectGroupManager.createProjectGroupFor(projectBroker.getKey(), envMapper.getAuthor(), + projectTitle, (String) projectConfig.get("description"), course.getResourceableId()); } - if(envMapper.getAuthor() != null) { + if (envMapper.getAuthor() != null) { Identity author = envMapper.getAuthor(); bgs.addOwners(author, null, Collections.singletonList(author), projectGroup, null); } - Project project = projectBrokerManager.createAndSaveProjectFor(projectTitle, (String)projectConfig.get("description"), projectBrokerManager.getProjectBrokerId(cpm, this), projectGroup); + Project project = projectBrokerManager.createAndSaveProjectFor(projectTitle, + (String) projectConfig.get("description"), projectBrokerManager.getProjectBrokerId(cpm, this), + projectGroup); projectGroupManager.setDeselectionAllowed(project, (boolean) projectConfig.get("allowDeselection")); project.setMailNotificationEnabled((boolean) projectConfig.get("mailNotificationEnabled")); project.setMaxMembers((int) projectConfig.get("maxMembers")); @@ -507,7 +520,8 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { File[] attachment = attachmentDir.listFiles(); if (attachment.length > 0) { VFSLeaf attachmentLeaf = new LocalFileImpl(attachment[0]); - projectBrokerManager.saveAttachedFile(project, projectConfig.get("attachmentFileName").toString(), attachmentLeaf, course.getCourseEnvironment(), this); + projectBrokerManager.saveAttachedFile(project, projectConfig.get("attachmentFileName").toString(), + attachmentLeaf, course.getCourseEnvironment(), this); } } } catch (Exception e) { @@ -518,7 +532,8 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { } @Override - public void importNode(File importDirectory, ICourse course, Identity owner, Organisation organisation, Locale locale, boolean withReferences) { + public void importNode(File importDirectory, ICourse course, Identity owner, Organisation organisation, + Locale locale, boolean withReferences) { super.importNode(importDirectory, course, owner, organisation, locale, withReferences); } @@ -530,11 +545,11 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { ProjectBroker pb = projectBrokerManager.getProjectBroker(projectBrokerManager.getProjectBrokerId(cpm, this)); ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class); XStream xstream = XStreamHelper.createXStreamInstance(); - + // folder for the pb node File pbNodeFolder = new File(exportDirectory, getIdent()); pbNodeFolder.mkdirs(); - //for the broker prefs + // for the broker prefs ProjectBrokerConfig brokerConfig = new ProjectBrokerConfig(); brokerConfig.setAccountGroupKey(projectGroupManager.getAccountManagerGroupKey(cpm, this)); File projectBrokerFile = new File(pbNodeFolder, "projectbroker.xml"); @@ -542,7 +557,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { // get all the projects available in the pb List<Project> projects = projectBrokerManager.getProjectListBy(pb.getKey()); - for (Project project:projects) { + for (Project project : projects) { File projectFolder = new File(pbNodeFolder, project.getKey().toString()); projectFolder.mkdirs(); // create a hashmap with the project configuration and insert the @@ -565,12 +580,15 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { // writeout the project data XStreamHelper.writeObject(xstream, projectFile, projectData); // add attachment file - LocalFolderImpl rootFolder = VFSManager.olatRootContainer(projectBrokerManager.getAttamchmentRelativeRootPath(project, course.getCourseEnvironment(), this), null); + LocalFolderImpl rootFolder = VFSManager.olatRootContainer( + projectBrokerManager.getAttamchmentRelativeRootPath(project, course.getCourseEnvironment(), this), + null); VFSItem item = rootFolder.resolve(project.getAttachmentFileName()); if (item instanceof VFSLeaf) { VFSLeaf itemLeaf = (VFSLeaf) item; File attachmentFolder = new File(projectFolder, "attachment"); - File attachment = new File(attachmentFolder, Base64.encodeBase64String(project.getAttachmentFileName().getBytes())); + File attachment = new File(attachmentFolder, + Base64.encodeBase64String(project.getAttachmentFileName().getBytes())); try { attachmentFolder.mkdirs(); attachment.createNewFile(); @@ -585,27 +603,28 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { } } } - - + @Override - public boolean archiveNodeData(Locale locale, ICourse course, ArchiveOptions options, - ZipOutputStream exportStream, String archivePath, String charset) { + public boolean archiveNodeData(Locale locale, ICourse course, ArchiveOptions options, ZipOutputStream exportStream, + String archivePath, String charset) { boolean dataFound = false; - String dropboxPath = DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(),this); + String dropboxPath = DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this); VFSContainer dropboxDir = VFSManager.olatRootContainer(dropboxPath, null); - String returnboxPath = ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(),this); + String returnboxPath = ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this); VFSContainer returnboxDir = VFSManager.olatRootContainer(returnboxPath, null); if (!dropboxDir.exists() && !returnboxDir.exists()) { return false; } - - String exportDirName = "projectbroker_" + Formatter.makeStringFilesystemSave(getShortName()) - + "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); + + String exportDirName = "projectbroker_" + Formatter.makeStringFilesystemSave(getShortName()) + "_" + + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); exportDirName = ZipUtil.concat(archivePath, exportDirName); try { - String projectBrokerTableExport = ProjectBrokerExportGenerator.createCourseResultsOverviewTable(this, course, locale); - String tableExportFileName = ExportUtil.createFileNameWithTimeStamp(getShortTitle() + "-projectbroker_overview", "xls"); + String projectBrokerTableExport = ProjectBrokerExportGenerator.createCourseResultsOverviewTable(this, + course, locale); + String tableExportFileName = ExportUtil + .createFileNameWithTimeStamp(getShortTitle() + "-projectbroker_overview", "xls"); exportStream.putNextEntry(new ZipEntry(exportDirName + "/" + tableExportFileName)); IOUtils.write(projectBrokerTableExport, exportStream, "UTF-8"); exportStream.closeEntry(); @@ -615,25 +634,30 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { // copy dropboxes to tmp dir if (dropboxDir.exists()) { - //OLAT-6426 archive only dropboxes of users that handed in at least one file -> prevent empty folders in archive - for(VFSItem themaItem: dropboxDir.getItems(new VFSSystemItemFilter())) { - if (!(themaItem instanceof VFSContainer)) continue; - List<VFSItem> userFolderArray = ((VFSContainer)themaItem).getItems(new VFSSystemItemFilter()); - for (VFSItem userFolder : userFolderArray){ - if (!VFSManager.isDirectoryAndNotEmpty(userFolder)) continue; - String path = exportDirName + "/dropboxes/" + themaItem.getName(); + // OLAT-6426 archive only dropboxes of users that handed in at least one file -> + // prevent empty folders in archive + for (VFSItem themaItem : dropboxDir.getItems(new VFSSystemItemFilter())) { + if (!(themaItem instanceof VFSContainer)) + continue; + List<VFSItem> userFolderArray = ((VFSContainer) themaItem).getItems(new VFSSystemItemFilter()); + for (VFSItem userFolder : userFolderArray) { + if (!VFSManager.isDirectoryAndNotEmpty(userFolder)) + continue; + String path = exportDirName + "/dropboxes/" + themaItem.getName(); ZipUtil.addToZip(userFolder, path, exportStream); } } } - + // copy returnboxes to tmp dir if (returnboxDir.exists()) { - for (VFSItem themaItem:returnboxDir.getItems(new VFSSystemItemFilter())) { - if (!(themaItem instanceof VFSContainer)) continue; - List<VFSItem> userFolderArray = ((VFSContainer)themaItem).getItems(new VFSSystemItemFilter()); - for (VFSItem userFolder : userFolderArray){ - if (!VFSManager.isDirectoryAndNotEmpty(userFolder)) continue; + for (VFSItem themaItem : returnboxDir.getItems(new VFSSystemItemFilter())) { + if (!(themaItem instanceof VFSContainer)) + continue; + List<VFSItem> userFolderArray = ((VFSContainer) themaItem).getItems(new VFSSystemItemFilter()); + for (VFSItem userFolder : userFolderArray) { + if (!VFSManager.isDirectoryAndNotEmpty(userFolder)) + continue; String path = exportDirName + "/returnboxes/" + themaItem.getName(); ZipUtil.addToZip(userFolder, path, exportStream); } @@ -643,26 +667,6 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { return dataFound; } - @Override - public List<ConditionExpression> getConditionExpressions() { - List<ConditionExpression> retVal; - List<ConditionExpression> parentsConditions = super.getConditionExpressions(); - if (parentsConditions.size() > 0) { - retVal = new ArrayList<>(parentsConditions); - } else { - retVal = new ArrayList<>(); - } - - String condition = getConditionProjectBroker().getConditionExpression(); - if (condition != null && !condition.equals("")) { - // an active condition is defined - ConditionExpression ce = new ConditionExpression(getConditionProjectBroker().getConditionId()); - ce.setExpressionString(getConditionProjectBroker().getConditionExpression()); - retVal.add(ce); - } - return retVal; - } - @Override public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); @@ -690,11 +694,16 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { this.setConditionReturnbox(null); version = 2; } + if (version < 3) { + setPreConditionAccess(conditionProjectBroker); + conditionProjectBroker = null; + conditionScoring = null; + } config.setConfigurationVersion(CURRENT_CONFIG_VERSION); } } } - + @Override protected void postImportCopyConditions(CourseEnvironmentMapper envMapper) { super.postImportCopyConditions(envMapper); @@ -714,47 +723,51 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { } /** - * Do re-arrange the projects in a new project broker after the copy happened + * Do re-arrange the projects in a new project broker after the copy happened */ - @Override - public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, ICourse sourceCourse) { - super.postCopy(envMapper, processType, course, null); - if(processType.equals(Processing.runstructure)) { - //initialize the managers and services + @Override + public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, + ICourse sourceCourse) { + super.postCopy(envMapper, processType, course, null); + if (processType.equals(Processing.runstructure)) { + // initialize the managers and services ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class); ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class); CoursePropertyManager oldCpm = sourceCourse.getCourseEnvironment().getCoursePropertyManager(); BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class); - //create new Project broker and get the old one + // create new Project broker and get the old one Long projectBrokerId = projectBrokerManager.createAndSaveProjectBroker().getKey(); - projectBrokerManager.saveProjectBrokerId(projectBrokerId, course.getCourseEnvironment().getCoursePropertyManager(), this); - - //find the group for account manager and remap the account group + projectBrokerManager.saveProjectBrokerId(projectBrokerId, + course.getCourseEnvironment().getCoursePropertyManager(), this); + + // find the group for account manager and remap the account group CourseNode sourceCourseNode = sourceCourse.getRunStructure().getNode(getIdent()); Long sourceAccountGroupKey = projectGroupManager.getAccountManagerGroupKey(oldCpm, sourceCourseNode); - if(sourceAccountGroupKey != null) { + if (sourceAccountGroupKey != null) { Long copiedGroupKey = envMapper.toGroupKeyFromOriginalKey(sourceAccountGroupKey); CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); projectGroupManager.saveAccountManagerGroupKey(copiedGroupKey, cpm, this); - } + } Long oldBrokerId = projectBrokerManager.getProjectBrokerId(oldCpm, this); List<Project> projectsFromGroup = projectBrokerManager.getProjectListBy(oldBrokerId); - //loop create and configure the new Projects - for(Project project : projectsFromGroup){ + // loop create and configure the new Projects + for (Project project : projectsFromGroup) { Long originalGroupKey = project.getProjectGroup().getKey(); Long copiedGroupKey = envMapper.toGroupKeyFromOriginalKey(originalGroupKey); - + Identity author = envMapper.getAuthor(); BusinessGroup projectGroup = bgs.loadBusinessGroup(copiedGroupKey); if (projectGroup == null) { - projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, author, project.getTitle(), project.getDescription(), course.getResourceableId()); + projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, author, + project.getTitle(), project.getDescription(), course.getResourceableId()); } - if(author != null) { + if (author != null) { bgs.addOwners(author, null, Collections.singletonList(author), projectGroup, null); } - - Project newProject = projectBrokerManager.createAndSaveProjectFor(project.getTitle(), project.getDescription(), projectBrokerId, projectGroup); + + Project newProject = projectBrokerManager.createAndSaveProjectFor(project.getTitle(), + project.getDescription(), projectBrokerId, projectGroup); // copy all project configurations newProject.setMailNotificationEnabled(project.isMailNotificationEnabled()); newProject.setMaxMembers(project.getMaxMembers()); @@ -764,17 +777,19 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { projectGroupManager.setDeselectionAllowed(newProject, project.getProjectGroup().isAllowToLeave()); projectBrokerManager.updateProject(newProject); // attachment file - VFSContainer rootFolder = VFSManager.olatRootContainer(projectBrokerManager.getAttamchmentRelativeRootPath(project, sourceCourse.getCourseEnvironment(), this), null); + VFSContainer rootFolder = VFSManager.olatRootContainer(projectBrokerManager + .getAttamchmentRelativeRootPath(project, sourceCourse.getCourseEnvironment(), this), null); VFSItem item = rootFolder.resolve(project.getAttachmentFileName()); if (item instanceof VFSLeaf) { - projectBrokerManager.saveAttachedFile(newProject, project.getAttachmentFileName(), (VFSLeaf) item, course.getCourseEnvironment(), this); + projectBrokerManager.saveAttachedFile(newProject, project.getAttachmentFileName(), (VFSLeaf) item, + course.getCourseEnvironment(), this); newProject.setAttachedFileName(project.getAttachmentFileName()); projectBrokerManager.updateProject(newProject); } } - } + } } - + @Override public CourseNode createInstanceForCopy(boolean isNewTitle, ICourse course, Identity author) { // create the instance for the copy @@ -784,35 +799,39 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class); ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class); - + // get the pbID from the source pb Long oldProjectBrokerId = projectBrokerManager.getProjectBrokerId(cpm, this); // create a new projectBroker for the copyInstance ProjectBroker newBroker = projectBrokerManager.createAndSaveProjectBroker(); Long projectBrokerId = newBroker.getKey(); projectBrokerManager.saveProjectBrokerId(projectBrokerId, cpm, copyInstance); - - + // configure the new Project like the old one // copy the old accountManagergroup to preserve the // "persons in charge" Long originalAccountGroupKey = projectGroupManager.getAccountManagerGroupKey(cpm, this); - if(originalAccountGroupKey != null) { - BusinessGroup originalAccountGroup = projectGroupManager.getAccountManagerGroupFor(cpm, this, course, getShortTitle(), getShortTitle(), null); + if (originalAccountGroupKey != null) { + BusinessGroup originalAccountGroup = projectGroupManager.getAccountManagerGroupFor(cpm, this, course, + getShortTitle(), getShortTitle(), null); BusinessGroup newAccountManagerGroup = bgs.copyBusinessGroup(author, originalAccountGroup, originalAccountGroup.getName(), originalAccountGroup.getDescription(), - originalAccountGroup.getMinParticipants(), originalAccountGroup.getMaxParticipants(), false, false, true, false, false, true, false, false); + originalAccountGroup.getMinParticipants(), originalAccountGroup.getMaxParticipants(), false, false, + true, false, false, true, false, false); projectGroupManager.saveAccountManagerGroupKey(newAccountManagerGroup.getKey(), cpm, copyInstance); - bgs.addResourceTo(newAccountManagerGroup, course.getCourseEnvironment().getCourseGroupManager().getCourseEntry()); + bgs.addResourceTo(newAccountManagerGroup, + course.getCourseEnvironment().getCourseGroupManager().getCourseEntry()); } - + if (oldProjectBrokerId != null) { List<Project> projects = projectBrokerManager.getProjectListBy(oldProjectBrokerId); - for (Project project: projects) { + for (Project project : projects) { // create projectGroup - BusinessGroup projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, author, project.getTitle(), project.getDescription(), course.getResourceableId()); - Project newProject = projectBrokerManager.createAndSaveProjectFor(project.getTitle(), project.getDescription(), projectBrokerId, projectGroup); - + BusinessGroup projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, author, + project.getTitle(), project.getDescription(), course.getResourceableId()); + Project newProject = projectBrokerManager.createAndSaveProjectFor(project.getTitle(), + project.getDescription(), projectBrokerId, projectGroup); + // copy all project configurations newProject.setMailNotificationEnabled(project.isMailNotificationEnabled()); newProject.setMaxMembers(project.getMaxMembers()); @@ -823,10 +842,12 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { projectBrokerManager.updateProject(newProject); // attachment file - VFSContainer rootFolder = VFSManager.olatRootContainer(projectBrokerManager.getAttamchmentRelativeRootPath(project, course.getCourseEnvironment(), this), null); + VFSContainer rootFolder = VFSManager.olatRootContainer(projectBrokerManager + .getAttamchmentRelativeRootPath(project, course.getCourseEnvironment(), this), null); VFSItem item = rootFolder.resolve(project.getAttachmentFileName()); if (item instanceof VFSLeaf) { - projectBrokerManager.saveAttachedFile(newProject, project.getAttachmentFileName(), (VFSLeaf) item, course.getCourseEnvironment(), copyInstance); + projectBrokerManager.saveAttachedFile(newProject, project.getAttachmentFileName(), (VFSLeaf) item, + course.getCourseEnvironment(), copyInstance); newProject.setAttachedFileName(project.getAttachmentFileName()); projectBrokerManager.updateProject(newProject); } @@ -834,7 +855,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { } return copyInstance; } - + public static class ProjectBrokerConfig implements Serializable { private static final long serialVersionUID = -1002067261836601966L; diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerControllerFactory.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerControllerFactory.java index e85a2afec68..c2fa29bf78f 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerControllerFactory.java +++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerControllerFactory.java @@ -42,7 +42,7 @@ import org.olat.course.run.userview.UserCourseEnvironment; public class ProjectBrokerControllerFactory { public static ProjectBrokerCourseEditorController createCourseEditController(UserRequest ureq, WindowControl wControl, ICourse course, UserCourseEnvironment euce, ProjectBrokerCourseNode projectBrokerCourseNode) { - return new ProjectBrokerCourseEditorController(ureq, wControl, course, projectBrokerCourseNode, euce); + return new ProjectBrokerCourseEditorController(ureq, wControl, course, projectBrokerCourseNode); } public static Controller createRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNode courseNode) { diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java index d8a9464bed2..34a39592c45 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java +++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java @@ -57,7 +57,6 @@ import org.olat.core.util.vfs.VFSManager; import org.olat.core.util.vfs.callbacks.VFSSecurityCallback; import org.olat.course.CourseFactory; import org.olat.course.ICourse; -import org.olat.course.assessment.AssessmentHelper; import org.olat.course.auditing.UserNodeAuditManager; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.NodeEditController; @@ -71,7 +70,6 @@ import org.olat.course.nodes.projectbroker.service.ProjectBrokerModuleConfigurat import org.olat.course.nodes.projectbroker.service.ProjectGroupManager; import org.olat.course.nodes.ta.DropboxForm; import org.olat.course.properties.CoursePropertyManager; -import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupAddResponse; import org.olat.group.BusinessGroupService; @@ -89,12 +87,10 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef public static final String PANE_TAB_CONF_DROPBOX = "pane.tab.conf.dropbox"; public static final String PANE_TAB_CONF_MODULES = "pane.tab.conf.modules"; - public static final String PANE_TAB_ACCESSIBILITY = "pane.tab.accessibility"; private static final String PANE_TAB_OPTIONS = "pane.tab.options"; private static final String PANE_TAB_ACCOUNT_MANAGEMENT = "pane.tab.accountmanagement"; - private static final String[] paneKeys = { PANE_TAB_CONF_DROPBOX, PANE_TAB_CONF_MODULES, - PANE_TAB_ACCESSIBILITY }; + private static final String[] paneKeys = { PANE_TAB_CONF_DROPBOX, PANE_TAB_CONF_MODULES }; private Long courseId; @@ -103,7 +99,7 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef private ProjectBrokerModuleConfiguration projectBrokerModuleConfiguration; private BusinessGroup accountManagerGroup; - private VelocityContainer accessabilityVC, optionsFormVC, accountManagementFormVC; + private VelocityContainer optionsFormVC, accountManagementFormVC; private VelocityContainer editModules, editDropbox, editScoring; private TabbedPane myTabbedPane; private int dropboxTabPosition; @@ -135,15 +131,7 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef @Autowired private ProjectGroupManager projectGroupManager; - /** - * @param ureq - * @param wControl - * @param course - * @param node - * @param groupMgr - */ - protected ProjectBrokerCourseEditorController(UserRequest ureq, WindowControl wControl, ICourse course, ProjectBrokerCourseNode node, - UserCourseEnvironment euce) { + protected ProjectBrokerCourseEditorController(UserRequest ureq, WindowControl wControl, ICourse course, ProjectBrokerCourseNode node) { super(ureq, wControl); this.node = node; @@ -164,15 +152,6 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef projectBrokerId = projectBroker.getKey(); projectBrokerManager.saveProjectBrokerId(projectBrokerId, cpm, node); } - - // Access - accessabilityVC = this.createVelocityContainer("edit_condition"); - // ProjectBroker precondition - projectBrokerConditionController = new ConditionEditController(ureq, getWindowControl(), euce, node.getConditionProjectBroker(), - AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), node)); - this.listenTo(projectBrokerConditionController); - accessabilityVC.put("projectBrokerCondition", projectBrokerConditionController.getInitialComponent()); - // Options with dates and custom-fields optionsFormVC = this.createVelocityContainer("optionsForm"); @@ -354,7 +333,6 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef @Override public void addTabs(TabbedPane theTabbedPane) { this.myTabbedPane = theTabbedPane; - myTabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), accessabilityVC); myTabbedPane.addTab(translate(PANE_TAB_OPTIONS), optionsFormVC); myTabbedPane.addTab(translate(PANE_TAB_ACCOUNT_MANAGEMENT), accountManagementFormVC); myTabbedPane.addTab(translate(PANE_TAB_CONF_MODULES), editModules); @@ -364,9 +342,6 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef myTabbedPane.setEnabled(dropboxTabPosition, (bool != null) ? bool.booleanValue() : true); } - /** - * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) - */ @Override protected void doDispose() { // diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerLearningPathNodeHandler.java new file mode 100644 index 00000000000..b89ba6b0822 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerLearningPathNodeHandler.java @@ -0,0 +1,80 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.projectbroker; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.course.learningpath.LearningPathConfigs; +import org.olat.course.learningpath.LearningPathEditConfigs; +import org.olat.course.learningpath.LearningPathNodeHandler; +import org.olat.course.learningpath.model.ModuleLearningPathConfigs; +import org.olat.course.learningpath.ui.LearningPathNodeConfigController; +import org.olat.course.nodes.CourseNode; +import org.olat.course.nodes.ProjectBrokerCourseNode; +import org.olat.repository.RepositoryEntry; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 24.02.2020<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +@Service +public class ProjectBrokerLearningPathNodeHandler implements LearningPathNodeHandler { + + private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder() + .enableNodeVisited() + .enableConfirmed() + .build(); + + @Override + public String acceptCourseNodeType() { + return ProjectBrokerCourseNode.TYPE; + } + + @Override + public boolean isSupported() { + return true; + } + + @Override + public LearningPathConfigs getConfigs(CourseNode courseNode) { + return new ModuleLearningPathConfigs(courseNode.getModuleConfiguration(), true); + } + + @Override + public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry, + CourseNode courseNode) { + return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode, EDIT_CONFIGS); + } + + @Override + public LearningPathEditConfigs getEditConfigs() { + return EDIT_CONFIGS; + } + + @Override + public void onMigrated(CourseNode courseNode) { + // + } + +} diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_content/edit_condition.html b/src/main/java/org/olat/course/nodes/projectbroker/_content/edit_condition.html deleted file mode 100644 index 6e7428817bd..00000000000 --- a/src/main/java/org/olat/course/nodes/projectbroker/_content/edit_condition.html +++ /dev/null @@ -1,12 +0,0 @@ -#if ($r.available("projectBrokerCondition")) -<fieldset class="clearfix"> - <legend>$r.contextHelpWithWrapper("General Configuration of Course Elements#_zugang") - $r.translate("projectbroker.condition.title")</legend> - $r.render("projectBrokerCondition") -</fieldset> -#end - -#if ( !($r.available("projectBrokerCondition")) ) - $r.translate("no.condition.available") -#end - diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_ar.properties index b40ec4320bf..bceed284f4c 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_ar.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_ar.properties @@ -175,9 +175,7 @@ mail.remove.candidate.subject=$projectTitle $\:projectbroker.themaSg \u0644\u064 mail.remove.participant.body=*** \u0647\u0630\u0647 \u0631\u0633\u0627\u0644\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u0629\u060C \u0645\u0646 \u0641\u0636\u0644\u0643 \u0644\u0627 \u062A\u0631\u062F \u0639\u0644\u064A\u0647\u0627 ***\r\n\r\n($firstnameProjectManager $lastnameProjectManager , \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \= $usernameProjectManager) \u0645\u0624\u0644\u0641 \u0627\u0644\u0645\u0648\u0636\u0648\u0639\r\n .$currentDate \u0641\u0649 $projectTitle $\:projectbroker.themaSg \u0642\u0627\u0645 \u0628\u062A\u0633\u062C\u064A\u0644 \u062E\u0631\u0648\u062C\u0643 \u0643\u0645\u0634\u0627\u0631\u0643 \u0645\u0646 mail.remove.participant.subject=$projectTitle \: $\:projectbroker.themaSg \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062E\u0631\u0648\u062C \u0644\u0644\u0645\u0634\u0627\u0631\u0643\u064A\u0646 \u0645\u0646 new.project.title=\u062C\u062F\u064A\u062F $\:projectbroker.themaSg -no.condition.available=\u0644\u0645 \u064A\u062A\u0645 \u0639\u0645\u0644 \u0623\u0649 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0644\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062C\u0632\u0626\u064A\u0629\u060C \u0648\u0644\u0630\u0644\u0643 \u0644\u0627 \u064A\u0645\u0643\u0646 \u0639\u0645\u0644 \u0623\u0649 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0644\u0644\u0648\u0635\u0648\u0644. no.folder.available=\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0631\u0628\u0639\u0627\u062A \u0625\u0641\u0644\u0627\u062A \u0623\u0648 \u0631\u062C\u0648\u0639 \u062A\u062D\u062A \u062A\u0635\u0631\u0641\u0643. -pane.tab.accessibility=\u0648\u0635\u0648\u0644 pane.tab.accountmanagement=\u0627\u0644\u0645\u0633\u0626\u0648\u0644 pane.tab.conf.dropbox=\u062D\u062A\u0649 \u062A\u0627\u0631\u064A\u062E pane.tab.conf.modules=\u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062C\u0632\u0626\u064A\u0629 diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties index 8f5fd389dc1..bfaa6555f16 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties @@ -90,7 +90,7 @@ detailsform.mail.notification.label=E-Mail-Benachrichtigung bei $\:projectbroker detailsform.max.candidates.label=Anzahl Bewerber limitieren? detailsform.max.members.label=Anzahl Pl\u00E4tze limitieren? detailsform.allow.deselection=Abmelden von Thema erlauben? -detailsform.allow.deselection.hint=(nach Ablauf des Einschreibedatum ist eine Abmeldung nicht mehr m\u00f6glich) +detailsform.allow.deselection.hint=(nach Ablauf des Einschreibedatum ist eine Abmeldung nicht mehr m\u00F6glich) detailsform.places.candidates.label=Anzahl Bewerber (belegt/total) detailsform.places.label=Anzahl Pl\u00E4tze (belegt/total) detailsform.places.of=von @@ -190,9 +190,7 @@ mail.remove.candidate.subject=Bewerbung f\u00FCr das Thema $projectTitle nicht b mail.remove.participant.body=*** Das ist eine automatisch generierte Nachricht. Bitte antworten Sie nicht auf diese Nachricht *** \n\nDer/die Themenverantwortliche $firstnameProjectManager $lastnameProjectManager (OLAT-Benutzername "$usernameProjectManager") hat Sie am $currentDate als Teilnehmer/in aus dem Thema "$projectTitle" ausgetragen. mail.remove.participant.subject=Austragung Teilnehmer f\u00FCr das Thema $projectTitle new.project.title=Neues $\:projectbroker.themaSg -no.condition.available=Es sind keine Teilbausteine konfiguriert. Daher kann der Zugang nicht konfiguriert werden. no.folder.available=Es stehen keine Abgabe- und R\u00FCckgabeordner zur Verf\u00FCgung. -pane.tab.accessibility=Zugang pane.tab.accountmanagement=Verantwortliche pane.tab.conf.dropbox=Abgabe pane.tab.conf.modules=Teilbausteine @@ -210,7 +208,6 @@ project.deleted.msg=Das Thema $\:projectbroker.themaSg `{0}` wurde gel\u00F6scht project.folder.not.participant=Die $\:tab.project.folder k\u00F6nnen nicht angezeigt werden, da Sie sich entweder nicht f\u00FCr das $\:projectbroker.themaSg eingeschrieben haben oder der Themenverantwortliche Sie noch nicht als definitiver Teilnehmer akzeptiert hat. project.member.groupdescription=Gruppe zum $\:projectbroker.themaSg {0}, automatisch erstellt. project.member.groupname=$\:projectbroker.themaSg {0} -projectbroker.condition.title=Allgemeiner Themenvergabe-Zugang projectgroup.candidates.message=Bitte tragen sie nach dem Akzeptieren der gew\u00FCnschten Bewerber die nicht ber\u00FCcksichtigten Kandidaten aus der Liste aus. projectgroup.candidates.title=Kandidaten projectgroup.member.title=Akzeptierte Teilnehmer diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_el.properties index f8bccb938f2..a1580dda5e3 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_el.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_el.properties @@ -147,9 +147,7 @@ mail.remove.candidate.subject=\u0397 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE mail.remove.participant.body=*** \u03A4\u03BF \u03C0\u03B1\u03C1\u03CC\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03B1\u03C5\u03C4\u03BF\u03BC\u03B1\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF \u03BC\u03AE\u03BD\u03C5\u03BC\u03B1. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03BC\u03B7\u03BD \u03B1\u03C0\u03B1\u03BD\u03C4\u03AE\u03C3\u03B5\u03C4\u03B5 ***\r\n\r\n\u039F \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1\u03C2 \u03B8\u03AD\u03BC\u03B1\u03C4\u03BF\u03C2 ($firstnameProjectManager $lastnameProjectManager, \u03BC\u03B5 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 $usernameProjectManager) \u03B1\u03C0\u03AD\u03C3\u03C5\u03C1\u03B5 \u03C4\u03B7\u03BD \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03BF\u03C7\u03AE \u03C3\u03B1\u03C2 \u03B1\u03C0\u03BF \u03C4\u03BF $\:projectbroker.themaSg $projectTitle \u03C3\u03C4\u03B9\u03C2 $currentDate . mail.remove.participant.subject=\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03B5\u03C7\u03CC\u03BD\u03C4\u03C9\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF $\:projectbroker.themaSg \: $projectTitle new.project.title=\u039D\u03AD\u03BF $\:projectbroker.themaSg -no.condition.available=\u0394\u03B5\u03BD \u03AD\u03C7\u03BF\u03C5\u03BD \u03B4\u03B9\u03B1\u03BC\u03BF\u03C1\u03C6\u03C9\u03B8\u03B5\u03AF \u03B5\u03C0\u03AF \u03BC\u03AD\u03C1\u03BF\u03C5\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1. \u03A3\u03C5\u03BD\u03B5\u03C0\u03CE\u03C2, \u03B4\u03B5 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03B4\u03B9\u03B1\u03BC\u03BF\u03C1\u03C6\u03CE\u03C3\u03B5\u03C4\u03B5 \u03BA\u03AC\u03C0\u03BF\u03B9\u03B1 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7. no.folder.available=\u0394\u03B5\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03BD \u03B8\u03C5\u03C1\u03AF\u03B4\u03B5\u03C2 \u03C0\u03B1\u03C1\u03AC\u03B4\u03BF\u03C3\u03B7\u03C2 \u03AE \u03B5\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE\u03C2 \u03C3\u03C4\u03B7 \u03B4\u03B9\u03AC\u03B8\u03B5\u03C3\u03AE \u03C3\u03B1\u03C2. -pane.tab.accessibility=\u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 pane.tab.accountmanagement=\u03A5\u03C0\u03B5\u03CD\u03B8\u03C5\u03BD\u03BF\u03B9 pane.tab.conf.dropbox=\u03A0\u03C1\u03BF\u03B8\u03B5\u03C3\u03BC\u03AF\u03B1 pane.tab.conf.modules=\u0395\u03C0\u03AF \u03BC\u03AD\u03C1\u03BF\u03C5\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 @@ -165,7 +163,6 @@ project.deleted.msg=$\:projectbroker.themaSg `{0}` \u03B4\u03B9\u03B5\u03B3\u03C project.folder.not.participant=\u039F $\:tab.project.folder \u03B1\u03C5\u03C4\u03CC\u03C2 \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03C5\u03BD\u03B1\u03C4\u03CC \u03BD\u03B1 \u03C0\u03C1\u03BF\u03B2\u03BB\u03B7\u03B8\u03B5\u03AF \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03CC\u03C4\u03B9 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF \u03C3\u03C4\u03BF $\:projectbroker.themaSg \u03AE \u03BF \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1\u03C2 \u03B8\u03AD\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B4\u03B5 \u03C3\u03B1\u03C2 \u03AD\u03C7\u03B5\u03B9 \u03B1\u03C0\u03BF\u03B4\u03B5\u03C7\u03C4\u03B5\u03AF \u03C9\u03C2 \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03AD\u03C7\u03C9\u03BD. project.member.groupdescription=\u0397 \u03BF\u03BC\u03AC\u03B4\u03B1 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03C4\u03BF $\:projectbroker.themaSg {0}, \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03B8\u03B7\u03BA\u03B5 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1. project.member.groupname=$\:projectbroker.themaSg {0} -projectbroker.condition.title=\u0393\u03B5\u03BD\u03B9\u03BA\u03AE \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 \u03C3\u03B5 \u03B1\u03BD\u03B1\u03B8\u03AD\u03C3\u03B5\u03B9\u03C2 \u03B8\u03B5\u03BC\u03AC\u03C4\u03C9\u03BD projectgroup.candidates.title=\u03A5\u03C0\u03BF\u03C8\u03AE\u03C6\u03B9\u03BF\u03B9 projectgroup.member.title=\u0391\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03BF\u03AF \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03AD\u03C7\u03BF\u03BD\u03C4\u03B5\u03C2 projectgroup.projectleader.title=\u03A3\u03C5\u03BD\u03C4\u03AC\u03BA\u03C4\u03B5\u03C2 \u03B8\u03AD\u03BC\u03B1\u03C4\u03BF\u03C2 diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_en.properties index 2294ddee60a..09d777b7742 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_en.properties @@ -190,9 +190,7 @@ mail.remove.candidate.subject=Registration for topic $projectTitle not accepted mail.remove.participant.body=*** This is an automated message. Please do not reply ***\r\n\r\nThe topic author $firstnameProjectManager $lastnameProjectManager (OLAT user name "$usernameProjectManager") has signed you out as participant from the topic "$projectTitle" on $currentDate mail.remove.participant.subject=Signing out of participants from topic $projectTitle new.project.title=New $\:projectbroker.themaSg -no.condition.available=No partial elements configured. Therefore you cannot configure any access. no.folder.available=There are no drop or return boxes at your disposal. -pane.tab.accessibility=Access pane.tab.accountmanagement=Persons in charge pane.tab.conf.dropbox=Due date pane.tab.conf.modules=Partial elements @@ -210,7 +208,6 @@ project.deleted.msg=$\:projectbroker.themaSg `{0}` deleted project.folder.not.participant=This $\:tab.project.folder cannot be displayed since you are not registered for this $\:projectbroker.themaSg or the topic author has not yet accepted you as participant. project.member.groupdescription=Group regarding the $\:projectbroker.themaSg {0} created automatically. project.member.groupname=$\:projectbroker.themaSg {0} -projectbroker.condition.title=General access to topic assignments projectgroup.candidates.message=Please delist those candidates that could not be accepted after selecting the designated ones. projectgroup.candidates.title=Candidates projectgroup.member.title=Participants accepted diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_fr.properties index 46885715d7b..1cb3984d709 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_fr.properties @@ -190,9 +190,7 @@ mail.remove.candidate.subject=Candidature pour le sujet $projectTitle non accept mail.remove.participant.body=*** Ceci est un message g\u00E9n\u00E9r\u00E9 automatiquement. Veuillez ne pas r\u00E9pondre \u00E0 ce message.***\r\n\r\nLe/s responsables de sujet $firstnameProjectManager $lastnameProjectManager (nom d'utililsateur OLAT "$usernameProjectManager") vous a/ont d\u00E9sinscrit comme participant au sujet "$projectTitle" le $currentDate. mail.remove.participant.subject=D\u00E9sinscription comme participant au sujet $projectTitle new.project.title=Nouveau $\:projectbroker.themaSg -no.condition.available=Il n'y a pas d'\u00E9l\u00E9ments partiels configur\u00E9s, donc l'acc\u00E8s ne peut pas \u00EAtre configur\u00E9. no.folder.available=Il n'y a pas de bo\u00EEte de d\u00E9pot ou de restitution. -pane.tab.accessibility=Acc\u00E8s pane.tab.accountmanagement=Responsables pane.tab.conf.dropbox=D\u00E9p\u00F4t pane.tab.conf.modules=El\u00E9ments partiels @@ -210,7 +208,6 @@ project.deleted.msg=Le sujet $\:projectbroker.themaSg `{0}` a \u00E9t\u00E9 effa project.folder.not.participant=Le $\:tab.project.folder ne peut pas \u00EAtre affich\u00E9 car vous ne vous \u00EAtes pas inscrits pour le $\:projectbroker.themaSg ou les responsable de sujet ne vous avez pas encore accept\u00E9 comme participant d\u00E9finitif. project.member.groupdescription=Groupe du $\:projectbroker.themaSg {0}, cr\u00E9\u00E9 automatiquement. project.member.groupname=$\:projectbroker.themaSg {0} -projectbroker.condition.title=Acc\u00E8s g\u00E9n\u00E9ral \u00E0 l'affectation des sujets projectgroup.candidates.message=Apr\u00E8s avoir accept\u00E9 les candidats d\u00E9sir\u00E9s, \u00E9liminez de la liste les candidats non accept\u00E9s, svp. projectgroup.candidates.title=Candidats projectgroup.member.title=Participants accept\u00E9s diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_it.properties index 78a48d3c1f8..330030cfaac 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_it.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_it.properties @@ -127,9 +127,7 @@ mail.remove.candidate.subject=Candidatura per il tema $projectTitle non accettat mail.remove.participant.body=*** Questo \u00E8 un messaggio generato automaticamente. Non risponda a questo messaggio, p.f. ***\r\n\r\nIl/i responsabile/i del tema $firstnameProjectManager $lastnameProjectManager (nome d'utente OLAT "$usernameProjectManager") l'ha didiscritta/o come partecipante dal tema "$projectTitle" il $currentDate. mail.remove.participant.subject=Disiscrizione come partecipante dal tema $projectTitle new.project.title=Novit\u00E0 $\:projectbroker.themaSg -no.condition.available=Non ci sono elementi parziali configurati, quindi l'accesso non pu\u00F2 venire configurato. no.folder.available=Nessuna cartella di consegna o di restituzione disponibile. -pane.tab.accessibility=Accesso pane.tab.accountmanagement=Responsabili pane.tab.conf.dropbox=Consegna pane.tab.conf.modules=Elementi parziali @@ -148,7 +146,6 @@ project.folder.not.participant=Le $\:tab.project.folder non possono essere visua project.member.groupdescription=Gruppo di $\:projectbroker.themaSg {0} creato automaticamente. project.member.groupname=$\:projectbroker.themaSg {0} projectbroker-optionsCustomfields.title=$\:projectbroker.themenboerse\: aggiungere dei campi addizionali -projectbroker.condition.title=Accesso generale all'assegnazione dei temi projectbroker.themaPl=temi projectbroker.themaSg=Tema projectbroker.themenboerse=Assegnazione dei temi diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_nl_NL.properties index c8dcc18fed5..27f80499899 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_nl_NL.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_nl_NL.properties @@ -181,9 +181,7 @@ mail.remove.candidate.subject=Registratie voor onderwerp $projectTitle niet geac mail.remove.participant.body=*** Dit is een automatisch bericht. Gelieve niet te antwoorden ***\r\n\r\nDe onderwerpsauteur $firstnameProjectManager $lastnameProjectManager (OLAT gebruikersnaam "$usernameProjectManager") heeft u uitgeschreven als cursist van het onderwerp "$projectTitle" op $currentDate mail.remove.participant.subject=Uitschrijven van cursisten van het onderwerp $projectTitle new.project.title=Nieuw $\:projectbroker.themaSg -no.condition.available=Geen deelelementen geconfigureerg. Hierdoor kunt u geen enkele toegang configureren. no.folder.available=Er staan geen drop of return boxes ter uw beschikking. -pane.tab.accessibility=Toegang pane.tab.accountmanagement=Verantwoordelijke personen pane.tab.conf.dropbox=Vervaldatum pane.tab.conf.modules=Deelelementen @@ -201,7 +199,6 @@ project.deleted.msg=$\:projectbroker.themaSg `{0}` gewist project.folder.not.participant=Deze $\:tab.project.folder kan niet getoond worden omdat u niet geregistreerd bent voor deze $\:projectbroker.themaSg of omdat de onderwerpsauteur u nog niet geaccepteerd heeft als cursist. project.member.groupdescription=Groep betreffende de $\:projectbroker.themaSg {0} is automatisch aangemaakt. project.member.groupname=$\:projectbroker.themaSg {0} -projectbroker.condition.title=Algemene toegang tot onderwerpsopdrachten projectgroup.candidates.message=Gelieve de kandidaten die niet geaccepteerd konden worden uit de lijst te verwijderen nadat u de kandidaten geselecteerd hebt. projectgroup.candidates.title=Kandidaten projectgroup.member.title=Geaccepteerde cursisten diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pl.properties index 4b6ba390b1d..67c353ac00d 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pl.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pl.properties @@ -122,9 +122,7 @@ mail.remove.candidate.subject=Rejestracja do $\:projectbroker.themaSg $projectTi mail.remove.participant.body=*** Ta wiadomo\u015B\u0107 zosta\u0142a wygenerowana automatycznie. Nie odpowiadaj na ni\u0105. ***\r\n\r\nAutor w\u0105tku ($firstnameProjectManager $lastnameProjectManager, nazwa u\u017Cytkownika \= $usernameProjectManager) wypisa\u0142 ci\u0119 z listy uczestnik\u00F3w w $\:projectbroker.themaSg $projectTitle dnia $currentDate. mail.remove.participant.subject=Wypisywanie uczestnik\u00F3w z $\:projectbroker.themaSg\: $projectTitle new.project.title=Nowy $\:projectbroker.themaSg -no.condition.available=Nie skonfigurowano element\u00F3w sk\u0142adowych, dlatego nie mo\u017Cesz ustawi\u0107 dost\u0119pu. no.folder.available=Brak folder\u00F3w danych wej\u015Bciowych i folder\u00F3w zwrotnych, przeznaczonych do twojej dyspozycji -pane.tab.accessibility=Dost\u0119p pane.tab.accountmanagement=Osoby odpowiedzialne pane.tab.conf.dropbox=Termin pane.tab.conf.modules=Elementy sk\u0142adowe diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pt_BR.properties index 3a5182142b1..130dd4c7cc3 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pt_BR.properties @@ -127,9 +127,7 @@ mail.remove.candidate.subject=Participantes mail.remove.participant.body=Status do t\u00F3pico mail.remove.participant.subject=Vagas new.project.title=$\:projectbroker.themaSg -no.condition.available=Nenhum autor de t\u00F3picos dispon\u00EDveis. no.folder.available=Administrar autores de t\u00F3pico -pane.tab.accessibility=Um t\u00F3pico com este t\u00EDtulo j\u00E1 existe. pane.tab.accountmanagement=Este t\u00EDtulo \u00E9 obrigat\u00F3rio pane.tab.conf.dropbox=Drop box pane.tab.conf.modules=Caixa de retorno @@ -148,7 +146,6 @@ project.folder.not.participant=Voc\u00EA quer apagar o grupo correspondente ao \ project.member.groupdescription=Excluir $\:projectbroker.themaSg project.member.groupname=Anexo projectbroker-optionsCustomfields.title=$\:form.options.customfield.legend -projectbroker.condition.title=Atribui\u00E7\u00F5es gerais de acesso ao t\u00F3pico projectbroker.themaPl=T\u00F3picos projectbroker.themaSg=T\u00F3pico projectbroker.themenboerse=Atribuir T\u00F3pico diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_zh_CN.properties index d683a32bf75..ef0114839d1 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_zh_CN.properties +++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_zh_CN.properties @@ -176,9 +176,7 @@ mail.remove.candidate.subject=\u672A\u63A5\u53D7$\:projectbroker.themaSg $projec mail.remove.participant.body=*** \u8FD9\u662F\u7531\u7CFB\u7EDF\u81EA\u52A8\u53D1\u9001\u7684\u6D88\u606F\uFF0C\u8BF7\u4E0D\u8981\u56DE\u590D ***\r\n\r\n\u4E3B\u9898\u7684\u4F5C\u8005($firstnameProjectManager $lastnameProjectManager, user name \= $usernameProjectManager)\u4E8E$currentDate\u5DF2\u7ECF\u5C06\u60A8\u8FD9\u4E2A\u53C2\u4E0E\u8005\u4ECE$\:projectbroker.themaSg $projectTitle \u6E05\u9000\u3002\r\n\r\nmatthew wu mail.remove.participant.subject=\u4ECE$\:projectbroker.themaSg \: $projectTitle\u4E2D\u5C06\u53C2\u4E0E\u8005\u6E05\u9000 new.project.title=\u65B0\u7684$\:projectbroker.themaSg -no.condition.available=\u6CA1\u6709\u914D\u7F6E\u90E8\u4EF6\u5143\u7D20\u3002\u56E0\u6B64\u60A8\u4E0D\u80FD\u8FDB\u884C\u4EFB\u4F55\u8BBF\u95EE\u3002 no.folder.available=\u6CA1\u6709\u4EFB\u610F\u7684\u4E0B\u62C9\u6846\u6216\u8FD4\u56DE\u6846 -pane.tab.accessibility=\u8BBF\u95EE pane.tab.accountmanagement=\u8D1F\u8D23\u4EBA pane.tab.conf.dropbox=\u7ED3\u675F\u65E5\u671F pane.tab.conf.modules=\u90E8\u4EF6\u5143\u7D20 @@ -196,7 +194,6 @@ project.deleted.msg=\u5DF2\u5220\u9664$\:projectbroker.themaSg `{0}` project.folder.not.participant=\u56E0\u4E3A\u60A8\u6CA1\u6709\u6CE8\u518C $\:projectbroker.themaSg \u6216\u8005\u6B21\u4E3B\u9898\u7684\u4F5C\u8005\u8FD8\u6CA1\u6709\u5C06\u60A8\u4F5C\u4E3A\u53C2\u4E0E\u8005\u63A5\u53D7\uFF0C\u6240\u4EE5$\:tab.project.folder \u8FD8\u4E0D\u80FD\u4E3A\u60A8\u663E\u793A\u3002 project.member.groupdescription=\u5DF2\u81EA\u52A8\u521B\u5EFA\u5173\u4E8E$\:projectbroker.themaSg {0}\u7684\u7FA4\u7EC4\u3002 project.member.groupname=$\:projectbroker.themaSg {0} -projectbroker.condition.title=\u4E00\u822C\u5E02\u573A\u51C6\u5165\u95EE\u9898 projectgroup.candidates.title=\u5019\u9009\u4EBA projectgroup.member.title=\u5DF2\u63A5\u53D7\u7684\u53C2\u4E0E\u8005 projectgroup.projectleader.title=\u4E3B\u9898\u7684\u4F5C\u8005 -- GitLab