diff --git a/NOTICE.TXT b/NOTICE.TXT index ee6bd8fe3adbe21c23026bd59253ab561cd64f0b..979fc0ee23b367a9daa5b49ee1e8c90124f7060b 100644 --- a/NOTICE.TXT +++ b/NOTICE.TXT @@ -129,6 +129,7 @@ This produce uses software based on the MIT License * html5shiv (MIT License / GPL2) [https://github.com/aFarkas/html5shiv] * respond.js (MIT License) [https://github.com/scottjehl/Respond] * Fuel UX (MIT License) [http://exacttarget.github.io/fuelux] +* mediaelementjs (MIT License) [http://mediaelementjs.com] ----------------------------------------------------------------------- This product uses software based on the BSD License diff --git a/src/main/java/org/olat/admin/landingpages/model/Rule.java b/src/main/java/org/olat/admin/landingpages/model/Rule.java index 53fbf2e4b48cb531d637b02773c6abfe5ccf13e6..63330fc3f86dfd8bf36750d6e5af2096fdfc8284 100644 --- a/src/main/java/org/olat/admin/landingpages/model/Rule.java +++ b/src/main/java/org/olat/admin/landingpages/model/Rule.java @@ -77,6 +77,8 @@ public class Rule { } public boolean match(UserSession userSession) { + if(userSession == null || userSession.getRoles() == null) return false; + boolean match = true; //match the role? diff --git a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java index af693b611f63c8b2eb7a88aa3ddf723f5e8ad877..784f7425cc664b5a004f570f5a28653353aa2a17 100644 --- a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java +++ b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java @@ -56,8 +56,6 @@ import org.olat.core.util.mail.ContactList; import org.olat.core.util.mail.ContactMessage; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.VFSContainer; -import org.olat.course.CourseFactory; -import org.olat.course.ICourse; import org.olat.course.assessment.EfficiencyStatement; import org.olat.course.assessment.EfficiencyStatementManager; import org.olat.course.assessment.IdentityAssessmentEditController; @@ -66,6 +64,8 @@ import org.olat.course.assessment.portfolio.EfficiencyStatementArtefact; import org.olat.course.certificate.Certificate; import org.olat.course.certificate.CertificatesManager; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupService; +import org.olat.group.model.SearchBusinessGroupParams; import org.olat.modules.co.ContactFormController; import org.olat.portfolio.EPArtefactHandler; import org.olat.portfolio.PortfolioModule; @@ -111,6 +111,8 @@ public class CertificateAndEfficiencyStatementController extends BasicController private PortfolioModule portfolioModule; @Autowired private CertificatesManager certificatesManager; + @Autowired + private BusinessGroupService businessGroupService; /** * The constructor shows the efficiency statement given as parameter for the current user @@ -152,8 +154,8 @@ public class CertificateAndEfficiencyStatementController extends BasicController this.businessGroup = businessGroup; if(businessGroup == null && courseRepo != null) { - ICourse course = CourseFactory.loadCourse(courseRepo.getOlatResource()); - List<BusinessGroup> groups = course.getCourseEnvironment().getCourseGroupManager().getParticipatingBusinessGroups(statementOwner); + SearchBusinessGroupParams params = new SearchBusinessGroupParams(statementOwner, false, true); + List<BusinessGroup> groups = businessGroupService.findBusinessGroups(params, courseRepo, 0, -1); if(groups.size() > 0) { businessGroup = groups.get(0); } diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java index 4316d59f0a13d5be79d09cb3717f4e4400f28905..e994980326935398a2fedf26b3f5a6b636a9b325 100644 --- a/src/main/java/org/olat/course/editor/EditorMainController.java +++ b/src/main/java/org/olat/course/editor/EditorMainController.java @@ -87,6 +87,7 @@ 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.VFSContainer; +import org.olat.course.CorruptedCourseException; import org.olat.course.CourseFactory; import org.olat.course.DisposedCourseRestartController; import org.olat.course.ICourse; @@ -338,10 +339,14 @@ public class EditorMainController extends MainLayoutBasicController implements G @Override public boolean requestForClose(UserRequest ureq) { boolean immediateClose = true; - ICourse course = CourseFactory.loadCourse(ores.getResourceableId()); - if(hasPublishableChanges(course)) { - doQuickPublish(ureq, course); - immediateClose = false; + try { + ICourse course = CourseFactory.loadCourse(ores.getResourceableId()); + if(hasPublishableChanges(course)) { + doQuickPublish(ureq, course); + immediateClose = false; + } + } catch (CorruptedCourseException e) { + logError("", e); } return immediateClose; } diff --git a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java index aabfa6a074c12af89e4fd06eff6b486d2df87e59..ea57e9b5a75005db7751ba0a90d33b7fabe1ff5c 100644 --- a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java +++ b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java @@ -91,6 +91,7 @@ import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback; import org.olat.core.util.vfs.callbacks.VFSSecurityCallback; import org.olat.core.util.xml.XStreamHelper; +import org.olat.course.CorruptedCourseException; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.nodes.CourseNode; @@ -133,6 +134,7 @@ import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; import org.olat.resource.references.ReferenceImpl; import org.olat.user.UserManager; +import org.springframework.beans.factory.annotation.Autowired; /** * Description: <br> @@ -254,24 +256,37 @@ public class QTIEditorMainController extends MainLayoutBasicController implement private StepsMainRunController importTableWizard; private InsertNodeController moveCtrl, copyCtrl, insertCtrl; - private final UserManager userManager; - private final QTIQPoolServiceProvider qtiQpoolServiceProvider; + @Autowired + private UserManager userManager; + @Autowired + private QTIResultManager qtiResultManager; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private QTIQPoolServiceProvider qtiQpoolServiceProvider; - public QTIEditorMainController(List<ReferenceImpl> referencees, UserRequest ureq, WindowControl wControl, FileResource fileResource) { + public QTIEditorMainController(UserRequest ureq, WindowControl wControl, RepositoryEntry qtiEntry, List<ReferenceImpl> referencees, FileResource fileResource) { super(ureq, wControl); - - qtiQpoolServiceProvider = (QTIQPoolServiceProvider)CoreSpringFactory.getBean("qtiPoolServiceProvider"); - userManager = CoreSpringFactory.getImpl(UserManager.class); for(Iterator<ReferenceImpl> iter = referencees.iterator(); iter.hasNext(); ) { ReferenceImpl ref = iter.next(); if ("CourseModule".equals(ref.getSource().getResourceableTypeName())) { - ICourse course = CourseFactory.loadCourse(ref.getSource().getResourceableId()); - CourseNode courseNode = course.getEditorTreeModel().getCourseNode(ref.getUserdata()); - String repositorySoftKey = (String) courseNode.getModuleConfiguration().get(IQEditController.CONFIG_KEY_REPOSITORY_SOFTKEY); - Long repKey = RepositoryManager.getInstance().lookupRepositoryEntryBySoftkey(repositorySoftKey, true).getKey(); - restrictedEdit = ((CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(course, null)) - || QTIResultManager.getInstance().countResults(course.getResourceableId(), courseNode.getIdent(), repKey) > 0) ? true : false; + try { + ICourse course = CourseFactory.loadCourse(ref.getSource().getResourceableId()); + CourseNode courseNode = course.getEditorTreeModel().getCourseNode(ref.getUserdata()); + String repositorySoftKey = (String) courseNode.getModuleConfiguration().get(IQEditController.CONFIG_KEY_REPOSITORY_SOFTKEY); + //check softly that the setting if ok + if(qtiEntry.getSoftkey().equals(repositorySoftKey)) { + restrictedEdit = ((CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(course, null)) + || qtiResultManager.countResults(course.getResourceableId(), courseNode.getIdent(), qtiEntry.getKey()) > 0) ? true : false; + } else { + logError("The course node soft key doesn't match the test/survey sotf key. Course resourceable id: " + + course.getResourceableId() + " (" + course.getCourseTitle() + ") course node: " + courseNode.getIdent() + " (" + courseNode.getShortTitle() + " )" + + " soft key of test/survey in course: " + repositorySoftKey + " test/survey soft key: " + qtiEntry.getSoftkey(), null); + } + } catch(CorruptedCourseException e) { + logError("", e); + } } if(restrictedEdit) { break; @@ -1198,10 +1213,17 @@ public class QTIEditorMainController extends MainLayoutBasicController implement for (Iterator<ReferenceImpl> iter = referencees.iterator(); iter.hasNext();) { ReferenceImpl element = iter.next(); if ("CourseModule".equals(element.getSource().getResourceableTypeName())) { - ICourse course = CourseFactory.loadCourse(element.getSource().getResourceableId()); - if(course == null) { + ICourse course = null; + try { + course = CourseFactory.loadCourse(element.getSource().getResourceableId()); + if(course == null) { + continue; + } + } catch(CorruptedCourseException ex) { + logError("", ex); continue; } + String courseTitle = course.getCourseTitle(); StringBuilder stakeHolders = new StringBuilder(); diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java index ba3b52ff81d1527c4cb4abd41750986dd0c0dc60..8bffea598ddcd81191fb3f8f779e6c48d99ef2d9 100644 --- a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java +++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java @@ -172,11 +172,8 @@ public class QTISurveyHandler extends QTIHandler { fr.overrideResourceableId(res.getResourceableId()); //check if we can edit in restricted mode -> only typos - ReferenceManager refM = ReferenceManager.getInstance(); - List<ReferenceImpl> referencees = refM.getReferencesTo(res); - //String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); - //boolean restrictedEdit = referencesSummary != null; - QTIEditorMainController editor = new QTIEditorMainController(referencees,ureq, wControl, fr); + List<ReferenceImpl> referencees = ReferenceManager.getInstance().getReferencesTo(res); + QTIEditorMainController editor = new QTIEditorMainController(ureq, wControl, re, referencees, fr); if (editor.isLockedSuccessfully()) { return editor; } else { diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java index a96e631b124eccd352320d11565dd9e6b0f0451a..f2ec2b249755c20a932e8e5a4110cf458849a789 100644 --- a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java +++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java @@ -173,11 +173,8 @@ public class QTITestHandler extends QTIHandler { fr.overrideResourceableId(res.getResourceableId()); //check if we can edit in restricted mode -> only typos - ReferenceManager refM = ReferenceManager.getInstance(); - List<ReferenceImpl> referencees = refM.getReferencesTo(res); - //String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); - //boolean restrictedEdit = referencesSummary != null; - QTIEditorMainController editor = new QTIEditorMainController(referencees,ureq, wControl, fr); + List<ReferenceImpl> referencees = ReferenceManager.getInstance().getReferencesTo(res); + QTIEditorMainController editor = new QTIEditorMainController(ureq, wControl, re, referencees, fr); if (editor.isLockedSuccessfully()) { return editor; } else { diff --git a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java index 586ccd980c3f86db427eb98db15240e4985713a2..c78a5a308eeee3e02dfd4e257d40dad5e10bb9e1 100644 --- a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java +++ b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java @@ -23,7 +23,6 @@ import java.util.Collections; import java.util.List; import org.olat.basesecurity.BaseSecurity; -import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.link.Link; @@ -40,6 +39,7 @@ import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.id.Identity; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; +import org.olat.course.CorruptedCourseException; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.assessment.EfficiencyStatement; @@ -49,6 +49,7 @@ import org.olat.course.assessment.UserEfficiencyStatement; import org.olat.course.certificate.ui.CertificateAndEfficiencyStatementController; import org.olat.modules.coach.model.EfficiencyStatementEntry; import org.olat.repository.RepositoryEntry; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -62,8 +63,8 @@ import org.olat.repository.RepositoryEntry; public class EfficiencyStatementDetailsController extends BasicController implements Activateable2 { private final VelocityContainer mainVC; - private final SegmentViewComponent segmentView; - private final Link efficiencyStatementLink, assessmentLink; + private SegmentViewComponent segmentView; + private Link assessmentLink, efficiencyStatementLink; private boolean hasChanged; private EfficiencyStatementEntry statementEntry; @@ -72,40 +73,41 @@ public class EfficiencyStatementDetailsController extends BasicController implem private final Identity assessedIdentity; - private final BaseSecurity securityManager; - private final EfficiencyStatementManager efficiencyStatementManager; + @Autowired + private BaseSecurity securityManager; + @Autowired + private EfficiencyStatementManager efficiencyStatementManager; public EfficiencyStatementDetailsController(UserRequest ureq, WindowControl wControl, EfficiencyStatementEntry statementEntry) { super(ureq, wControl); - - efficiencyStatementManager = EfficiencyStatementManager.getInstance(); - securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); mainVC = createVelocityContainer("efficiency_details"); this.statementEntry = statementEntry; - segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this); - efficiencyStatementLink = LinkFactory.createLink("details.statement", mainVC, this); - segmentView.addSegment(efficiencyStatementLink, true); - - assessmentLink = LinkFactory.createLink("details.assessment", mainVC, this); - segmentView.addSegment(assessmentLink, false); - RepositoryEntry entry = statementEntry.getCourse(); assessedIdentity = securityManager.loadIdentityByKey(statementEntry.getStudentKey()); statementCtrl = createEfficiencyStatementController(ureq); listenTo(statementCtrl); + mainVC.put("segmentCmp", statementCtrl.getInitialComponent()); - if(entry == null) { - assessmentLink.setEnabled(false); - } else { - ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); - assessmentCtrl = new IdentityAssessmentEditController(wControl, ureq, null, assessedIdentity, course, true, false); - listenTo(assessmentCtrl); + if(entry != null) { + try { + ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + assessmentCtrl = new IdentityAssessmentEditController(wControl, ureq, null, assessedIdentity, course, true, false); + listenTo(assessmentCtrl); + + segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this); + efficiencyStatementLink = LinkFactory.createLink("details.statement", mainVC, this); + segmentView.addSegment(efficiencyStatementLink, true); + + assessmentLink = LinkFactory.createLink("details.assessment", mainVC, this); + segmentView.addSegment(assessmentLink, false); + } catch(CorruptedCourseException e) { + logError("", e); + } } - mainVC.put("segmentCmp", statementCtrl.getInitialComponent()); putInitialPanel(mainVC); } @@ -117,6 +119,11 @@ public class EfficiencyStatementDetailsController extends BasicController implem protected void doDispose() { // } + + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + // + } @Override protected void event(UserRequest ureq, Controller source, Event event) { @@ -136,7 +143,7 @@ public class EfficiencyStatementDetailsController extends BasicController implem protected void event(UserRequest ureq, Component source, Event event) { if(source == segmentView && event instanceof SegmentViewEvent) { SegmentViewEvent sve = (SegmentViewEvent)event; - if(efficiencyStatementLink.getComponentName().equals(sve.getComponentName())) { + if(efficiencyStatementLink != null && efficiencyStatementLink.getComponentName().equals(sve.getComponentName())) { if(hasChanged) { //reload removeAsListenerAndDispose(statementCtrl); @@ -145,16 +152,11 @@ public class EfficiencyStatementDetailsController extends BasicController implem hasChanged = false; } mainVC.put("segmentCmp", statementCtrl.getInitialComponent()); - } else if(assessmentLink.getComponentName().equals(sve.getComponentName())) { + } else if(assessmentLink != null && assessmentLink.getComponentName().equals(sve.getComponentName())) { mainVC.put("segmentCmp", assessmentCtrl.getInitialComponent()); } } } - - @Override - public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - // - } private CertificateAndEfficiencyStatementController createEfficiencyStatementController(UserRequest ureq) { RepositoryEntry entry = statementEntry.getCourse(); diff --git a/src/main/java/org/olat/modules/coach/ui/_content/efficiency_details.html b/src/main/java/org/olat/modules/coach/ui/_content/efficiency_details.html index 9ff4dd926a6b594d85191c90dfd90c53aed8bf73..68aded09baafdff1e55944fdc6471d435e744d96 100644 --- a/src/main/java/org/olat/modules/coach/ui/_content/efficiency_details.html +++ b/src/main/java/org/olat/modules/coach/ui/_content/efficiency_details.html @@ -1,4 +1,6 @@ -$r.render("segments") +#if($r.available("segments")) + $r.render("segments") +#end #if($r.available("segmentCmp")) $r.render("segmentCmp") #end \ No newline at end of file diff --git a/src/main/webapp/static/movie/README b/src/main/webapp/static/movie/README new file mode 100644 index 0000000000000000000000000000000000000000..34aa7872f556f615dbb98befde3982a98bc09eef --- /dev/null +++ b/src/main/webapp/static/movie/README @@ -0,0 +1,6 @@ +The main library is MediaElement.js, there is a fallback the JWPlayer for some +rtmp streams. + +mediaelement-and-player.min.js is slightly modified. At the beginning of the +file, search for "audio/mp3","audio/m4a" and after add "audio/aac" to support +AAC files \ No newline at end of file