From acf6cde30cef448b9ec9c26e1623edb8eb82c7fb Mon Sep 17 00:00:00 2001 From: David Siegfried <david.siegfried@uni-vechta.de> Date: Mon, 18 Mar 2024 20:50:27 +0000 Subject: [PATCH] reimplemnt export, fixes #3785 Closes #3785 Merge request studip/studip!2705 --- app/controllers/course/grouping.php | 47 +++------------ app/controllers/course/members.php | 65 ++++++++++---------- app/controllers/course/statusgroups.php | 2 +- lib/models/CourseMember.class.php | 80 +++++++++++++++++-------- 4 files changed, 98 insertions(+), 96 deletions(-) diff --git a/app/controllers/course/grouping.php b/app/controllers/course/grouping.php index 198932e45c1..4f35b53452d 100644 --- a/app/controllers/course/grouping.php +++ b/app/controllers/course/grouping.php @@ -190,44 +190,13 @@ class Course_GroupingController extends AuthenticatedController // Export all participants. if (Config::get()->EXPORT_ENABLE) { $widget = new ExportWidget(); - - // create csv-export link - $csvExport = export_link( - $this->course->id, - 'person', - htmlReady(sprintf( - '%s %s', - get_title_for_status('autor', 2), - $this->course->getFullName() - )), - 'csv', - 'csv-teiln', - '', - _('Teilnehmendenliste als CSV-Dokument exportieren'), - 'passthrough' - ); - $widget->addLinkFromhtmL( - $csvExport, - Icon::create('file-office', 'clickable') - ); - - // create csv-export link - $rtfExport = export_link( - $this->course->id, - 'person', - htmlReady(sprintf( - '%s %s', - get_title_for_status('autor', 2), $this->course->getFullName() - )), - 'rtf', - 'rtf-teiln', - '', - _('Teilnehmendenliste als rtf-Dokument exportieren'), - 'passthrough' - ); - $widget->addLinkFromHTML( - $rtfExport, - Icon::create('file-text', 'clickable') + $widget->addLink( + _('Als CSV-Datei exportieren'), + URLHelper::getURL('dispatch.php/course/members/export', [ + 'course_id' => $this->course_id, + 'format' => 'csv', + ]), + Icon::create('export') ); $sidebar->addWidget($widget); @@ -267,7 +236,7 @@ class Course_GroupingController extends AuthenticatedController { CSRFProtection::verifyUnsafeRequest(); if (Request::submitted('single_action')) { - list($course_id, $permission) = explode('-', Request::get('single_action')); + [$course_id, $permission] = explode('-', Request::get('single_action')); $selected = Request::getArray('members'); diff --git a/app/controllers/course/members.php b/app/controllers/course/members.php index 5ead0eae13f..bf072219814 100644 --- a/app/controllers/course/members.php +++ b/app/controllers/course/members.php @@ -1675,33 +1675,13 @@ class Course_MembersController extends AuthenticatedController ); if (count($this->awaiting) > 0) { - $awaiting_rtf = export_link( - $this->course_id, - 'person', - sprintf(_('Warteliste %s'), $this->course_title), - 'rtf', - 'rtf-warteliste', - $this->waiting_type, - _('Warteliste als rtf-Dokument exportieren'), - 'passthrough' - ); - $widget->addLinkFromHTML( - $awaiting_rtf, - Icon::create('export') - ); - - $awaiting_csv = export_link( - $this->course_id, - 'person', - sprintf(_('Warteliste %s'), $this->course_title), - 'csv', - 'csv-warteliste', - $this->waiting_type, - _('Warteliste als csv-Dokument exportieren'), - 'passthrough' - ); - $widget->addLinkFromHTML( - $awaiting_csv, + $widget->addLink( + _('Warteliste CSV-Datei exportieren'), + URLHelper::getURL('dispatch.php/course/members/export', [ + 'course_id' => $this->course_id, + 'format' => 'csv', + 'status' => $this->waiting_type, + ]), Icon::create('export') ); } @@ -1753,21 +1733,44 @@ class Course_MembersController extends AuthenticatedController public function export_action() { $export_format = Request::get('format'); + $status = Request::get('status'); if ($export_format !== 'csv' && $export_format !== 'xlsx') { throw new Exception('Wrong format'); } - $header = [_('Status'), _('Anrede'), _('Titel'), _('Vorname'), _('Nachname'), _('Titel nachgestellt'), _('Benutzername'), _('Adresse'), _('Telefonnr.'), - _('E-Mail'), _('Anmeldedatum'), _('Matrikelnummer'), _('Studiengänge')]; - $members = CourseMember::getMemberDataByCourse($this->course_id); + $header = [ + _('Status'), + _('Anrede'), + _('Titel'), + _('Vorname'), + _('Nachname'), + _('Titel nachgestellt'), + _('Benutzername'), + _('Adresse'), + _('Telefonnr.'), + _('E-Mail'), + _('Anmeldedatum'), + _('Matrikelnummer'), + ]; + + if (in_array($status, ['awaiting', 'claiming'])) { + $header[] = _('Position'); + $filename = _('Wartelistenexport'); + } else { + $filename = _('Teilnehmendenexport'); + } + + $header[] = _('Studiengänge'); + + $members = CourseMember::getMemberDataByCourse($this->course_id, $status); foreach ($members as &$member) { $member['Anmeldedatum'] = $member['Anmeldedatum'] ? date("d.m.Y", $member['Anmeldedatum']) : _("unbekannt"); unset($member['user_id']); } - $filename = _('Teilnehmendenexport') . ' ' . $this->course_title . '.' . $export_format; + $filename = $filename . ' ' . $this->course_title . '.' . $export_format; $this->render_spreadsheet($header, $members, $export_format, $filename); } diff --git a/app/controllers/course/statusgroups.php b/app/controllers/course/statusgroups.php index 3edccb2ad70..d2921a794a6 100644 --- a/app/controllers/course/statusgroups.php +++ b/app/controllers/course/statusgroups.php @@ -324,7 +324,7 @@ class Course_StatusgroupsController extends AuthenticatedController if ($groups) { foreach ($groups as $group) { foreach ($group['members'] as $mem) { - $member_data = CourseMember::getMemberDataByCourse($this->course_id, $mem['user_id']); + $member_data = CourseMember::getMemberDataByCourse($this->course_id, '', $mem['user_id']); foreach ($member_data as &$mem_data) { $mem_data['Anmeldedatum'] = $mem_data['Anmeldedatum'] ? date('d.m.Y', $mem_data['Anmeldedatum']) : _('unbekannt'); diff --git a/lib/models/CourseMember.class.php b/lib/models/CourseMember.class.php index 91256a9b0e9..5f9ec5042fa 100644 --- a/lib/models/CourseMember.class.php +++ b/lib/models/CourseMember.class.php @@ -442,7 +442,7 @@ class CourseMember extends SimpleORMap implements PrivacyObject * Get user information for all users in this course * */ - public static function getMemberDataByCourse(string $seminar_id, ?string $user_id = null): array + public static function getMemberDataByCourse(string $seminar_id, ?string $status = '', ?string $user_id = null,): array { $query = "SELECT `datafield_id` FROM `datafields` @@ -455,34 +455,64 @@ class CourseMember extends SimpleORMap implements PrivacyObject ':seminar_id' => $seminar_id, ':datafield_id' => $datafield_id, ]; - if (func_num_args() > 1) { + if ($user_id !== null) { $user_condition = " AND su.`user_id` = :user_id"; $parameters[':user_id'] = $user_id; } - $query = "SELECT su.`user_id`, - su.`status`, - ui.`geschlecht`, - ui.`title_front` AS Titel, - aum.`Vorname`, - aum.`Nachname`, - ui.`title_rear` AS Titel2, - aum.`username`, - ui.`privadr`, - ui.`privatnr`, - aum.`Email`, - ui.`mkdate` AS Anmeldedatum, - IFNULL(aum.`matriculation_number`, dfe.`content`) AS Matrikelnummer - FROM `seminar_user` AS su - JOIN `auth_user_md5` AS aum USING (`user_id`) - LEFT JOIN `user_info` AS ui USING (`user_id`) - LEFT JOIN `datafields_entries` AS dfe - ON dfe.`range_id` = su.`user_id` - AND dfe.`datafield_id` = :datafield_id - WHERE `Seminar_id` = :seminar_id - {$user_condition} - GROUP BY su.`user_id` - ORDER BY `status` DESC, `Nachname`, `Vorname`"; + + if (in_array($status, ['awaiting', 'claiming'])) { + $query = "SELECT su.`user_id`, + su.`status`, + ui.`geschlecht`, + ui.`title_front` AS Titel, + aum.`Vorname`, + aum.`Nachname`, + ui.`title_rear` AS Titel2, + aum.`username`, + ui.`privadr`, + ui.`privatnr`, + aum.`Email`, + ui.`mkdate` AS Anmeldedatum, + IFNULL(aum.`matriculation_number`, dfe.`content`) AS Matrikelnummer, + su.position AS admission_position + FROM admission_seminar_user AS su + LEFT JOIN user_info AS ui USING (user_id) + LEFT JOIN auth_user_md5 AS aum USING (user_id) + LEFT JOIN `datafields_entries` AS dfe + ON dfe.`range_id` = su.`user_id` + AND dfe.`datafield_id` = :datafield_id + WHERE seminar_id = :seminar_id AND su.status = :status + {$user_condition} + GROUP BY aum.user_id + ORDER BY Nachname, Vorname"; + $parameters[':status'] = $status; + } else { + $query = "SELECT su.`user_id`, + su.`status`, + ui.`geschlecht`, + ui.`title_front` AS Titel, + aum.`Vorname`, + aum.`Nachname`, + ui.`title_rear` AS Titel2, + aum.`username`, + ui.`privadr`, + ui.`privatnr`, + aum.`Email`, + ui.`mkdate` AS Anmeldedatum, + IFNULL(aum.`matriculation_number`, dfe.`content`) AS Matrikelnummer + FROM `seminar_user` AS su + JOIN `auth_user_md5` AS aum USING (`user_id`) + LEFT JOIN `user_info` AS ui USING (`user_id`) + LEFT JOIN `datafields_entries` AS dfe + ON dfe.`range_id` = su.`user_id` + AND dfe.`datafield_id` = :datafield_id + WHERE `Seminar_id` = :seminar_id + {$user_condition} + GROUP BY su.`user_id` + ORDER BY `status` DESC, `Nachname`, `Vorname`"; + } + return DBManager::get()->fetchAll( $query, $parameters, -- GitLab