From cf961f344e929ff56d8f98154b6de2601355bf16 Mon Sep 17 00:00:00 2001 From: Ron Lucke <lucke@elan-ev.de> Date: Fri, 26 May 2023 08:58:15 +0000 Subject: [PATCH] fix #797 Closes #797 Merge request studip/studip!1814 --- app/controllers/privacy.php | 2 +- lib/classes/Privacy.php | 15 +++++- lib/models/Courseware/Block.php | 20 ++++++- lib/models/Courseware/BlockComment.php | 19 ++++++- lib/models/Courseware/BlockFeedback.php | 19 ++++++- lib/models/Courseware/Bookmark.php | 19 ++++++- lib/models/Courseware/Container.php | 20 ++++++- lib/models/Courseware/StructuralElement.php | 20 ++++++- .../Courseware/StructuralElementComment.php | 19 ++++++- .../Courseware/StructuralElementFeedback.php | 19 ++++++- lib/models/Courseware/TaskFeedback.php | 19 ++++++- lib/models/Courseware/TaskGroup.php | 20 ++++++- lib/models/Courseware/Unit.php | 19 ++++++- lib/models/Courseware/UserDataField.php | 19 ++++++- lib/models/Courseware/UserProgress.php | 19 ++++++- lib/modules/CoursewareModule.class.php | 54 +------------------ 16 files changed, 254 insertions(+), 68 deletions(-) diff --git a/app/controllers/privacy.php b/app/controllers/privacy.php index 60d3c33488d..ee1f1574293 100644 --- a/app/controllers/privacy.php +++ b/app/controllers/privacy.php @@ -439,7 +439,7 @@ class PrivacyController extends AuthenticatedController 'content' => [ 'icon' => Icon::create('forum2'), 'title' => _('Inhalte'), - 'description' => _('Dateien, Forum, Wiki, Literaturlisten'), + 'description' => _('Courseware, Dateien, Forum, Wiki, Literaturlisten'), ], 'quest' => [ 'icon' => Icon::create('vote'), diff --git a/lib/classes/Privacy.php b/lib/classes/Privacy.php index bb3bcddc60a..870e96ba3c8 100644 --- a/lib/classes/Privacy.php +++ b/lib/classes/Privacy.php @@ -43,7 +43,20 @@ class Privacy 'content' => [ 'FileRef', 'ForumEntry', - 'WikiPage' + 'WikiPage', + 'Courseware\Unit', + 'Courseware\StructuralElement', + 'Courserware\StructuralElementComment', + 'Courserware\StructuralElementFeedback', + 'Courseware\TaskGroup', + 'Courseware\TaskFeedback', + 'Courseware\Bookmark', + 'Courseware\Container', + 'Courseware\Block', + 'Courserware\BlockComment', + 'Courserware\BlockFeedback', + 'Courseware\UserDataField', + 'Courseware\UserProgress' ], 'quest' => [ 'Evaluation', diff --git a/lib/models/Courseware/Block.php b/lib/models/Courseware/Block.php index 05d5d45c1b1..bd0361897dd 100644 --- a/lib/models/Courseware/Block.php +++ b/lib/models/Courseware/Block.php @@ -36,7 +36,7 @@ use User; * @property \User $edit_blocker belongs_to User * @property \Courseware\Container $container belongs_to Courseware\Container */ -class Block extends \SimpleORMap +class Block extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -222,4 +222,22 @@ class Block extends \SimpleORMap return StructuralElement::build($structuralElement, false); } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $blocks = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_blocks WHERE owner_id = ? OR editor_id = ?', + [$storage->user_id, $storage->user_id] + ); + if ($blocks) { + $storage->addTabularData(_('Courseware Blöcke'), 'cw_blocks', $blocks); + } + + } } diff --git a/lib/models/Courseware/BlockComment.php b/lib/models/Courseware/BlockComment.php index 16f3a73293d..fc6811120b1 100644 --- a/lib/models/Courseware/BlockComment.php +++ b/lib/models/Courseware/BlockComment.php @@ -23,7 +23,7 @@ use User; * @property \User $user belongs_to User * @property \Courseware\Block $block belongs_to Courseware\Block */ -class BlockComment extends \SimpleORMap +class BlockComment extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -57,4 +57,21 @@ class BlockComment extends \SimpleORMap return StructuralElement::build($structuralElement, false); } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $comments = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_block_comments WHERE user_id = ?', + [$storage->user_id] + ); + if ($comments) { + $storage->addTabularData(_('Courseware Block Kommentare'), 'cw_block_comments', $comments); + } + } } diff --git a/lib/models/Courseware/BlockFeedback.php b/lib/models/Courseware/BlockFeedback.php index 422577097a1..21eed5d0a37 100644 --- a/lib/models/Courseware/BlockFeedback.php +++ b/lib/models/Courseware/BlockFeedback.php @@ -21,7 +21,7 @@ use User; * @property \User $user belongs_to User * @property \Courseware\Block $block belongs_to Courseware\Block */ -class BlockFeedback extends \SimpleORMap +class BlockFeedback extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -55,4 +55,21 @@ class BlockFeedback extends \SimpleORMap return StructuralElement::build($structuralElement, false); } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $feedback = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_block_feedbacks WHERE user_id = ?', + [$storage->user_id] + ); + if ($feedback) { + $storage->addTabularData(_('Courseware Block Feedback'), 'cw_block_feedback', $feedback); + } + } } diff --git a/lib/models/Courseware/Bookmark.php b/lib/models/Courseware/Bookmark.php index e11954825cc..ddff953a289 100644 --- a/lib/models/Courseware/Bookmark.php +++ b/lib/models/Courseware/Bookmark.php @@ -20,7 +20,7 @@ namespace Courseware; * @property \User $user belongs_to User * @property \Courseware\StructuralElement $element belongs_to Courseware\StructuralElement */ -class Bookmark extends \SimpleORMap +class Bookmark extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -62,4 +62,21 @@ class Bookmark extends \SimpleORMap { return self::findBySQL('user_id = ? ORDER BY chdate', [$user->id]); } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $bookmarks = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_bookmarks WHERE user_id = ?', + [$storage->user_id] + ); + if ($bookmarks) { + $storage->addTabularData(_('Courseware Lesezeichen'), 'cw_bookmarks', $bookmarks); + } + } } diff --git a/lib/models/Courseware/Container.php b/lib/models/Courseware/Container.php index 088f53959c4..082a9a01769 100644 --- a/lib/models/Courseware/Container.php +++ b/lib/models/Courseware/Container.php @@ -33,7 +33,7 @@ use User; * @property \User $edit_blocker belongs_to User * @property \Courseware\StructuralElement $structural_element belongs_to Courseware\StructuralElement */ -class Container extends \SimpleORMap +class Container extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -142,4 +142,22 @@ class Container extends \SimpleORMap return [$blockMap, $newBlockList]; } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $containers = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_containers WHERE owner_id = ? OR editor_id = ?', + [$storage->user_id, $storage->user_id] + ); + if ($containers) { + $storage->addTabularData(_('Courseware Abschnitte'), 'cw_containers', $containers); + } + + } } diff --git a/lib/models/Courseware/StructuralElement.php b/lib/models/Courseware/StructuralElement.php index deaab1a177c..3e405f3b2f0 100644 --- a/lib/models/Courseware/StructuralElement.php +++ b/lib/models/Courseware/StructuralElement.php @@ -53,7 +53,7 @@ use User; * @SuppressWarnings(PHPMD.TooManyPublicMethods) * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ -class StructuralElement extends \SimpleORMap +class StructuralElement extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -1091,4 +1091,22 @@ SQL; } } } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $structuralElements = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_structural_elements WHERE ? IN (owner_id, editor_id, range_id)', + [$storage->user_id] + ); + if ($structuralElements) { + $storage->addTabularData(_('Courseware Seiten'), 'cw_structural_elements', $structuralElements); + } + + } } diff --git a/lib/models/Courseware/StructuralElementComment.php b/lib/models/Courseware/StructuralElementComment.php index e5fbc818a9c..1e046c4d4e7 100644 --- a/lib/models/Courseware/StructuralElementComment.php +++ b/lib/models/Courseware/StructuralElementComment.php @@ -21,7 +21,7 @@ use User; * @property \User $user belongs_to User * @property \Courseware\StructuralElement $structural_element belongs_to Courseware\StructuralElement */ -class StructuralElementComment extends \SimpleORMap +class StructuralElementComment extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -39,4 +39,21 @@ class StructuralElementComment extends \SimpleORMap parent::configure($config); } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $comments = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_structural_element_comments WHERE user_id = ?', + [$storage->user_id] + ); + if ($comments) { + $storage->addTabularData(_('Courseware Seiten Kommentare'), 'cw_structural_element_comments', $comments); + } + } } diff --git a/lib/models/Courseware/StructuralElementFeedback.php b/lib/models/Courseware/StructuralElementFeedback.php index a2e3b8b97ab..c7435d06b67 100644 --- a/lib/models/Courseware/StructuralElementFeedback.php +++ b/lib/models/Courseware/StructuralElementFeedback.php @@ -21,7 +21,7 @@ use User; * @property \User $user belongs_to User * @property \Courseware\StructuralElement $structural_element belongs_to Courseware\StructuralElement */ -class StructuralElementFeedback extends \SimpleORMap +class StructuralElementFeedback extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -39,4 +39,21 @@ class StructuralElementFeedback extends \SimpleORMap parent::configure($config); } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $feedback = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_structural_element_feedbacks WHERE user_id = ?', + [$storage->user_id] + ); + if ($feedback) { + $storage->addTabularData(_('Courseware Seiten Feedback'), 'cw_structural_element_feedbacks', $feedback); + } + } } diff --git a/lib/models/Courseware/TaskFeedback.php b/lib/models/Courseware/TaskFeedback.php index 57e2ce07053..987aae9f5c0 100644 --- a/lib/models/Courseware/TaskFeedback.php +++ b/lib/models/Courseware/TaskFeedback.php @@ -22,7 +22,7 @@ use User; * @property \User $lecturer belongs_to User * @property \Courseware\Task $task belongs_to Courseware\Task */ -class TaskFeedback extends \SimpleORMap +class TaskFeedback extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -55,4 +55,21 @@ class TaskFeedback extends \SimpleORMap return StructuralElement::build($structuralElement, false); } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $feedback = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_task_feedbacks WHERE lecturer_id = ?', + [$storage->user_id] + ); + if ($feedback) { + $storage->addTabularData(_('Courseware Aufgaben Feedback'), 'cw_task_feedbacks', $feedback); + } + } } diff --git a/lib/models/Courseware/TaskGroup.php b/lib/models/Courseware/TaskGroup.php index 7ca6eb1fa12..d32866390a9 100644 --- a/lib/models/Courseware/TaskGroup.php +++ b/lib/models/Courseware/TaskGroup.php @@ -25,7 +25,7 @@ use User; * @property \Courseware\StructuralElement $structural_element belongs_to Courseware\StructuralElement * @property \SimpleORMapCollection $tasks has_many Courseware\Task */ -class TaskGroup extends \SimpleORMap +class TaskGroup extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -58,4 +58,22 @@ class TaskGroup extends \SimpleORMap return $solvers; } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $task_groups = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_task_groups WHERE lecturer_id = ?', + [$storage->user_id] + ); + if ($task_groups) { + $storage->addTabularData(_('Courseware Aufgaben'), 'cw_task_groups', $task_groups); + } + + } } diff --git a/lib/models/Courseware/Unit.php b/lib/models/Courseware/Unit.php index 5c470c901ff..647f9f9fb70 100644 --- a/lib/models/Courseware/Unit.php +++ b/lib/models/Courseware/Unit.php @@ -31,7 +31,7 @@ use User; * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ -class Unit extends \SimpleORMap +class Unit extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -110,4 +110,21 @@ class Unit extends \SimpleORMap return $newUnit; } + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $units = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_units WHERE creator_id = ?', + [$storage->user_id] + ); + if ($units) { + $storage->addTabularData(_('Courseware Lernmaterialien'), 'cw_units', $units); + } + + } } diff --git a/lib/models/Courseware/UserDataField.php b/lib/models/Courseware/UserDataField.php index 914cab03615..af608809acd 100644 --- a/lib/models/Courseware/UserDataField.php +++ b/lib/models/Courseware/UserDataField.php @@ -21,7 +21,7 @@ namespace Courseware; * @property \Courseware\Block $block belongs_to Courseware\Block * @property \User $user belongs_to User */ -class UserDataField extends \SimpleORMap +class UserDataField extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -67,4 +67,21 @@ class UserDataField extends \SimpleORMap return $userDataField; } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $userData = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_user_data_fields WHERE user_id = ?', + [$storage->user_id] + ); + if ($userData) { + $storage->addTabularData(_('Courseware Nutzerdaten'), 'cw_user_data_fields', $userData); + } + } } diff --git a/lib/models/Courseware/UserProgress.php b/lib/models/Courseware/UserProgress.php index d4355f55454..195fd89222b 100644 --- a/lib/models/Courseware/UserProgress.php +++ b/lib/models/Courseware/UserProgress.php @@ -21,7 +21,7 @@ namespace Courseware; * @property \Courseware\Block $block belongs_to Courseware\Block * @property \User $user belongs_to User */ -class UserProgress extends \SimpleORMap +class UserProgress extends \SimpleORMap implements \PrivacyObject { protected static function configure($config = []) { @@ -63,4 +63,21 @@ class UserProgress extends \SimpleORMap return $progress; } + + /** + * Export available data of a given user into a storage object + * (an instance of the StoredUserData class) for that user. + * + * @param StoredUserData $storage object to store data into + */ + public static function exportUserData(\StoredUserData $storage) + { + $userProgresses = \DBManager::get()->fetchAll( + 'SELECT * FROM cw_user_progresses WHERE user_id = ?', + [$storage->user_id] + ); + if ($userProgresses) { + $storage->addTabularData(_('Courseware Fortschritt'), 'cw_user_progresses', $userProgresses); + } + } } diff --git a/lib/modules/CoursewareModule.class.php b/lib/modules/CoursewareModule.class.php index 2a9161ac727..56a205c2f05 100644 --- a/lib/modules/CoursewareModule.class.php +++ b/lib/modules/CoursewareModule.class.php @@ -3,7 +3,7 @@ use Courseware\Instance; use Courseware\StructuralElement; -class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule, PrivacyPlugin +class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule { /** * {@inheritdoc} @@ -146,58 +146,6 @@ class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule, ]; } - /** - * {@inheritdoc} - */ - public function exportUserData(StoredUserData $storage) - { - $db = DBManager::get(); - - $structuralElements = $db->fetchAll( - 'SELECT * FROM cw_structural_elements WHERE owner_id = ? OR editor_id = ? OR range_id = ?', - [$storage->user_id, $storage->user_id, $storage->user_id] - ); - $storage->addTabularData(_('Courseware-Strukturelemente-Ergebnisse'), 'cw_structural_elements', $structuralElements); - - $containers = $db->fetchAll( - 'SELECT * FROM cw_containers WHERE owner_id = ? OR editor_id = ?', - [$storage->user_id, $storage->user_id] - ); - $storage->addTabularData(_('Courseware-Container-Ergebnisse'), 'cw_containers', $containers); - - $blocks = $db->fetchAll( - 'SELECT * FROM cw_blocks WHERE owner_id = ? OR editor_id = ?', - [$storage->user_id, $storage->user_id] - ); - $storage->addTabularData(_('Courseware-Blöcke-Ergebnisse'), 'cw_blocks', $blocks); - - $comments = $db->fetchAll( - 'SELECT * FROM cw_block_comments WHERE user_id = ?', - [$storage->user_id] - ); - $storage->addTabularData(_('Courseware-Kommentare-Ergebnisse'), 'cw_block_comments', $comments); - - $userData = $db->fetchAll( - 'SELECT * FROM cw_user_data_fields WHERE user_id = ?', - [$storage->user_id] - ); - $storage->addTabularData(_('Courseware-Nutzer-Daten-Ergebnisse'), 'cw_user_data_fields', $userData); - - $userProgresses = $db->fetchAll( - 'SELECT * FROM cw_user_progresses WHERE user_id = ?', - [$storage->user_id] - ); - $storage->addTabularData(_('Courseware-Nutzer-Fortschritt-Ergebnisse'), 'cw_user_progresses', $userProgresses); - - $bookmarks = $db->fetchAll( - 'SELECT * FROM cw_bookmarks WHERE user_id = ?', - [$storage->user_id] - ); - $storage->addTabularData(_('Courseware-Lesezeichen-Ergebnisse'), 'cw_bookmarks', $bookmarks); - - - } - public function isActivatableForContext(Range $context) { return $context->getRangeType() === 'course'; -- GitLab