use of org.olat.course.nodes.STCourseNode in project OpenOLAT by OpenOLAT.
the class CoursesElementsTest method testCreateCoursePut.
@Test
public void testCreateCoursePut() throws IOException, URISyntaxException {
assertTrue(conn.login("administrator", "openolat"));
// create an empty course
URI uri = getCoursesUri().queryParam("shortTitle", "course3").queryParam("title", "course3 long name").build();
HttpPut method = conn.createPut(uri, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method);
assertEquals(200, response.getStatusLine().getStatusCode());
CourseVO course = conn.parse(response, CourseVO.class);
assertNotNull(course);
assertNotNull(course.getKey());
assertNotNull(course.getEditorRootNodeId());
try {
ICourse savedCourse = CourseFactory.loadCourse(course.getKey());
assertNotNull(savedCourse);
} catch (Exception e) {
assertTrue(false);
}
// create a learning group
GroupVO groupVo = new GroupVO();
groupVo.setName("hello");
groupVo.setDescription("hello description");
groupVo.setMinParticipants(new Integer(-1));
groupVo.setMaxParticipants(new Integer(-1));
URI newGroupUri = getCoursesUri().path(course.getKey().toString()).path("groups").build();
HttpPut newGrpMethod = conn.createPut(newGroupUri, MediaType.APPLICATION_JSON, true);
conn.addJsonEntity(newGrpMethod, groupVo);
HttpResponse newGrpCode = conn.execute(newGrpMethod);
assertEquals(200, newGrpCode.getStatusLine().getStatusCode());
GroupVO group = conn.parse(newGrpCode, GroupVO.class);
assertNotNull(group);
assertNotNull(group.getKey());
// create an structure node
URI newStructureUri = getElementsUri(course).path("structure").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "0").queryParam("shortTitle", "Structure-0").queryParam("longTitle", "Structure-long-0").queryParam("objectives", "Structure-objectives-0").build();
HttpPut newStructureMethod = conn.createPut(newStructureUri, MediaType.APPLICATION_JSON, true);
HttpResponse newStructureCode = conn.execute(newStructureMethod);
assertTrue(newStructureCode.getStatusLine().getStatusCode() == 200 || newStructureCode.getStatusLine().getStatusCode() == 201);
CourseNodeVO structureNode = conn.parse(newStructureCode, CourseNodeVO.class);
assertNotNull(structureNode);
assertNotNull(structureNode.getId());
assertEquals(structureNode.getShortTitle(), "Structure-0");
assertEquals(structureNode.getLongTitle(), "Structure-long-0");
assertEquals(structureNode.getLearningObjectives(), "Structure-objectives-0");
assertEquals(structureNode.getParentId(), course.getEditorRootNodeId());
// create single page
URL pageUrl = CoursesElementsTest.class.getResource("singlepage.html");
assertNotNull(pageUrl);
File page = new File(pageUrl.toURI());
URI newPageUri = getElementsUri(course).path("singlepage").build();
HttpPut newPageMethod = conn.createPut(newPageUri, MediaType.APPLICATION_JSON, true);
HttpEntity newPageEntity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE).addBinaryBody("file", page, ContentType.APPLICATION_OCTET_STREAM, page.getName()).addTextBody("filename", page.getName()).addTextBody("parentNodeId", course.getEditorRootNodeId()).addTextBody("position", "1").addTextBody("shortTitle", "Single-Page-0").addTextBody("longTitle", "Single-Page-long-0").addTextBody("objectives", "Single-Page-objectives-0").build();
newPageMethod.setEntity(newPageEntity);
HttpResponse newPageCode = conn.execute(newPageMethod);
assertTrue(newPageCode.getStatusLine().getStatusCode() == 200 || newPageCode.getStatusLine().getStatusCode() == 201);
CourseNodeVO pageNode = conn.parse(newPageCode, CourseNodeVO.class);
assertNotNull(pageNode);
assertNotNull(pageNode.getId());
assertEquals(pageNode.getShortTitle(), "Single-Page-0");
assertEquals(pageNode.getLongTitle(), "Single-Page-long-0");
assertEquals(pageNode.getLearningObjectives(), "Single-Page-objectives-0");
assertEquals(structureNode.getParentId(), course.getEditorRootNodeId());
// create a folder node
URI newFolderUri = getElementsUri(course).path("folder").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "2").queryParam("shortTitle", "Folder-0").queryParam("longTitle", "Folder-long-0").queryParam("objectives", "Folder-objectives-0").build();
HttpPut newFolderMethod = conn.createPut(newFolderUri, MediaType.APPLICATION_JSON, true);
HttpResponse newFolderCode = conn.execute(newFolderMethod);
assertTrue(newFolderCode.getStatusLine().getStatusCode() == 200 || newFolderCode.getStatusLine().getStatusCode() == 201);
CourseNodeVO folderNode = conn.parse(newFolderCode, CourseNodeVO.class);
assertNotNull(folderNode);
assertNotNull(folderNode.getId());
assertEquals(folderNode.getShortTitle(), "Folder-0");
assertEquals(folderNode.getLongTitle(), "Folder-long-0");
assertEquals(folderNode.getLearningObjectives(), "Folder-objectives-0");
assertEquals(folderNode.getParentId(), course.getEditorRootNodeId());
// create a forum node
URI newForumUri = getElementsUri(course).path("forum").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "3").queryParam("shortTitle", "Forum-0").queryParam("longTitle", "Forum-long-0").queryParam("objectives", "Forum-objectives-0").build();
HttpPut newForumMethod = conn.createPut(newForumUri, MediaType.APPLICATION_JSON, true);
HttpResponse newForumCode = conn.execute(newForumMethod);
assertTrue(newForumCode.getStatusLine().getStatusCode() == 200 || newForumCode.getStatusLine().getStatusCode() == 201);
CourseNodeVO forumNode = conn.parse(newForumCode, CourseNodeVO.class);
assertNotNull(forumNode);
assertNotNull(forumNode.getId());
assertEquals(forumNode.getShortTitle(), "Forum-0");
assertEquals(forumNode.getLongTitle(), "Forum-long-0");
assertEquals(forumNode.getLearningObjectives(), "Forum-objectives-0");
assertEquals(forumNode.getParentId(), course.getEditorRootNodeId());
// create a task node
URI newTaskUri = getElementsUri(course).path("task").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "4").queryParam("shortTitle", "Task-0").queryParam("longTitle", "Task-long-0").queryParam("objectives", "Task-objectives-0").queryParam("points", "25").queryParam("text", "A very difficult test").build();
HttpPut newTaskMethod = conn.createPut(newTaskUri, MediaType.APPLICATION_JSON, true);
HttpResponse newTaskCode = conn.execute(newTaskMethod);
assertTrue(newTaskCode.getStatusLine().getStatusCode() == 200 || newTaskCode.getStatusLine().getStatusCode() == 201);
CourseNodeVO taskNode = conn.parse(newTaskCode, CourseNodeVO.class);
assertNotNull(taskNode);
assertNotNull(taskNode.getId());
assertEquals(taskNode.getShortTitle(), "Task-0");
assertEquals(taskNode.getLongTitle(), "Task-long-0");
assertEquals(taskNode.getLearningObjectives(), "Task-objectives-0");
assertEquals(taskNode.getParentId(), course.getEditorRootNodeId());
// add task configuration
URI taskConfigUri = getElementsUri(course).path("task/" + taskNode.getId() + "/configuration").queryParam("enableAssignment", Boolean.FALSE).queryParam("enableScoring", Boolean.TRUE).queryParam("grantScoring", Boolean.TRUE).queryParam("scoreMin", new Float(1.5)).queryParam("scoreMax", 10).build();
HttpPut taskConfigMethod = conn.createPut(taskConfigUri, MediaType.APPLICATION_JSON, true);
HttpResponse taskConfigCode = conn.execute(taskConfigMethod);
assertTrue(taskConfigCode.getStatusLine().getStatusCode() == 200 || taskConfigCode.getStatusLine().getStatusCode() == 201);
EntityUtils.consume(taskConfigCode.getEntity());
HttpGet getTaskConfig = conn.createGet(taskConfigUri, MediaType.APPLICATION_JSON, true);
taskConfigCode = conn.execute(getTaskConfig);
assertTrue(taskConfigCode.getStatusLine().getStatusCode() == 200 || taskConfigCode.getStatusLine().getStatusCode() == 201);
TaskConfigVO taskConfig = conn.parse(taskConfigCode, TaskConfigVO.class);
assertNotNull(taskConfig);
// default is true
assertTrue(!taskConfig.getIsAssignmentEnabled());
assertTrue(taskConfig.getIsScoringEnabled() & taskConfig.getIsScoringGranted());
assertTrue(taskConfig.getMinScore().floatValue() == 1.5);
assertTrue(taskConfig.getMaxScore().floatValue() == 10);
// create an assessment node
URI newAssessmentUri = getElementsUri(course).path("assessment").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "5").queryParam("shortTitle", "Assessment-0").queryParam("longTitle", "Assessment-long-0").queryParam("objectives", "Assessment-objectives-0").build();
HttpPut newAssessmentMethod = conn.createPut(newAssessmentUri, MediaType.APPLICATION_JSON, true);
HttpResponse newAssessmentCode = conn.execute(newAssessmentMethod);
assertTrue(newAssessmentCode.getStatusLine().getStatusCode() == 200 || newAssessmentCode.getStatusLine().getStatusCode() == 201);
CourseNodeVO assessmentNode = conn.parse(newAssessmentCode, CourseNodeVO.class);
assertNotNull(assessmentNode);
assertNotNull(assessmentNode.getId());
assertEquals(assessmentNode.getShortTitle(), "Assessment-0");
assertEquals(assessmentNode.getLongTitle(), "Assessment-long-0");
assertEquals(assessmentNode.getLearningObjectives(), "Assessment-objectives-0");
assertEquals(assessmentNode.getParentId(), course.getEditorRootNodeId());
// create an contact node
URI newContactUri = getElementsUri(course).path("contact").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "6").queryParam("shortTitle", "Contact-0").queryParam("longTitle", "Contact-long-0").queryParam("objectives", "Contact-objectives-0").build();
HttpPut newContactMethod = conn.createPut(newContactUri, MediaType.APPLICATION_JSON, true);
HttpResponse newContactCode = conn.execute(newContactMethod);
assertEquals(200, newContactCode.getStatusLine().getStatusCode());
CourseNodeVO contactNode = conn.parse(newContactCode, CourseNodeVO.class);
assertNotNull(contactNode);
assertNotNull(contactNode.getId());
assertEquals(contactNode.getShortTitle(), "Contact-0");
assertEquals(contactNode.getLongTitle(), "Contact-long-0");
assertEquals(contactNode.getLearningObjectives(), "Contact-objectives-0");
assertEquals(contactNode.getParentId(), course.getEditorRootNodeId());
// try to create an invalid enrollment node
URI newENUri = getElementsUri(course).path("enrollment").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "7").queryParam("shortTitle", "Enrollment-0").queryParam("longTitle", "Enrollment-long-0").queryParam("objectives", "Enrollment-objectives-0").build();
HttpPut newENMethod = conn.createPut(newENUri, MediaType.APPLICATION_JSON, true);
HttpResponse newENCode = conn.execute(newENMethod);
assertEquals(406, newENCode.getStatusLine().getStatusCode());
EntityUtils.consume(newENCode.getEntity());
// create an enrollment node
newENUri = getElementsUri(course).path("enrollment").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "7").queryParam("shortTitle", "Enrollment-0").queryParam("longTitle", "Enrollment-long-0").queryParam("objectives", "Enrollment-objectives-0").queryParam("groups", group.getKey().toString()).queryParam("cancelEnabled", "true").build();
newENMethod = conn.createPut(newENUri, MediaType.APPLICATION_JSON, true);
newENCode = conn.execute(newENMethod);
assertEquals(200, newENCode.getStatusLine().getStatusCode());
CourseNodeVO enNode = conn.parse(newENCode, CourseNodeVO.class);
assertNotNull(enNode);
assertNotNull(enNode.getId());
assertEquals(enNode.getShortTitle(), "Enrollment-0");
assertEquals(enNode.getLongTitle(), "Enrollment-long-0");
assertEquals(enNode.getLearningObjectives(), "Enrollment-objectives-0");
assertEquals(enNode.getParentId(), course.getEditorRootNodeId());
// create a test node
URL qtiDemoUrl = CoursesElementsTest.class.getResource("qti-demo.zip");
assertNotNull(qtiDemoUrl);
File qtiFile = new File(qtiDemoUrl.toURI());
Assert.assertEquals(7518, qtiFile.length());
URI repoEntriesUri = UriBuilder.fromUri(getContextURI()).path("repo/entries").build();
HttpPut qtiRepoMethod = conn.createPut(repoEntriesUri, MediaType.APPLICATION_JSON, true);
HttpEntity entity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE).addBinaryBody("file", qtiFile, ContentType.APPLICATION_OCTET_STREAM, qtiFile.getName()).addTextBody("filename", "qti-demo.zip").addTextBody("resourcename", "QTI demo").addTextBody("displayname", "QTI demo").build();
qtiRepoMethod.setEntity(entity);
HttpResponse qtiRepoCode = conn.execute(qtiRepoMethod);
int qtiHttpCode = qtiRepoCode.getStatusLine().getStatusCode();
assertTrue(qtiHttpCode == 200 || qtiHttpCode == 201);
RepositoryEntryVO newTestVO = conn.parse(qtiRepoCode, RepositoryEntryVO.class);
assertNotNull(newTestVO);
Long key = newTestVO.getKey();
RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(key);
assertNotNull(re);
assertNotNull(re.getOlatResource());
assertEquals("QTI demo", re.getDisplayname());
URI newTestUri = getElementsUri(course).path("test").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "8").queryParam("shortTitle", "Test-0").queryParam("longTitle", "Test-long-0").queryParam("objectives", "Test-objectives-0").queryParam("testResourceableId", key).build();
HttpPut newTestMethod = conn.createPut(newTestUri, MediaType.APPLICATION_JSON, true);
HttpResponse newTestCode = conn.execute(newTestMethod);
assertTrue(newTestCode.getStatusLine().getStatusCode() == 200 || newTestCode.getStatusLine().getStatusCode() == 201);
CourseNodeVO testNode = conn.parse(newTestCode, CourseNodeVO.class);
assertNotNull(testNode);
assertNotNull(testNode.getId());
assertEquals(testNode.getShortTitle(), "Test-0");
assertEquals(testNode.getParentId(), course.getEditorRootNodeId());
// configure test node
URI testConfigUri = getElementsUri(course).path("test/" + testNode.getId() + "/configuration").queryParam("allowCancel", Boolean.TRUE).queryParam("allowNavigation", Boolean.TRUE).queryParam("allowSuspend", Boolean.TRUE).queryParam("numAttempts", 10).queryParam("sequencePresentation", AssessmentInstance.QMD_ENTRY_SEQUENCE_ITEM).queryParam("showNavigation", Boolean.TRUE).queryParam("showQuestionTitle", Boolean.TRUE).queryParam("showResultsAfterFinish", Boolean.TRUE).queryParam("showResultsDependendOnDate", Boolean.TRUE).queryParam("showResultsOnHomepage", key).queryParam("showScoreInfo", Boolean.TRUE).queryParam("showScoreProgress", Boolean.TRUE).queryParam("showSectionsOnly", Boolean.TRUE).queryParam("summaryPresentation", AssessmentInstance.QMD_ENTRY_SUMMARY_DETAILED).queryParam("startDate", // new Date(1280444400))
new Long(1280444400)).queryParam("endDate", // new Date(1293667200))
new Long(1293667200)).build();
HttpPut testConfigMethod = conn.createPut(testConfigUri, MediaType.APPLICATION_JSON, true);
HttpResponse testConfigCode = conn.execute(testConfigMethod);
assertTrue(testConfigCode.getStatusLine().getStatusCode() == 200 || testConfigCode.getStatusLine().getStatusCode() == 201);
EntityUtils.consume(testConfigCode.getEntity());
HttpGet getTestConfig = conn.createGet(testConfigUri, MediaType.APPLICATION_JSON, true);
testConfigCode = conn.execute(getTestConfig);
assertTrue(testConfigCode.getStatusLine().getStatusCode() == 200 || testConfigCode.getStatusLine().getStatusCode() == 201);
TestConfigVO testConfig = conn.parse(testConfigCode, TestConfigVO.class);
assertTrue(testConfig.getNumAttempts() == 10);
assertTrue(testConfig.getAllowCancel());
assertTrue(testConfig.getSummeryPresentation().equals(AssessmentInstance.QMD_ENTRY_SUMMARY_DETAILED));
// create a survey node
URL newSurveyUrl = CoursesElementsTest.class.getResource("questionnaire-demo.zip");
assertNotNull(newSurveyUrl);
File surveyFile = new File(newSurveyUrl.toURI());
URI repoEntriesUri2 = UriBuilder.fromUri(getContextURI()).path("repo").path("entries").build();
HttpPut surveyRepoMethod = conn.createPut(repoEntriesUri2, MediaType.APPLICATION_JSON, true);
HttpEntity surveyEntity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE).addBinaryBody("file", surveyFile, ContentType.APPLICATION_OCTET_STREAM, surveyFile.getName()).addTextBody("filename", "questionnaire-demo.zip").addTextBody("resourcename", "Questionnaire demo").addTextBody("displayname", "Questionnaire demo").build();
surveyRepoMethod.setEntity(surveyEntity);
HttpResponse surveyRepoCode = conn.execute(surveyRepoMethod);
assertTrue(surveyRepoCode.getStatusLine().getStatusCode() == 200 || surveyRepoCode.getStatusLine().getStatusCode() == 201);
RepositoryEntryVO newSurveyVO = conn.parse(surveyRepoCode, RepositoryEntryVO.class);
assertNotNull(newSurveyVO);
Long surveyKey = newSurveyVO.getKey();
RepositoryEntry surveyRE = RepositoryManager.getInstance().lookupRepositoryEntry(surveyKey);
assertNotNull(surveyRE);
assertNotNull(surveyRE.getOlatResource());
assertEquals("Questionnaire demo", surveyRE.getDisplayname());
URI newSurveyUri = getElementsUri(course).path("survey").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "9").queryParam("shortTitle", "Survey-0").queryParam("longTitle", "Survey-long-0").queryParam("objectives", "Survey-objectives-0").queryParam("surveyResourceableId", surveyKey).build();
HttpPut newSurveyMethod = conn.createPut(newSurveyUri, MediaType.APPLICATION_JSON, true);
HttpResponse newSurveyCode = conn.execute(newSurveyMethod);
assertTrue(newSurveyCode.getStatusLine().getStatusCode() == 200 || newSurveyCode.getStatusLine().getStatusCode() == 201);
CourseNodeVO surveyNode = conn.parse(newSurveyCode, CourseNodeVO.class);
assertNotNull(surveyNode);
assertNotNull(surveyNode.getId());
assertEquals(surveyNode.getShortTitle(), "Survey-0");
assertEquals(surveyNode.getParentId(), course.getEditorRootNodeId());
// configure survey node
URI surveykConfigUri = getElementsUri(course).path("survey/" + surveyNode.getId() + "/configuration").queryParam("allowCancel", Boolean.TRUE).queryParam("allowNavigation", Boolean.TRUE).queryParam("allowSuspend", Boolean.TRUE).queryParam("sequencePresentation", AssessmentInstance.QMD_ENTRY_SEQUENCE_ITEM).queryParam("showNavigation", Boolean.TRUE).queryParam("showQuestionTitle", Boolean.TRUE).queryParam("showSectionsOnly", Boolean.TRUE).build();
HttpPut surveyConfigMethod = conn.createPut(surveykConfigUri, MediaType.APPLICATION_JSON, true);
HttpResponse surveyConfigCode = conn.execute(surveyConfigMethod);
assertTrue(surveyConfigCode.getStatusLine().getStatusCode() == 200 || surveyConfigCode.getStatusLine().getStatusCode() == 201);
EntityUtils.consume(surveyConfigCode.getEntity());
HttpGet getSurveyConfig = conn.createGet(surveykConfigUri, MediaType.APPLICATION_JSON, true);
surveyConfigCode = conn.execute(getSurveyConfig);
assertTrue(surveyConfigCode.getStatusLine().getStatusCode() == 200 || surveyConfigCode.getStatusLine().getStatusCode() == 201);
SurveyConfigVO surveyConfig = conn.parse(surveyConfigCode, SurveyConfigVO.class);
assertNotNull(surveyConfig);
assertTrue(surveyConfig.getAllowCancel());
// create an external page node
URI newTUUri = getElementsUri(course).path("externalpage").queryParam("parentNodeId", course.getEditorRootNodeId()).queryParam("position", "10").queryParam("shortTitle", "ExternalPage-0").queryParam("longTitle", "ExternalPage-long-0").queryParam("objectives", "ExternalPage-objectives-0").queryParam("url", "http://www.olat.org").build();
HttpPut newTUMethod = conn.createPut(newTUUri, MediaType.APPLICATION_JSON, true);
HttpResponse newTUCode = conn.execute(newTUMethod);
assertEquals(200, newTUCode.getStatusLine().getStatusCode());
CourseNodeVO tuNode = conn.parse(newTUCode, CourseNodeVO.class);
assertNotNull(tuNode);
assertNotNull(tuNode.getId());
assertEquals(tuNode.getShortTitle(), "ExternalPage-0");
assertEquals(tuNode.getLongTitle(), "ExternalPage-long-0");
assertEquals(tuNode.getLearningObjectives(), "ExternalPage-objectives-0");
assertEquals(tuNode.getParentId(), course.getEditorRootNodeId());
// summary check
ICourse realCourse = CourseFactory.loadCourse(course.getKey());
TreeNode realRoot = realCourse.getEditorTreeModel().getRootNode();
assertEquals(11, realRoot.getChildCount());
// structure
CourseEditorTreeNode child = (CourseEditorTreeNode) realRoot.getChildAt(0);
CourseNode childNode = child.getCourseNode();
assertTrue(childNode instanceof STCourseNode);
// single page
child = (CourseEditorTreeNode) realRoot.getChildAt(1);
childNode = child.getCourseNode();
assertTrue(childNode instanceof SPCourseNode);
// folder
child = (CourseEditorTreeNode) realRoot.getChildAt(2);
childNode = child.getCourseNode();
assertTrue(childNode instanceof BCCourseNode);
// forum
child = (CourseEditorTreeNode) realRoot.getChildAt(3);
childNode = child.getCourseNode();
assertTrue(childNode instanceof FOCourseNode);
// task
child = (CourseEditorTreeNode) realRoot.getChildAt(4);
childNode = child.getCourseNode();
assertTrue(childNode instanceof TACourseNode);
// assessment
child = (CourseEditorTreeNode) realRoot.getChildAt(5);
childNode = child.getCourseNode();
assertTrue(childNode instanceof MSCourseNode);
// contact
child = (CourseEditorTreeNode) realRoot.getChildAt(6);
childNode = child.getCourseNode();
assertTrue(childNode instanceof COCourseNode);
// enrollment
child = (CourseEditorTreeNode) realRoot.getChildAt(7);
childNode = child.getCourseNode();
assertTrue(childNode instanceof ENCourseNode);
// test
child = (CourseEditorTreeNode) realRoot.getChildAt(8);
childNode = child.getCourseNode();
assertTrue(childNode instanceof IQTESTCourseNode);
// survey
child = (CourseEditorTreeNode) realRoot.getChildAt(9);
childNode = child.getCourseNode();
assertTrue(childNode instanceof IQSURVCourseNode);
// external page
child = (CourseEditorTreeNode) realRoot.getChildAt(10);
childNode = child.getCourseNode();
assertTrue(childNode instanceof TUCourseNode);
// attach file to task
child = (CourseEditorTreeNode) realRoot.getChildAt(4);
childNode = child.getCourseNode();
URI attachTaskFileUri = getElementsUri(course).path("task").path(childNode.getIdent()).path("file").queryParam("filename", "singlepage.html").build();
HttpPut taskFileMethod = conn.createPut(attachTaskFileUri, MediaType.APPLICATION_JSON, true);
conn.addMultipart(taskFileMethod, page.getName(), page);
HttpResponse taskFileCode = conn.execute(taskFileMethod);
assertEquals(200, taskFileCode.getStatusLine().getStatusCode());
String taskFolderPath = TACourseNode.getTaskFolderPathRelToFolderRoot(realCourse, childNode);
OlatRootFolderImpl taskFolder = new OlatRootFolderImpl(taskFolderPath, null);
VFSLeaf singleFile = (VFSLeaf) taskFolder.resolve("/" + "singlepage.html");
assertNotNull(singleFile);
}
use of org.olat.course.nodes.STCourseNode in project OpenOLAT by OpenOLAT.
the class OLATUpgrade_11_0_0 method hasAssessableSTCourseNode.
private List<STCourseNode> hasAssessableSTCourseNode(ICourse course) {
List<STCourseNode> assessableSTNodes = new ArrayList<>();
CourseNode rootNode = course.getRunStructure().getRootNode();
new TreeVisitor(new Visitor() {
@Override
public void visit(INode node) {
if (node instanceof STCourseNode) {
STCourseNode stNode = (STCourseNode) node;
ScoreCalculator calculator = stNode.getScoreCalculator();
if (StringHelper.containsNonWhitespace(calculator.getPassedExpression())) {
assessableSTNodes.add(stNode);
} else if (StringHelper.containsNonWhitespace(calculator.getScoreExpression())) {
assessableSTNodes.add(stNode);
}
}
}
}, rootNode, true).visitAll();
return assessableSTNodes;
}
use of org.olat.course.nodes.STCourseNode in project OpenOLAT by OpenOLAT.
the class OLATUpgrade_11_0_0 method compareCourseNodeAssessment.
private boolean compareCourseNodeAssessment(AssessmentEntryImpl entry, NewCachePersistingAssessmentManager assessmentManager, ICourse course, RepositoryEntry courseEntry) {
CourseNode node = course.getRunStructure().getNode(entry.getSubIdent());
if (node == null) {
CourseEditorTreeNode editorNode = course.getEditorTreeModel().getCourseEditorNodeById(entry.getSubIdent());
if (editorNode != null) {
node = editorNode.getCourseNode();
}
}
boolean allOk = true;
if (node instanceof AssessableCourseNode && !(node instanceof STCourseNode)) {
Identity assessedIdentity = entry.getIdentity();
Integer attempts = assessmentManager.getNodeAttempts(node, assessedIdentity);
if ((attempts == null && entry.getAttempts() == null) || (attempts != null && entry.getAttempts() != null && attempts.equals(entry.getAttempts()))) {
// ok
} else {
log.audit("ERROR number of attempts: " + attempts + " / " + entry.getAttempts() + getErrorAt(courseEntry, node));
allOk &= false;
}
Boolean passed = assessmentManager.getNodePassed(node, assessedIdentity);
if ((passed == null && entry.getPassed() == null) || (passed != null && entry.getPassed() != null && passed.equals(entry.getPassed()))) {
// ok
} else {
log.audit("ERROR passed: " + passed + " / " + entry.getPassed() + getErrorAt(courseEntry, node));
allOk &= false;
}
Boolean fullyAssessed = assessmentManager.getNodeFullyAssessed(node, assessedIdentity);
if ((fullyAssessed == null && entry.getFullyAssessed() == null) || (fullyAssessed != null && entry.getFullyAssessed() != null && fullyAssessed.equals(entry.getFullyAssessed()))) {
// ok
} else {
log.audit("ERROR fullyAssessed: " + fullyAssessed + " / " + entry.getFullyAssessed() + getErrorAt(courseEntry, node));
allOk &= false;
}
Float score = assessmentManager.getNodeScore(node, assessedIdentity);
if ((score == null && entry.getScore() == null) || (score != null && entry.getScore() != null && Math.abs(score.floatValue() - entry.getScore().floatValue()) < 0.00001f)) {
// ok
} else {
log.audit("ERROR score: " + score + " / " + entry.getScore() + getErrorAt(courseEntry, node));
allOk &= false;
}
}
return allOk;
}
use of org.olat.course.nodes.STCourseNode in project OpenOLAT by OpenOLAT.
the class ModifyCourseEvent method createCourse.
/**
* Creates an empty course with a single root node. The course is linked to
* the resourceable ores. The efficiency statment are enabled per default!
*
* @param ores
* @param shortTitle Short title of root node
* @param longTitle Long title of root node
* @param learningObjectives Learning objectives of root node
* @return An empty course with a single root node.
*/
public static ICourse createCourse(RepositoryEntry courseEntry, String shortTitle, String longTitle, String learningObjectives) {
OLATResource courseResource = courseEntry.getOlatResource();
PersistingCourseImpl newCourse = new PersistingCourseImpl(courseResource);
// Put new course in course cache
loadedCourses.put(newCourse.getResourceableId(), newCourse);
Structure initialStructure = new Structure();
CourseNode runRootNode = new STCourseNode();
runRootNode.setShortTitle(shortTitle);
runRootNode.setLongTitle(longTitle);
runRootNode.setLearningObjectives(learningObjectives);
initialStructure.setRootNode(runRootNode);
newCourse.setRunStructure(initialStructure);
newCourse.saveRunStructure();
CourseEditorTreeModel editorTreeModel = new CourseEditorTreeModel();
CourseEditorTreeNode editorRootNode = new CourseEditorTreeNode((CourseNode) ObjectCloner.deepCopy(runRootNode));
editorTreeModel.setRootNode(editorRootNode);
newCourse.setEditorTreeModel(editorTreeModel);
newCourse.saveEditorTreeModel();
// enable efficiency statement per default
CourseConfig courseConfig = newCourse.getCourseConfig();
courseConfig.setEfficencyStatementIsEnabled(true);
newCourse.setCourseConfig(courseConfig);
return newCourse;
}
use of org.olat.course.nodes.STCourseNode in project OpenOLAT by OpenOLAT.
the class ScoreAccountingHelper method createCourseResultsOverviewXMLTable.
/**
* The results from assessable nodes are written to one row per user into an excel-sheet. An
* assessable node will only appear if it is producing at least one of the
* following variables: score, passed, attempts, comments.
*
* @param identities The list of identities which results need to be archived.
* @param myNodes The assessable nodes to archive.
* @param course The course.
* @param locale The locale.
* @param bos The output stream (which will be closed at the end, if you use a zip stream don't forget to shield it).
*/
public static void createCourseResultsOverviewXMLTable(List<Identity> identities, List<AssessableCourseNode> myNodes, ICourse course, Locale locale, OutputStream bos) {
OpenXMLWorkbook workbook = new OpenXMLWorkbook(bos, 1);
OpenXMLWorksheet sheet = workbook.nextWorksheet();
sheet.setHeaderRows(2);
int headerColCnt = 0;
Translator t = Util.createPackageTranslator(ScoreAccountingArchiveController.class, locale);
String sequentialNumber = t.translate("column.header.seqnum");
String login = t.translate("column.header.businesspath");
// user properties are dynamic
String sc = t.translate("column.header.score");
String pa = t.translate("column.header.passed");
String co = t.translate("column.header.comment");
String cco = t.translate("column.header.coachcomment");
String at = t.translate("column.header.attempts");
String il = t.translate("column.header.initialLaunchDate");
String slm = t.translate("column.header.scoreLastModified");
String na = t.translate("column.field.notavailable");
String mi = t.translate("column.field.missing");
String yes = t.translate("column.field.yes");
String no = t.translate("column.field.no");
String submitted = t.translate("column.field.submitted");
Row headerRow1 = sheet.newRow();
headerRow1.addCell(headerColCnt++, sequentialNumber);
headerRow1.addCell(headerColCnt++, login);
// Initial launch date
headerRow1.addCell(headerColCnt++, il);
// get user property handlers for this export, translate using the fallback
// translator configured in the property handler
List<UserPropertyHandler> userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(ScoreAccountingHelper.class.getCanonicalName(), true);
t = UserManager.getInstance().getPropertyHandlerTranslator(t);
for (UserPropertyHandler propertyHandler : userPropertyHandlers) {
headerRow1.addCell(headerColCnt++, t.translate(propertyHandler.i18nColumnDescriptorLabelKey()));
}
int header1ColCnt = headerColCnt;
for (AssessableCourseNode acNode : myNodes) {
headerRow1.addCell(header1ColCnt++, acNode.getShortTitle());
header1ColCnt += acNode.getType().equals("ita") ? 1 : 0;
boolean scoreOk = acNode.hasScoreConfigured();
boolean passedOk = acNode.hasPassedConfigured();
boolean attemptsOk = acNode.hasAttemptsConfigured();
boolean commentOk = acNode.hasCommentConfigured();
if (scoreOk || passedOk || commentOk || attemptsOk) {
header1ColCnt += scoreOk ? 1 : 0;
header1ColCnt += passedOk ? 1 : 0;
header1ColCnt += attemptsOk ? 1 : 0;
// last modified
header1ColCnt++;
header1ColCnt += commentOk ? 1 : 0;
// coach comment
header1ColCnt++;
}
// column title
header1ColCnt--;
}
int header2ColCnt = headerColCnt;
Row headerRow2 = sheet.newRow();
for (AssessableCourseNode acNode : myNodes) {
if (acNode.getType().equals("ita")) {
headerRow2.addCell(header2ColCnt++, submitted);
}
boolean scoreOk = acNode.hasScoreConfigured();
boolean passedOk = acNode.hasPassedConfigured();
boolean attemptsOk = acNode.hasAttemptsConfigured();
boolean commentOk = acNode.hasCommentConfigured();
if (scoreOk || passedOk || commentOk || attemptsOk) {
if (scoreOk) {
headerRow2.addCell(header2ColCnt++, sc);
}
if (passedOk) {
headerRow2.addCell(header2ColCnt++, pa);
}
if (attemptsOk) {
headerRow2.addCell(header2ColCnt++, at);
}
// last modified
headerRow2.addCell(header2ColCnt++, slm);
if (commentOk) {
headerRow2.addCell(header2ColCnt++, co);
}
// coach comment
headerRow2.addCell(header2ColCnt++, cco);
}
}
// preload user properties cache
CourseEnvironment courseEnvironment = course.getCourseEnvironment();
int rowNumber = 0;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
UserCourseInformationsManager mgr = CoreSpringFactory.getImpl(UserCourseInformationsManager.class);
OLATResource courseResource = courseEnvironment.getCourseGroupManager().getCourseResource();
Map<Long, Date> firstTimes = mgr.getInitialLaunchDates(courseResource, identities);
for (Identity identity : identities) {
Row dataRow = sheet.newRow();
int dataColCnt = 0;
ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(identity);
String uname = BusinessControlFactory.getInstance().getAsURIString(Collections.singletonList(ce), false);
dataRow.addCell(dataColCnt++, ++rowNumber, null);
dataRow.addCell(dataColCnt++, uname, null);
if (firstTimes.containsKey(identity.getKey())) {
dataRow.addCell(dataColCnt++, firstTimes.get(identity.getKey()), workbook.getStyles().getDateStyle());
} else {
dataRow.addCell(dataColCnt++, mi);
}
// add dynamic user properties
for (UserPropertyHandler propertyHandler : userPropertyHandlers) {
String value = propertyHandler.getUserProperty(identity.getUser(), t.getLocale());
dataRow.addCell(dataColCnt++, (StringHelper.containsNonWhitespace(value) ? value : na));
}
// create a identenv with no roles, no attributes, no locale
IdentityEnvironment ienv = new IdentityEnvironment();
ienv.setIdentity(identity);
UserCourseEnvironment uce = new UserCourseEnvironmentImpl(ienv, course.getCourseEnvironment());
ScoreAccounting scoreAccount = uce.getScoreAccounting();
scoreAccount.evaluateAll();
AssessmentManager am = course.getCourseEnvironment().getAssessmentManager();
for (AssessableCourseNode acnode : myNodes) {
boolean scoreOk = acnode.hasScoreConfigured();
boolean passedOk = acnode.hasPassedConfigured();
boolean attemptsOk = acnode.hasAttemptsConfigured();
boolean commentOk = acnode.hasCommentConfigured();
if (acnode.getType().equals("ita")) {
String log = acnode.getUserLog(uce);
String date = null;
Date lastUploaded = null;
try {
log = log.toLowerCase();
log = log.substring(0, log.lastIndexOf("submit"));
log = log.substring(log.lastIndexOf("date:"));
date = log.split("\n")[0].substring(6);
lastUploaded = df.parse(date);
} catch (Exception e) {
//
}
if (lastUploaded != null) {
dataRow.addCell(dataColCnt++, lastUploaded, workbook.getStyles().getDateStyle());
} else {
// date == null
dataRow.addCell(dataColCnt++, mi);
}
}
if (scoreOk || passedOk || commentOk || attemptsOk) {
ScoreEvaluation se = scoreAccount.evalCourseNode(acnode);
if (scoreOk) {
Float score = se.getScore();
if (score != null) {
dataRow.addCell(dataColCnt++, AssessmentHelper.getRoundedScore(score), null);
} else {
// score == null
dataRow.addCell(dataColCnt++, mi);
}
}
if (passedOk) {
Boolean passed = se.getPassed();
if (passed != null) {
String yesno;
if (passed.booleanValue()) {
yesno = yes;
} else {
yesno = no;
}
dataRow.addCell(dataColCnt++, yesno);
} else {
// passed == null
dataRow.addCell(dataColCnt++, mi);
}
}
if (attemptsOk) {
Integer attempts = am.getNodeAttempts(acnode, identity);
int a = attempts == null ? 0 : attempts.intValue();
dataRow.addCell(dataColCnt++, a, null);
}
Date lastModified = am.getScoreLastModifiedDate(acnode, identity);
if (lastModified != null) {
dataRow.addCell(dataColCnt++, lastModified, workbook.getStyles().getDateStyle());
} else {
dataRow.addCell(dataColCnt++, mi);
}
if (commentOk) {
// Comments for user
String comment = am.getNodeComment(acnode, identity);
if (comment != null) {
dataRow.addCell(dataColCnt++, comment);
} else {
dataRow.addCell(dataColCnt++, mi);
}
}
// Always export comments for tutors
String coachComment = am.getNodeCoachComment(acnode, identity);
if (coachComment != null) {
dataRow.addCell(dataColCnt++, coachComment);
} else {
dataRow.addCell(dataColCnt++, mi);
}
}
}
}
// min. max. informations
boolean first = true;
for (AssessableCourseNode acnode : myNodes) {
if (!acnode.hasScoreConfigured()) {
// only show min/max/cut legend when score configured
continue;
}
if (first) {
sheet.newRow().addCell(0, "");
sheet.newRow().addCell(0, "");
sheet.newRow().addCell(0, t.translate("legend"));
sheet.newRow().addCell(0, "");
first = false;
}
String minVal;
String maxVal;
String cutVal;
if (acnode instanceof STCourseNode || !acnode.hasScoreConfigured()) {
minVal = maxVal = cutVal = "-";
} else {
minVal = acnode.getMinScoreConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getMinScoreConfiguration());
maxVal = acnode.getMaxScoreConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getMaxScoreConfiguration());
if (acnode.hasPassedConfigured()) {
cutVal = acnode.getCutValueConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getCutValueConfiguration());
} else {
cutVal = "-";
}
}
sheet.newRow().addCell(0, acnode.getShortTitle());
Row minRow = sheet.newRow();
minRow.addCell(2, "minValue");
minRow.addCell(3, minVal);
Row maxRow = sheet.newRow();
maxRow.addCell(2, "maxValue");
maxRow.addCell(3, maxVal);
Row cutRow = sheet.newRow();
cutRow.addCell(2, "cutValue");
cutRow.addCell(3, cutVal);
}
IOUtils.closeQuietly(workbook);
}
Aggregations