Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
621daf0
chore(foundation): introduce export/import foundation components
lukas-heinrich Apr 9, 2026
7c64953
feat(qpl): implement normalizing/denormalizing in question pool compo…
lukas-heinrich Apr 9, 2026
56e7fc0
feat(qpl): implement question pool export and integrate core export c…
lukas-heinrich Apr 9, 2026
46468f4
feat(qpl): implement question pool import and integrate user interfac…
lukas-heinrich Apr 9, 2026
8558928
fix(qpl): support copage import
lukas-heinrich Apr 9, 2026
5477595
fix(qpl): formula unit and categories import
lukas-heinrich Apr 10, 2026
07f6230
feat(qpl): introduce question image file import
lukas-heinrich Apr 13, 2026
b63c37c
feat(qpl): introduce import cleanup stage
lukas-heinrich Apr 13, 2026
3d3228a
refactor(qpl): remove questions import in question pool
lukas-heinrich Apr 13, 2026
9ea17b2
fix(foundation): rename export context parameter
lukas-heinrich Apr 14, 2026
2fbbfff
fix(qpl): support legacy question pool import
lukas-heinrich Apr 15, 2026
db59c00
refactor(foundation,qpl): introduce export bridge to enhance dependen…
lukas-heinrich Apr 16, 2026
23cab65
refactor(qpl): introduce trait to share question collection logic
lukas-heinrich Apr 17, 2026
67741cb
fix(test): missing parameter in Repository::getTestAttemptResult
lukas-heinrich Apr 20, 2026
a43edd8
feat(test): introduce normalizing into test component
lukas-heinrich Apr 21, 2026
97c94ee
feat(test): introduce test export classes and integrate into existing…
lukas-heinrich Apr 21, 2026
293e37a
feat(test): introduce skill threshold export
lukas-heinrich Apr 22, 2026
22cc328
fix(test): missing redirection leads to duplicate export
lukas-heinrich Apr 22, 2026
a6a3623
fix(test): incorrect resources export
lukas-heinrich Apr 22, 2026
02813c0
fix(test): include question set config in export
lukas-heinrich Apr 22, 2026
dea6573
refactor: remove request dependency in import stages
lukas-heinrich Apr 23, 2026
a62d928
refactor(qpl): create question importer class
lukas-heinrich Apr 24, 2026
216fa7f
refactor(qpl): replace string constants with defined constants in imp…
lukas-heinrich Apr 27, 2026
9e8bab9
fix(test): normalizing bugs and test mapping
lukas-heinrich Apr 28, 2026
a2198f3
feat(test): introduce user import resolving
lukas-heinrich Apr 28, 2026
883b7d3
fix(test): add export for missing test result dependencies
lukas-heinrich Apr 29, 2026
ed442cd
fix(qpl): generate thumbnails for question images
lukas-heinrich Apr 29, 2026
7be2608
fix(filesystem): preserve uri and mode in ReattachableStream across d…
lukas-heinrich Apr 29, 2026
95427aa
feat(test): implement test importer class and integrate into xml impo…
lukas-heinrich Apr 29, 2026
2363a79
feat(test): add missing participant relations export/import
lukas-heinrich Apr 29, 2026
61385f5
refactor(qpl): introduce export/import logging
lukas-heinrich Apr 29, 2026
7d8a24f
fix(foundation): improve legacy normalizer resolving
lukas-heinrich Apr 30, 2026
75b1750
refactor(foundation): introduce XMLFileDeserializer
lukas-heinrich May 4, 2026
862d40a
feat(test): implement skill level thresholds import
lukas-heinrich May 4, 2026
235db30
feat(test): introduce random question set config import
lukas-heinrich May 4, 2026
ac07149
fix(qpl): remove todo annotations in normalizing steps
lukas-heinrich May 7, 2026
7b73a28
refactor(test): improve random test import and split importer class
lukas-heinrich May 7, 2026
861f603
fix(test): support random test question reference export/import
lukas-heinrich May 7, 2026
f4366e8
feat(test): support legacy test import and handle redirect after impo…
lukas-heinrich May 8, 2026
418e283
refactor(test/qpl): integrate logging into import/export processes fo…
lukas-heinrich May 13, 2026
b7a9df1
style: fix coding style
lukas-heinrich May 13, 2026
6cd0fd3
refactor: remove legacy test classes
lukas-heinrich May 13, 2026
42fa9a3
fix: remove imported object placeholder after testing
lukas-heinrich Jun 19, 2026
49eb2e2
fix: redirect after question pool import
lukas-heinrich Jun 19, 2026
e6f2042
fix: null cast exception
lukas-heinrich Jul 1, 2026
d071d51
fix: content cast exception in ordering element export
lukas-heinrich Jul 1, 2026
1ed462a
refactor: cleanup test classes
lukas-heinrich Jul 31, 2026
9563f7f
refactor: improve code structure after internal review
lukas-heinrich Aug 20, 2026
e99c7f4
refactor: improve architecture and small code smells after internal r…
lukas-heinrich Aug 24, 2026
d6e6b5e
refactor: add legacy test export deprecations
lukas-heinrich Aug 25, 2026
c792cf6
test: characterize export import foundation seams
lukas-heinrich Sep 21, 2026
65b4ecf
refactor: isolate export state lifecycle
lukas-heinrich Sep 21, 2026
73b854b
refactor: unify XML serialization
lukas-heinrich Sep 21, 2026
77cf5df
refactor: persist import context as json
lukas-heinrich Sep 21, 2026
5420cb4
refactor: improve test export components structure
lukas-heinrich Sep 21, 2026
c19267b
refactor: align exportimport namespaces
lukas-heinrich Sep 22, 2026
36a1d00
refactor: code style improvements
lukas-heinrich Sep 22, 2026
86d95fa
refactor: replace ilAssQuestionLifecycle static methods with instance…
lukas-heinrich Sep 22, 2026
bf96c0b
fix: revert unintentional changes
lukas-heinrich Sep 22, 2026
baa034b
docs: update privacy and roadmap
lukas-heinrich Sep 22, 2026
48beb74
fix: merge changes from 63f95a1 after rebase
lukas-heinrich Sep 22, 2026
9c4ae57
fix: code style
lukas-heinrich Sep 22, 2026
c2e5ede
refactor: adjust Id-envelope and remove debug logging
lukas-heinrich Oct 22, 2026
dc2fabd
style: fix nested function calls
lukas-heinrich Oct 22, 2026
6c8f3cb
refactor: rename export/import state/context/stage/result to provide …
lukas-heinrich Oct 23, 2026
1c848ba
fix: remove gamification settings in export normalizing
lukas-heinrich Oct 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions components/ILIAS/Test/PRIVACY.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ At the Administration node for Test and Assessment accounts having 'Edit Setting

At Administration > Repository and Objects > Test and Assessment > Settings it is possible to select which 'Unique user criteria' is used in test imports/exports. The selected type of personal data will be included in export type 'XML incl. Participants Results' of a test for each account. Options are: usr_id, login, email, matriculation, ext_account. This personal data is required to match accounts results when importing an export file at the same or another platform.

When importing such an export file, the accounts are looked up by the 'Unique user criteria' configured at the importing platform. Test attempts of accounts which cannot be matched are not discarded but assigned to the anonymous account. The personal data contained in the export file for those accounts is therefore imported without being linked to an account of the importing platform.

At Administration > Repository and Objects > Test and Assessment > Log Data accounts with 'Edit Settings' permission can activate the History-tab via the checkbox 'Activate Test and Assessment Logging'. Additionally the setting 'Log IP' allows for logging the IP-adress of participants along with the interactions as well as specific settings of said test during the interaction.
The purpose of both options is to store important events and information for configuring and performing tests. This gives the possibility to check those information in case of issues or concerns after performing tests.

Expand Down Expand Up @@ -230,9 +232,23 @@ There are three export files at the tab Test > Export which contain personal dat

The ‘Archive file’ contains all personal data which is being stored and presented in the test (see above). Its purpose is to have this data easily accessible outside of ILIAS, e.g. for long-term archiving of the data.

The 'XML' export contains the personal data 'Author' of the questions and of the test itself within the metadata (see above). Its purpose is to be imported into ILIAS again, although the contained personal data is easily accessible.
The 'XML' export contains the personal data 'Author' of the questions and of the test itself within the metadata (see above). In addition it contains the 'User ID' of the owner of each question. Its purpose is to be imported into ILIAS again, although the contained personal data is easily accessible.

The ‘XML export incl. Participant Results’ contains all personal data which is being stored and presented in the test (see above). The data in the ‘History’ tab is an exception; it is not included. Its purpose is to be imported into ILIAS again, although the contained personal data is easily accessible. This export file can be used to, e.g., provide the test results to the participants at another ILIAS installation. In addition to the data of the 'XML' export, it contains the following personal data for each participant:

The ‘XML export incl. Participant Results’ contains all personal data which is being stored and presented in the test (see above). The data in the ‘History’ tab is an exception; it is not included. Its purpose is to be imported into ILIAS again, although the contained personal data is easily accessible. This export file can be used to, e.g., provide the test results to the participants at another ILIAS installation.
- User ID (exported as the 'Unique user criteria' configured at Administration > Repository and Objects > Test and Assessment > Settings, see above)
- Anonymous ID, if the test is set to anonymous
- Name (first name and last name)
- Login
- Matriculation Number
- Import name, if the account was imported
- Client IP Range
- Invitation date
- Additional working time granted to the participant
- Timestamp of the first and the last access
- All test attempts with their timestamps, answers, scoring and status

For questions which have been scored manually, the 'User ID' of the account which finalized the scoring is contained as well.

### Administration > Repository and Objects > Test and Assessment > Log Data > Log Data Output

Expand Down
3 changes: 1 addition & 2 deletions components/ILIAS/Test/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Among other challenges, we are planning to use the given developing budget from
* Use of IRSS in T&A
* Further reduction of access and use of request variables (GPCR)
5. Work on [(Project) Revision of Test Question Creation](https://docu.ilias.de/go/wiki/wpage_8111_1357)
6. Work on Project Revision of Import/Export of the T&A
6. Work on Project Revision of Import/Export of the T&A. Export and import of Test and Question Pool have been rebuilt upon a normalized XML format in ILIAS 12. The QTI based export and the Excel export of questions are deprecated, import of files created with previous ILIAS versions is covered by dedicated legacy importers. Still open are the revision of the Archive file and the removal of the deprecated legacy code.
7. Feasibility study Test in Learning sequence - Could the LS uses the actual Exam View (since ILIAS9 - General Kiosk Mode)
8. Authorized Saving of Participant Input - Problems e.g. in the question list, see [Mantis 44211](https://mantis.ilias.de/view.php?id=44211). In order to address the problem, we need a concept for the entire test run at the technical level and an analysis of the current situation. From this, we want to derive an operating concept for controlling the test run. By redesigning the test run, we know where we want to go and can at least mitigate the problems in existing ILIAS versions with usability fixes.
9. KS Improvements / Exchange of single elements' trough existing KS elements independently of the Legacy-UI-Project
Expand All @@ -46,7 +46,6 @@ Remarks on the individual items are marked with "@PHP8-CR"
* \ilTestPlayerAbstractGUI::autosaveCmd / This looks like another issue in the autosaving. Left for review/analysis by TechSquad
* \ilAssLacCompositeValidator::validateSubTree / Incompatible type. Left for review/analysis by TechSquad
### TestQuestionPool
* \ilObjQuestionPoolGUI::exportQuestionObject / Void result used. Left for review/analysis by TechSquad
* \assMatchingQuestionGUI::writeAnswerSpecificPostData / Incompatible type. Left for review/analysis by TechSquad
* \assMatchingQuestionGUI::populateAnswerSpecificFormPart / Incompatible type. Left for review/analysis by TechSquad
* \assMatchingQuestionImport::fromXML / Incompatible type. Left for review/analysis by TechSquad
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public function build(ilTestRandomQuestionSetSourcePoolDefinition $sourcePool, $
$lifecycleFilter = new ilSelectInputGUI($this->lng->txt('qst_lifecycle'), 'filter_lifecycle');
$lifecycleFilter->setRequired(true);
$lifecycleFilter->setMulti(true);
$lifecycleFilter->setOptions(ilAssQuestionLifecycle::getDraftInstance()->getSelectOptions($this->lng));
$lifecycleFilter->setOptions(new ilAssQuestionLifecycle()->getSelectOptions($this->lng));
$lifecycleFilter->setValue($lifecycleFilterValues);
$lifecycleCheckbox->addSubItem($lifecycleFilter);
$this->addItem($lifecycleCheckbox);
Expand Down
33 changes: 1 addition & 32 deletions components/ILIAS/Test/classes/class.ilObjTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -407,36 +407,6 @@ public function getExportFiles(string $dir = ''): array
return $files;
}

/**
* creates data directory for import files
* (data_dir/tst_data/tst_<id>/import, depending on data
* directory that is set in ILIAS setup/ini)
*/
public static function _createImportDirectory(): string
{
global $DIC;
$ilias = $DIC['ilias'];
$tst_data_dir = ilFileUtils::getDataDir() . "/tst_data";
ilFileUtils::makeDir($tst_data_dir);

if (!is_writable($tst_data_dir)) {
$ilias->raiseError("Test Data Directory (" . $tst_data_dir
. ") not writeable.", $ilias->error_obj->FATAL);
}

// create test directory (data_dir/tst_data/tst_import)
$tst_dir = $tst_data_dir . "/tst_import";
ilFileUtils::makeDir($tst_dir);
if (!@is_dir($tst_dir)) {
$ilias->raiseError("Creation of test import directory failed.", $ilias->error_obj->FATAL);
}

// assert that this is empty and does not contain old data
ilFileUtils::delDir($tst_dir, true);

return $tst_dir;
}

final public function isComplete(ilTestQuestionSetConfig $test_question_set_config): bool
{
if ($this->getMarkSchema() === null
Expand Down Expand Up @@ -2798,8 +2768,7 @@ public function getAvailableQuestions($arr_filter, $completeonly = 0): array
}

/**
* Receives parameters from a QTI parser and creates a valid ILIAS test object
* @param ilQTIAssessment $assessment
* @deprecated 12: Use ILIAS\Test\ExportImport\TestImporter instead
*/
public function fromXML(ilQTIAssessment $assessment, array $mappings): void
{
Expand Down
Loading
Loading