diff --git a/src/main/java/org/olat/ims/qti21/ui/report/QuestionOriginMediaResource.java b/src/main/java/org/olat/ims/qti21/ui/report/QuestionOriginMediaResource.java index 0fe31892267a6cd976a0dfa044118f20c184a431..d1b61cbc33ccfdd37716a059e6774e11a0c440bf 100644 --- a/src/main/java/org/olat/ims/qti21/ui/report/QuestionOriginMediaResource.java +++ b/src/main/java/org/olat/ims/qti21/ui/report/QuestionOriginMediaResource.java @@ -31,6 +31,10 @@ import org.apache.logging.log4j.Logger; import org.olat.basesecurity.GroupRoles; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DB; +import org.olat.core.commons.services.license.License; +import org.olat.core.commons.services.license.LicenseModule; +import org.olat.core.commons.services.license.LicenseService; +import org.olat.core.commons.services.license.LicenseType; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.logging.Tracing; @@ -47,6 +51,7 @@ import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder; import org.olat.imscp.xml.manifest.ResourceType; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; +import org.olat.modules.qpool.manager.QuestionPoolLicenseHandler; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryRelationType; import org.olat.repository.RepositoryManager; @@ -77,6 +82,7 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { private static final Logger log = Tracing.createLoggerFor(QuestionOriginMediaResource.class); + private boolean licenseEnabled; private final Translator translator; private final List<RepositoryEntry> testEntries; private final ConcurrentMap<RepositoryEntry, TestHolder> holdersMap = new ConcurrentHashMap<>(); @@ -88,17 +94,24 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { @Autowired private QPoolService qpoolService; @Autowired + private LicenseService licenseService; + @Autowired private ReferenceManager referenceManager; @Autowired private RepositoryManager repositoryManager; @Autowired private RepositoryService repositoryService; + @Autowired + private LicenseModule licenseModule; + @Autowired + private QuestionPoolLicenseHandler licenseHandler; public QuestionOriginMediaResource(String label, List<RepositoryEntry> testEntries, Translator translator) { super(label); CoreSpringFactory.autowireObject(this); this.translator = translator; this.testEntries = testEntries; + licenseEnabled = licenseModule.isEnabled(licenseHandler); } @Override @@ -133,11 +146,16 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { headerRow.addCell(col++, translator.translate("report.question.author")); headerRow.addCell(col++, translator.translate("report.question.identifier")); headerRow.addCell(col++, translator.translate("report.question.keywords")); + headerRow.addCell(col++, translator.translate("report.question.taxonomy.level")); headerRow.addCell(col++, translator.translate("report.question.taxonomy.path")); headerRow.addCell(col++, translator.translate("report.question.topic")); headerRow.addCell(col++, translator.translate("report.question.context")); + headerRow.addCell(col++, translator.translate("report.question.correction.time")); headerRow.addCell(col++, translator.translate("report.question.type")); - + if (licenseEnabled) { + headerRow.addCell(col++, translator.translate("report.question.license")); + } + // master headerRow.addCell(col++, translator.translate("report.question.master.identifier")); headerRow.addCell(col++, translator.translate("report.question.master.author")); @@ -190,10 +208,15 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { row.addCell(col++, question.getAuthor()); row.addCell(col++, question.getIdentifier()); row.addCell(col++, question.getKeywords()); + row.addCell(col++, question.getTaxonomyLevel()); row.addCell(col++, question.getTaxonomyPath()); row.addCell(col++, question.getTopic()); row.addCell(col++, question.getEducationalContextLevel()); + row.addCell(col++, question.getCorrectionTime()); row.addCell(col++, question.getType()); + if(licenseEnabled) { + row.addCell(col++, question.getLicense()); + } // master question row.addCell(col++, question.getMasterIdentifier()); @@ -294,7 +317,8 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { } else { QuestionItem item = items.get(0); String authors = getAuthors(item); - infos = new QuestionInformations(authors, item); + String license = getLicense(item); + infos = new QuestionInformations(authors, item, license); } if(StringHelper.containsNonWhitespace(masterIdentifier)) { @@ -309,6 +333,28 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { } return infos; } + + private String getLicense(QuestionItem item) { + License license = null; + if(licenseEnabled) { + license = licenseService.loadLicense(item); + } + + String licenseText = null; + if(license != null) { + LicenseType licenseType = license.getLicenseType(); + if (licenseService.isFreetext(licenseType)) { + licenseText = license.getFreetext(); + } else if (!licenseService.isNoLicense(licenseType)) { + licenseText = license.getLicenseType().getName(); + } + + if(licenseText != null && licenseText.length() > 32000) { + licenseText = licenseText.substring(0, 32000); + } + } + return licenseText; + } private List<CourseToTestHolder> loadCoursesAndTests() { List<CourseToTestHolder> courseToTestList = new ArrayList<>(128); @@ -409,31 +455,39 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { private final String author; private final String keywords; private final String taxonomyPath; + private final String taxonomyLevel; + private final String correctionTime; private final String topic; private final String context; private final String type; private final String masterIdentifier; + private final String license; private MasterInformations masterInformations; - public QuestionInformations(String author, QuestionItem item) { + public QuestionInformations(String author, QuestionItem item, String license) { identifier = item.getIdentifier(); title = item.getTitle(); this.author = author; keywords = item.getKeywords(); taxonomyPath = item.getTaxonomicPath(); + taxonomyLevel = item.getTaxonomyLevelName(); topic = item.getTopic(); context = item.getEducationalContextLevel(); type = item.getItemType(); masterIdentifier = item.getMasterIdentifier(); + correctionTime = item.getCorrectionTime() == null ? "" : item.getCorrectionTime().toString(); + this.license = license; } public QuestionInformations(AssessmentItem assessmentItem, ManifestMetadataBuilder metadata, String testOwners) { identifier = metadata.getOpenOLATMetadataIdentifier(); if(StringHelper.containsNonWhitespace(metadata.getTitle())) { title = metadata.getTitle(); - } else { + } else if (assessmentItem != null) { title = assessmentItem.getTitle(); + } else { + title = "Unkown"; } if(StringHelper.containsNonWhitespace(metadata.getOpenOLATMetadataCreator())) { author = metadata.getOpenOLATMetadataCreator(); @@ -445,6 +499,18 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { keywords = metadata.getGeneralKeywords(); taxonomyPath = metadata.getClassificationTaxonomy(); + + String level = null; + if(StringHelper.containsNonWhitespace(taxonomyPath)) { + int index = taxonomyPath.lastIndexOf('/'); + if(index >= 0) { + level = taxonomyPath.substring(index + 1, taxonomyPath.length()); + } else { + level = taxonomyPath; + } + } + taxonomyLevel = level; + topic = metadata.getOpenOLATMetadataTopic(); context = metadata.getEducationContext(); if(StringHelper.containsNonWhitespace(metadata.getOpenOLATMetadataQuestionType())) { @@ -453,6 +519,13 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { type = QTI21QuestionType.getType(assessmentItem).name(); } masterIdentifier = metadata.getOpenOLATMetadataMasterIdentifier(); + correctionTime = metadata.getOpenOLATMetadataCorrectionTime() == null ? "" : metadata.getOpenOLATMetadataCorrectionTime().toString(); + + String l = metadata.getLicense(); + if(StringHelper.containsNonWhitespace(l) && l.length() > 32000) { + l = l.substring(0, 32000); + } + license = l; } public QuestionInformations(AssessmentItem assessmentItem) { @@ -461,16 +534,19 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { author = null; keywords = null; taxonomyPath = null; + taxonomyLevel = null; topic = assessmentItem.getLabel(); context = null; masterIdentifier = null; + license = null; QTI21QuestionType qType = QTI21QuestionType.getType(assessmentItem); if(qType == null) { type = null; } else { type = qType.name(); - } + } + correctionTime = null; } public String getAuthor() { @@ -488,6 +564,10 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { public String getKeywords() { return keywords; } + + public String getTaxonomyLevel() { + return taxonomyLevel; + } public String getTaxonomyPath() { return taxonomyPath; @@ -500,6 +580,14 @@ public class QuestionOriginMediaResource extends OpenXMLWorkbookResource { public String getEducationalContextLevel() { return context; } + + public String getCorrectionTime() { + return correctionTime; + } + + public String getLicense() { + return license; + } public String getType() { return type; diff --git a/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_de.properties index d0bf6ef456a54e04dc18e44ffe3209d16c3ccf9b..96b9b6721dddf5784ad5f38f80afc8c0ad1acfad 100644 --- a/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_de.properties @@ -7,8 +7,11 @@ report.course.id=Kurs ID report.explain=Report: gew\u00E4hlte Tests inklusive aller enthaltenen Fragen report.question.title=Titel der Frage report.question.author=Ersteller der Frage (Besitzer) +report.question.correction.time=$org.olat.modules.qpool.ui\:question.correctionTime report.question.identifier=Frage ID report.question.keywords=Schlagwort +report.question.license=$org.olat.modules.qpool.ui\:rights.license +report.question.taxonomy.level=Fachbereich report.question.taxonomy.path=Fachbereichpfad report.question.topic=Thema report.question.context=Stufe diff --git a/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_en.properties index d94fb26cbc8944532d68bb42c9524128c64e4bb4..43dabce57308d76405c1198f6c706aedbdaf20f3 100644 --- a/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_en.properties @@ -7,8 +7,11 @@ report.course.id=Course ID report.explain=Report: selected tests including all contained questions report.question.title=Question's title report.question.author=Question's creator (owner) +report.question.correction.time=$org.olat.modules.qpool.ui\:question.correctionTime report.question.identifier=Question ID report.question.keywords=Keywords +report.question.license=$org.olat.modules.qpool.ui\:rights.license +report.question.taxonomy.level=Subject report.question.taxonomy.path=Subject path report.question.topic=Topic report.question.context=Level diff --git a/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_fr.properties index 880a23dec8365f142992d3fd9f8654d76356a2dd..04f180d60f5824bf1b1b7a1f62c8aedd44abb507 100644 --- a/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/ims/qti21/ui/report/_i18n/LocalStrings_fr.properties @@ -7,11 +7,14 @@ report.course.id=ID du cours report.explain=Rapport\: les tests s\u00E9lectionn\u00E9s et toutes leurs questions report.question.author=Cr\u00E9ateur de la question (propri\u00E9taire) report.question.context=Niveau +report.question.correction.time=$org.olat.modules.qpool.ui\:question.correctionTime report.question.identifier=Question ID report.question.keywords=Mots cl\u00E9s +report.question.license=$org.olat.modules.qpool.ui\:rights.license report.question.master.author=Cr\u00E9ateur (propri\u00E9taire master ID) report.question.master.identifier=Question master ID report.question.master.keywords=Mots cl\u00E9s (question master ID) +report.question.taxonomy.level=Sujet report.question.taxonomy.path=Sujet chemin report.question.title=Titre de la question report.question.to.course=Rapport questions