aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/UserManagement.php
diff options
context:
space:
mode:
authorPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-11-26 09:30:35 +0000
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2024-11-26 09:30:35 +0000
commit7abf792f02366b517c243b963cbc3768e64bfe54 (patch)
treeac2531edfa183a2aa8cd828b7a6246ddba5ad7fd /lib/classes/UserManagement.php
parentba8bea5599feb46d6ef487977539368bc24e5945 (diff)
Resolve "VA automatisch löschen wenn sie keine Mitglieder mehr hat"
Closes #4289 Merge request studip/studip!3144
Diffstat (limited to 'lib/classes/UserManagement.php')
-rw-r--r--lib/classes/UserManagement.php99
1 files changed, 59 insertions, 40 deletions
diff --git a/lib/classes/UserManagement.php b/lib/classes/UserManagement.php
index 8e78210..f4c4710 100644
--- a/lib/classes/UserManagement.php
+++ b/lib/classes/UserManagement.php
@@ -812,39 +812,61 @@ class UserManagement
}
}
- // active dozent?
- $query = "SELECT COUNT(*)
- FROM (
- SELECT 1
- FROM `seminar_user` AS `su1`
- -- JOIN seminar_user to check for other teachers
- INNER JOIN `seminar_user` AS `su2`
- ON (`su1`.`seminar_id` = `su2`.`seminar_id` AND `su2`.`status` = 'dozent')
- -- JOIN seminare to check the status for studygroup mode
- INNER JOIN `seminare`
- ON (`su1`.`seminar_id` = `seminare`.`seminar_id`)
- WHERE `su1`.`user_id` = :user_id
- AND `su1`.`status` = 'dozent'
- AND `seminare`.`status` NOT IN (
- -- Select all status ids for studygroups
- SELECT `id`
- FROM `sem_classes`
- WHERE `studygroup_mode` = 1
- )
- GROUP BY `su1`.`seminar_id`
- HAVING COUNT(*) = 1
- ORDER BY NULL
- ) AS `sub`";
- $statement = DBManager::get()->prepare($query);
- $statement->bindValue(':user_id', $this->user_data['auth_user_md5.user_id']);
- $statement->execute();
- $active_count = $statement->fetchColumn() ?: 0;
-
- if ($active_count && $delete_memberships) {
- $this->msg .= 'error§' . sprintf(_('<em>%s</em> ist Lehrkraft in %s aktiven Veranstaltungen und kann daher nicht gelöscht werden.'), $this->user_data['auth_user_md5.username'], $active_count) . '§';
+ // Check if dummy teacher exists
+ if (!Config::get()->DUMMY_TEACHER_ID || !User::find(Config::get()->DUMMY_TEACHER_ID)) {
+ $this->msg .= 'error§' . sprintf(
+ _('Dummy-Dozent (id: %s) nicht gefunden. Bitte DUMMY_TEACHER_ID in Konfiguration setzen.'),
+ Config::get()->DUMMY_TEACHER_ID) . '§';
return false;
- //founder of studygroup?
- } elseif (Config::get()->STUDYGROUPS_ENABLE) {
+ }
+
+ // Delete courses where user is the only one left (besides the dummy teacher)
+ $members = CourseMember::findBySQL(
+ "LEFT JOIN seminare USING(Seminar_id)
+ WHERE seminare.status NOT IN (?) AND user_id != ?
+ GROUP BY Seminar_id
+ HAVING COUNT(DISTINCT user_id) = 1 AND user_id = ?",
+ [
+ studygroup_sem_types(),
+ Config::get()->DUMMY_TEACHER_ID,
+ $this->user->id
+ ]
+ );
+ foreach ($members as $member) {
+ $this->msg .= 'info§' . sprintf(
+ _('User ist einziges Mitglied in Veranstaltung (%s), lösche Veranstaltung.'),
+ $member->course->id
+ ) . '§';
+ $member->course->delete();
+ }
+
+ // Add dummy teacher to courses when only the user is left as teacher
+ $members = CourseMember::findBySQL(
+ "LEFT JOIN seminare USING(Seminar_id)
+ WHERE seminare.status NOT IN (?) AND user_id != ? AND seminar_user.status = 'dozent'
+ GROUP BY Seminar_id
+ HAVING COUNT(DISTINCT user_id) = 1 AND user_id = ?",
+ [
+ studygroup_sem_types(),
+ Config::get()->DUMMY_TEACHER_ID,
+ $this->user->id
+ ]
+ );
+ foreach ($members as $member) {
+ $this->msg .= 'info§' . sprintf(
+ _('User ist einziger Dozent in Veranstaltung (id: %s), füge Dummy-Dozent hinzu.'),
+ $member->course->id
+ ) . '§';
+ CourseMember::insertCourseMember(
+ $member->course->id,
+ Config::get()->DUMMY_TEACHER_ID,
+ 'dozent'
+ );
+
+ }
+
+ // Founder of studygroup?
+ if (Config::get()->STUDYGROUPS_ENABLE) {
$status = studygroup_sem_types();
if (empty($status)) {
@@ -896,6 +918,11 @@ class UserManagement
// delete user from instituts
$this->logInstUserDel($this->user_data['auth_user_md5.user_id']);
+ // Delete from all courses and studygroups
+ if ($count = CourseMember::deleteByUser_id($this->user->id)) {
+ $this->msg .= 'info§' . sprintf(_('Aus %s Veranstaltungen/Studiengruppen ausgetragen.'), $count) . '§';
+ }
+
if ($delete_memberships) {
$query = "DELETE FROM user_inst WHERE user_id = ?";
$statement = DBManager::get()->prepare($query);
@@ -927,14 +954,6 @@ class UserManagement
$this->re_sort_position_in_seminar_user();
- // delete user from seminars (postings will be preserved)
- $query = "DELETE FROM seminar_user WHERE user_id = ?";
- $statement = DBManager::get()->prepare($query);
- $statement->execute([$this->user_data['auth_user_md5.user_id']]);
- if ($count = $statement->rowCount()) {
- $this->msg .= 'info§' . sprintf(_('%s Einträge aus Veranstaltungen gelöscht.'), $count) . '§';
- }
-
$query = "DELETE FROM `termin_related_persons` WHERE `user_id` = ?";
$statement = DBManager::get()->prepare($query);
$statement->execute([$this->user_data['auth_user_md5.user_id']]);