use of org.olat.core.gui.components.Component in project OpenOLAT by OpenOLAT.
the class QTI21ResultsExportMediaResource method createResultDetail.
private List<ResultDetail> createResultDetail(Identity identity, ZipOutputStream zout, String idDir) throws IOException {
List<ResultDetail> assessments = new ArrayList<>();
List<AssessmentTestSession> sessions = qtiService.getAssessmentTestSessions(entry, courseNode.getIdent(), identity);
for (AssessmentTestSession session : sessions) {
Long assessmentID = session.getKey();
String idPath = idDir + translator.translate("table.user.attempt") + (sessions.indexOf(session) + 1) + SEP;
createZipDirectory(zout, idPath);
// content of result table
ResultDetail resultDetail = new ResultDetail(assessmentID.toString(), assessmentDateFormat.format(session.getCreationDate()), displayDateFormat.format(new Date(session.getDuration())), session.getScore(), session.getManualScore(), createPassedIcons(session.getPassed() == null ? true : session.getPassed()), idPath.replace(idDir, "") + assessmentID + ".html");
assessments.add(resultDetail);
// WindowControlMocker needed because this is not a controller
WindowControl mockwControl = new WindowControlMocker();
FileResourceManager frm = FileResourceManager.getInstance();
RepositoryEntry testEntry = session.getTestEntry();
testEntries.add(testEntry);
File fUnzippedDirRoot = frm.unzipFileResource(testEntry.getOlatResource());
// add test repo key
String mapperUri = "../../../test" + testEntry.getKey() + "/";
String submissionMapperUri = ".";
String exportUri = "../" + translator.translate("table.user.attempt") + (sessions.indexOf(session) + 1);
Controller assessmentResultController = new AssessmentResultController(ureq, mockwControl, identity, false, session, fUnzippedDirRoot, mapperUri, submissionMapperUri, QTI21AssessmentResultsOptions.allOptions(), false, true, false, exportUri);
Component component = assessmentResultController.getInitialComponent();
String componentHTML = createResultHTML(component);
convertToZipEntry(zout, idPath + assessmentID + ".html", componentHTML);
File resultXML = qtiService.getAssessmentResultFile(session);
convertToZipEntry(zout, idPath + assessmentID + ".xml", resultXML);
File signatureXML = qtiService.getAssessmentResultSignature(session);
if (signatureXML != null) {
convertToZipEntry(zout, idPath + "assessmentResultSignature.xml", signatureXML);
}
File submissionDir = qtiService.getSubmissionDirectory(session);
String baseDir = idPath + "submissions";
ZipUtil.addDirectoryToZip(submissionDir.toPath(), baseDir, zout);
}
return assessments;
}
use of org.olat.core.gui.components.Component in project OpenOLAT by OpenOLAT.
the class AssessmentTestComponentRenderer method renderTestItem.
private void renderTestItem(AssessmentRenderer renderer, StringOutput sb, AssessmentTestComponent component, TestPlanNodeKey itemRefKey, URLBuilder ubu, Translator translator, RenderingRequest options) {
final TestSessionController testSessionController = component.getTestSessionController();
final TestSessionState testSessionState = testSessionController.getTestSessionState();
String key = itemRefKey.toString();
/* We finally do the transform on the _item_ (NB!) */
sb.append("<div class='qtiworks o_assessmentitem o_assessmenttest'>");
// test part feedback 'during'
// test feedback 'during'
TestPlanNode itemRefNode = testSessionState.getTestPlan().getNode(itemRefKey);
final EffectiveItemSessionControl effectiveItemSessionControl = itemRefNode.getEffectiveItemSessionControl();
final boolean allowComments = effectiveItemSessionControl.isAllowComment() && component.isPersonalNotes();
renderer.setCandidateCommentAllowed(allowComments);
// write section rubric
renderSectionRubrics(renderer, sb, component, itemRefNode, ubu, translator);
// test part -> section -> item
renderTestItemBody(renderer, sb, component, itemRefNode, ubu, translator, options);
// controls
sb.append("<div class='o_button_group o_assessmentitem_controls'>");
// submit button
final ItemSessionState itemSessionState = component.getItemSessionState(itemRefNode.getKey());
if (component.isItemSessionOpen(itemSessionState, options.isSolutionMode())) {
Component submit = component.getQtiItem().getSubmitButton().getComponent();
submit.getHTMLRendererSingleton().render(renderer.getRenderer(), sb, submit, ubu, translator, new RenderResult(), null);
}
// advanceTestItemAllowed /* && testSessionState.getCurrentItemKey() != null && testSessionController.mayAdvanceItemLinear() */
if (options.isAdvanceTestItemAllowed()) {
// TODO need to find if there is a next question
String title = translator.translate("assessment.test.nextQuestion");
renderControl(sb, component, title, false, "o_sel_next_question", new NameValuePair("cid", Event.finishItem.name()));
}
// nextItem
if (options.isNextItemAllowed() && testSessionController.hasFollowingNonLinearItem()) {
String title = translator.translate("assessment.test.nextQuestion");
renderControl(sb, component, title, false, "o_sel_next_question", new NameValuePair("cid", Event.nextItem.name()));
}
// testPartNavigationAllowed"
if (options.isTestPartNavigationAllowed() && component.isRenderNavigation()) {
String title = translator.translate("assessment.test.questionMenu");
renderControl(sb, component, title, false, "o_sel_question_menu", new NameValuePair("cid", Event.testPartNavigation.name()));
}
// endTestPartAllowed
if (options.isEndTestPartAllowed()) {
String title = component.hasMultipleTestParts() ? translator.translate("assessment.test.end.testPart") : translator.translate("assessment.test.end.test");
renderControl(sb, component, title, false, "o_sel_end_testpart", new NameValuePair("cid", Event.endTestPart.name()));
}
// reviewMode
if (options.isReviewMode()) {
String title = translator.translate("assessment.test.backToTestFeedback");
renderControl(sb, component, title, false, "o_sel_back_test_feedback", new NameValuePair("cid", Event.reviewTestPart.name()));
}
// <xsl:variable name="provideItemSolutionButton" as="xs:boolean" select="$reviewMode and $showSolution and not($solutionMode)"/>
if (options.isReviewMode() && effectiveItemSessionControl.isShowSolution() && !options.isSolutionMode()) {
String title = translator.translate("assessment.solution.show");
renderControl(sb, component, title, false, "o_sel_show_solution", new NameValuePair("cid", Event.itemSolution.name()), new NameValuePair("item", key));
}
if (options.isReviewMode() && options.isSolutionMode()) {
String title = translator.translate("assessment.solution.hide");
renderControl(sb, component, title, false, "o_sel_solution_hide", new NameValuePair("cid", Event.reviewItem.name()), new NameValuePair("item", key));
}
// end controls
sb.append("</div>");
// end assessmentItem
sb.append("</div>");
}
use of org.olat.core.gui.components.Component in project OpenOLAT by OpenOLAT.
the class EPMultipleMapController method initOrUpdateMaps.
/**
*/
private void initOrUpdateMaps(UserRequest ureq) {
if (isLogDebugEnabled()) {
start = System.currentTimeMillis();
logDebug("start loading map overview at : ", String.valueOf(start));
}
List<PortfolioStructure> allUsersStruct = getUsersStructsToDisplay();
userMaps = new ArrayList<PortfolioStructureMap>();
if (allUsersStruct.isEmpty()) {
vC.contextPut("noMaps", true);
return;
} else
vC.contextRemove("noMaps");
// remove forward link (maybe it's not needed (last page) )
if (forwardLink != null)
vC.remove(forwardLink);
// now add paging-components if necessary and wanted
int elementCount = ePFMgr.countStructureElementsFromOthers(getIdentity(), mapOwner, ElementType.DEFAULT_MAP);
if (pagingAvailable && elementCount > ITEMS_PER_PAGE) {
vC.contextPut("showPaging", true);
int additionalPage = ((elementCount % ITEMS_PER_PAGE) > 0) ? 1 : 0;
int pageCount = (elementCount / ITEMS_PER_PAGE) + additionalPage;
List<Component> pagingLinks = new ArrayList<Component>();
for (int i = 1; i < pageCount + 1; i++) {
Link pageLink = LinkFactory.createCustomLink(PAGING_LINK_PREFIX + i, "switchPage", String.valueOf(i), Link.NONTRANSLATED, vC, this);
pageLink.setUserObject(new Integer(i));
pagingLinks.add(pageLink);
if (i == currentPageNum) {
pageLink.setEnabled(false);
}
}
vC.contextPut("pageLinks", pagingLinks);
if (currentPageNum < pageCount) {
forwardLink = LinkFactory.createCustomLink("forwardLink", "pagingFWD", "table.forward", Link.LINK, vC, this);
forwardLink.setIconRightCSS("o_icon o_icon_next_page");
}
}
// now display the maps
List<String> artAmount = new ArrayList<String>(userMaps.size());
List<Integer> childAmount = new ArrayList<Integer>(userMaps.size());
List<String> mapStyles = new ArrayList<String>(userMaps.size());
List<Date> deadLines = new ArrayList<Date>(userMaps.size());
List<String> restriStats = new ArrayList<String>(userMaps.size());
List<String> owners = new ArrayList<String>(userMaps.size());
List<String> amounts = new ArrayList<String>(userMaps.size());
int i = 1;
for (PortfolioStructure portfolioStructure : allUsersStruct) {
if (portfolioStructure.getRoot() == null) {
// only show maps
PortfolioStructureMap map = (PortfolioStructureMap) portfolioStructure;
EPSecurityCallback secCallback = EPSecurityCallbackFactory.getSecurityCallback(ureq, map, ePFMgr);
userMaps.add(map);
Link vLink = LinkFactory.createCustomLink(VIEW_LINK_PREFIX + i, "viewMap" + map.getResourceableId(), "view.map", Link.LINK, vC, this);
vLink.setUserObject(map);
vLink.setElementCssClass("o_sel_ep_open_map");
vLink.setIconRightCSS("o_icon o_icon-fw o_icon_start");
// can always try to delete your own map, but exercise only if the course was deleted
// remove as update could require hiding it
vC.remove(vC.getComponent(DELETE_LINK_PREFIX + i));
// can always try to delete your own map, but exercise only if the course was deleted
final boolean myMaps = (option.equals(EPMapRunViewOption.MY_DEFAULTS_MAPS) || option.equals(EPMapRunViewOption.MY_EXERCISES_MAPS));
boolean addDeleteLink = myMaps;
if ((map instanceof EPStructuredMap) && (((EPStructuredMap) map).getReturnDate() != null)) {
// it's a portfolio-task that was already handed in, so do not display delete-link
addDeleteLink = false;
}
if (addDeleteLink) {
final Link dLink = LinkFactory.createCustomLink(DELETE_LINK_PREFIX + i, "delMap" + map.getResourceableId(), "delete.map", Link.LINK, vC, this);
dLink.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item");
dLink.setUserObject(map);
}
Link cLink = LinkFactory.createCustomLink(COPY_LINK_PREFIX + i, "copyMap" + map.getResourceableId(), "copy.map", Link.LINK, vC, this);
cLink.setIconLeftCSS("o_icon o_icon_copy");
cLink.setUserObject(map);
// its not allowed to copy maps from a portfolio-task
if (map instanceof EPStructuredMap) {
cLink.setVisible(false);
}
// remove as update could require hiding it
vC.remove(vC.getComponent(SHARE_LINK_PREFIX + i));
if (myMaps && secCallback.canShareMap()) {
Link shareLink = LinkFactory.createCustomLink(SHARE_LINK_PREFIX + i, "shareMap" + map.getResourceableId(), "map.share", Link.LINK, vC, this);
shareLink.setIconLeftCSS("o_icon o_icon-fw o_icon_share");
shareLink.setUserObject(map);
boolean shared = ePFMgr.isMapShared(map);
if (shared || (map instanceof EPStructuredMap && ((EPStructuredMap) map).getTargetResource() != null)) {
shareLink.setCustomDisplayText(translate("map.share.shared"));
}
}
if (isLogDebugEnabled()) {
logDebug(" in loop : got share state at: ", String.valueOf(System.currentTimeMillis()));
}
// get deadline + link to course
if (map instanceof EPStructuredMap) {
EPStructuredMap structMap = (EPStructuredMap) map;
Date deadLine = structMap.getDeadLine();
deadLines.add(deadLine);
EPTargetResource resource = structMap.getTargetResource();
RepositoryEntry repoEntry = RepositoryManager.getInstance().lookupRepositoryEntry(resource.getOLATResourceable(), false);
if (repoEntry != null) {
vC.contextPut("courseName" + i, StringHelper.escapeHtml(repoEntry.getDisplayname()));
String url = Settings.getServerContextPathURI();
url += "/url/RepositoryEntry/" + repoEntry.getKey() + "/CourseNode/" + resource.getSubPath();
vC.contextPut("courseLink" + i, url);
}
if (isLogDebugEnabled()) {
logDebug(" in loop : looked up course at : ", String.valueOf(System.currentTimeMillis()));
}
// get some stats about the restrictions if available
String[] stats = ePFMgr.getRestrictionStatisticsOfMap(structMap);
int toCollect = 0;
if (stats != null) {
try {
toCollect = Integer.parseInt(stats[1]) - Integer.parseInt(stats[0]);
} catch (Exception e) {
// do nothing
toCollect = 0;
}
}
if (toCollect != 0) {
restriStats.add(String.valueOf(toCollect));
} else {
restriStats.add(null);
}
if (isLogDebugEnabled()) {
logDebug(" in loop : calculated restriction statistics at : ", String.valueOf(System.currentTimeMillis()));
}
} else {
deadLines.add(null);
restriStats.add(null);
}
// show owner on shared maps
if (!secCallback.isOwner()) {
owners.add(ePFMgr.getAllOwnersAsString(map));
} else
owners.add(null);
String artCount = String.valueOf(ePFMgr.countArtefactsInMap(map));
artAmount.add(artCount);
Integer childs = ePFMgr.countStructureChildren(map);
childAmount.add(childs);
amounts.add(translate("map.contains", new String[] { childs.toString(), artCount }));
mapStyles.add(ePFMgr.getValidStyleName(map));
if (isLogDebugEnabled()) {
logDebug(" in loop : got map details (artefact-amount, child-struct-amount, style) at : ", String.valueOf(System.currentTimeMillis()));
}
i++;
}
}
vC.contextPut("owners", owners);
vC.contextPut("deadLines", deadLines);
vC.contextPut("restriStats", restriStats);
vC.contextPut("mapStyles", mapStyles);
vC.contextPut("childAmount", childAmount);
vC.contextPut("artefactAmount", artAmount);
vC.contextPut("amounts", amounts);
vC.contextPut("userMaps", userMaps);
if (isLogDebugEnabled()) {
long now = System.currentTimeMillis();
logDebug("finished processing all maps at : ", String.valueOf(now));
logDebug("Total processing time for " + (i - 1) + " maps was : ", String.valueOf(now - start));
}
}
use of org.olat.core.gui.components.Component in project OpenOLAT by OpenOLAT.
the class EPMultipleArtefactSmallReadOnlyPreviewController method init.
private void init(UserRequest ureq) {
if (artefactCtrls != null)
disposeArtefactControllers();
if (optionLinkCtrls != null)
disposeOptionLinkControllers();
optionLinkCtrls = new ArrayList<Controller>();
artefactCtrls = new ArrayList<Controller>();
List<List<Panel>> artefactCtrlCompLines = new ArrayList<List<Panel>>();
List<Panel> artefactCtrlCompLine = new ArrayList<Panel>();
int i = 1;
for (AbstractArtefact artefact : artefacts) {
EPArtefactHandler<?> artHandler = portfolioModule.getArtefactHandler(artefact.getResourceableTypeName());
Controller artCtrl;
// check for special art-display:
boolean special = artHandler.isProvidingSpecialMapViewController();
if (special) {
artCtrl = artHandler.getSpecialMapViewController(ureq, getWindowControl(), artefact);
if (artCtrl != null) {
// add the optionsLink to the artefact
EPArtefactViewOptionsLinkController optionsLinkCtrl = new EPArtefactViewOptionsLinkController(ureq, getWindowControl(), artefact, secCallback, struct);
vC.put("optionsLink" + i, optionsLinkCtrl.getInitialComponent());
listenTo(optionsLinkCtrl);
optionLinkCtrls.add(optionsLinkCtrl);
}
} else {
artCtrl = new EPArtefactViewReadOnlyController(ureq, getWindowControl(), artefact, struct, secCallback, true);
}
if (artCtrl != null) {
artefactCtrls.add(artCtrl);
Component artefactCtrlComponent = artCtrl.getInitialComponent();
listenTo(artCtrl);
Panel namedPanel = new Panel("artCtrl" + i);
namedPanel.setContent(artefactCtrlComponent);
if (special) {
if (!artefactCtrlCompLine.isEmpty()) {
artefactCtrlCompLines.add(artefactCtrlCompLine);
}
artefactCtrlCompLines.add(Collections.singletonList(namedPanel));
artefactCtrlCompLine = new ArrayList<Panel>();
} else {
if (artefactCtrlCompLine.size() == 3) {
if (!artefactCtrlCompLine.isEmpty()) {
artefactCtrlCompLines.add(artefactCtrlCompLine);
}
artefactCtrlCompLine = new ArrayList<Panel>();
}
artefactCtrlCompLine.add(namedPanel);
}
vC.put("artCtrl" + i, namedPanel);
if (special) {
// need a flag in a lopp for the velociy template
vC.put("specialartCtrl" + i, artefactCtrlComponent);
}
i++;
}
}
if (!artefactCtrlCompLine.isEmpty()) {
artefactCtrlCompLines.add(artefactCtrlCompLine);
}
vC.contextPut("artefactCtrlCompLines", artefactCtrlCompLines);
}
use of org.olat.core.gui.components.Component in project openolat by klemens.
the class GenericMainController method init.
/**
* use after optional addChildNodeToAppend() or addChildNodeToPrepend() calls
* to initialize MainController and set Panel
*
* @param ureq
*/
public void init(UserRequest ureq) {
olatMenuTree = new MenuTree("olatMenuTree");
TreeModel tm = buildTreeModel(ureq);
olatMenuTree.setTreeModel(tm);
content = new Panel("content");
TreeNode firstNode = tm.getRootNode();
TreeNode nodeToSelect = getLastDelegate(firstNode);
olatMenuTree.setSelectedNodeId(nodeToSelect.getIdent());
olatMenuTree.addListener(this);
// default is to not display the root element and to let user open/close sub elements
olatMenuTree.setRootVisible(false);
olatMenuTree.setExpandSelectedNode(false);
Object uobject = nodeToSelect.getUserObject();
contentCtr = getContentCtr(uobject, ureq);
// auto dispose later
listenTo(contentCtr);
Component resComp = contentCtr.getInitialComponent();
content.setContent(resComp);
columnLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), olatMenuTree, content, className);
// auto dispose later
listenTo(columnLayoutCtr);
// create the stack
stackVC = new BreadcrumbedStackedPanel("genericStack", getTranslator(), this);
stackVC.pushController("content", columnLayoutCtr);
putInitialPanel(stackVC);
}
Aggregations