From 0e1abc0c9d1bafeb392011b1dedc609b3de6e46f Mon Sep 17 00:00:00 2001
From: Ron Lucke <lucke@elan-ev.de>
Date: Fri, 15 Dec 2023 08:25:47 +0000
Subject: [PATCH] fix #1694

Closes #1694

Merge request studip/studip!2459
---
 app/controllers/admin/user.php       | 15 ++++++++-------
 app/views/admin/user/_delete.php     |  6 ++++++
 lib/classes/UserManagement.class.php | 21 ++++++++++++++++++++-
 lib/models/User.class.php            |  6 ------
 4 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/app/controllers/admin/user.php b/app/controllers/admin/user.php
index ad9f0544c8e..74daee10d4d 100644
--- a/app/controllers/admin/user.php
+++ b/app/controllers/admin/user.php
@@ -273,12 +273,13 @@ class Admin_UserController extends AuthenticatedController
      */
     public function delete_action($user_id = null, $parent = '')
     {
-        $delete_documents           = (bool) Request::int('documents');
-        $delete_content_from_course = (bool) Request::int('coursecontent');
-        $delete_personal_documents  = (bool) Request::int('personaldocuments');
-        $delete_personal_content    = (bool) Request::int('personalcontent');
-        $delete_names               = (bool) Request::int('personalnames');
-        $delete_memberships         = (bool) Request::int('memberships');
+        $delete_documents           = Request::bool('documents');
+        $delete_courseware          = Request::bool('courseware');
+        $delete_content_from_course = Request::bool('coursecontent');
+        $delete_personal_documents  = Request::bool('personaldocuments');
+        $delete_personal_content    = Request::bool('personalcontent');
+        $delete_names               = Request::bool('personalnames');
+        $delete_memberships         = Request::bool('memberships');
 
         //deleting one user
         if (!is_null($user_id)) {
@@ -299,7 +300,7 @@ class Admin_UserController extends AuthenticatedController
                 $umanager->getFromDatabase($user_id);
 
                 //delete
-                if ($umanager->deleteUser($delete_documents, $delete_content_from_course, $delete_personal_documents, $delete_personal_content, $delete_names, $delete_memberships, !Request::bool('mail'))) {
+                if ($umanager->deleteUser($delete_documents, $delete_content_from_course, $delete_personal_documents, $delete_personal_content, $delete_names, $delete_memberships, !Request::bool('mail'), $delete_courseware)) {
                     $details = explode('§', str_replace(['msg§', 'info§', 'error§'], '', mb_substr($umanager->msg, 0, -1)));
                     PageLayout::postSuccess(htmlReady(sprintf(_('"%s (%s)" wurde erfolgreich gelöscht.'), $user->getFullName(), $user->username)), $details);
                 } else {
diff --git a/app/views/admin/user/_delete.php b/app/views/admin/user/_delete.php
index 59c5fc1894b..d0e89aa294c 100644
--- a/app/views/admin/user/_delete.php
+++ b/app/views/admin/user/_delete.php
@@ -51,6 +51,12 @@
             <?= tooltipHtmlIcon(_('Dateien in Veranstaltungen und Einrichtungen')) ?>
         </label>
 
+        <label>
+            <input type="checkbox" id="courseware" name="courseware" value="1" checked>
+            <?= _('Lernmaterialien löschen?') ?>
+            <?= tooltipHtmlIcon(_('Courseware Lernmaterialien, Seiten, Abschnitte und Blöcke')) ?>
+        </label>
+
         <label>
             <input type="checkbox" id="coursecontent" name="coursecontent" value="1" checked>
             <?= _('Andere Inhalte löschen?') ?>
diff --git a/lib/classes/UserManagement.class.php b/lib/classes/UserManagement.class.php
index 5684126d024..1a92a9546db 100644
--- a/lib/classes/UserManagement.class.php
+++ b/lib/classes/UserManagement.class.php
@@ -800,7 +800,8 @@ class UserManagement
         bool $delete_personal_content = true,
         bool $delete_names = true,
         bool $delete_memberships = true,
-        bool $send_email_notification = true
+        bool $send_email_notification = true,
+        bool $delete_courseware = true
     ): bool {
         global $perm;
 
@@ -983,6 +984,24 @@ class UserManagement
             NotificationCenter::postNotification('UserDataDidRemove', $this->user_data['auth_user_md5.user_id'], 'course_documents');
         }
 
+        // always delete personal courseware elements of this user
+        \Courseware\Unit::deleteBySQL('range_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+        \Courseware\UserDataField::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+        \Courseware\UserProgress::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+        \Courseware\Bookmark::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+
+        // delete courseware elements in courses of this user
+        if ($delete_courseware) {
+            \Courseware\Unit::deleteBySQL('creator_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+            \Courseware\StructuralElement::deleteBySQL('owner_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+            \Courseware\StructuralElementFeedback::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+            \Courseware\StructuralElementComment::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+            \Courseware\Container::deleteBySQL('owner_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+            \Courseware\Block::deleteBySQL('owner_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+            \Courseware\BlockFeedback::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+            \Courseware\BlockComment::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]);
+        }
+
         // delete all remaining user data in course context if option selected
         if ($delete_content_from_course) {
             $queries = [
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index dd3ccd72309..4928ed8851d 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -196,12 +196,6 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
             'order_by'          => 'ORDER BY name',
         ];
 
-        $config['has_one']['courseware_units'] = [
-            'class_name' => \Courseware\Unit::class,
-            'assoc_foreign_key' => 'range_id',
-            'on_delete'  => 'delete',
-        ];
-
         $config['has_many']['course_notifications'] = [
             'class_name'        => CourseMemberNotification::class,
             'on_delete'         => 'delete',
-- 
GitLab