From 07c4c7d2a3f0fc45ddc7c611aca9863e599b84f7 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Thu, 22 Aug 2024 07:50:13 +0000
Subject: [PATCH] user admin: allow searching for matriculation number and add
 matriculation number to export, fixes #4497

Closes #4497

Merge request studip/studip!3289
---
 app/controllers/admin/user.php | 38 +++++++++++++++++++---------------
 app/views/admin/user/index.php |  9 ++++++--
 lib/models/User.class.php      |  5 +++++
 3 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/app/controllers/admin/user.php b/app/controllers/admin/user.php
index d60a3879bf0..a9a04cfd354 100644
--- a/app/controllers/admin/user.php
+++ b/app/controllers/admin/user.php
@@ -100,11 +100,12 @@ class Admin_UserController extends AuthenticatedController
                 }
             }
 
-            $request['username']   = trim($request['username']);
-            $request['email']      = trim($request['email']);
-            $request['vorname']    = trim($request['vorname']);
-            $request['nachname']   = trim($request['nachname']);
-            $request['inaktiv']    = $inaktiv;
+            $request['username'] = trim($request['username']);
+            $request['email'] = trim($request['email']);
+            $request['matriculation_number'] = trim($request['matriculation_number']);
+            $request['vorname'] = trim($request['vorname']);
+            $request['nachname'] = trim($request['nachname']);
+            $request['inaktiv'] = $inaktiv;
             $request['datafields'] = $search_datafields;
 
             $_SESSION['admin']['user'] = $request;
@@ -135,6 +136,7 @@ class Admin_UserController extends AuthenticatedController
                 'vorname',
                 'nachname',
                 'email',
+                'matriculation_number',
                 'inaktiv',
                 'locked',
                 'show_only_not_lectures',
@@ -162,16 +164,16 @@ class Admin_UserController extends AuthenticatedController
                 PageLayout::postInfo(_('Sie haben keine Suchkriterien ausgewählt!'));
             } elseif (count($this->users) < 1 && Request::submitted('search')) {
                 PageLayout::postInfo(_('Es wurden keine Personen mit diesen Suchkriterien gefunden.'));
-            } else {
+            } elseif (!Request::submitted('export')) {
                 $_SESSION['admin']['user']['results'] = true;
                 PageLayout::postInfo(sprintf(_('Es wurden %s Personen mit diesen Suchkriterien gefunden.'), count($this->users)));
             }
             if (is_array($this->users) && Request::submitted('export')) {
-                $tmpname  = md5(uniqid('tmp'));
                 $captions = ['username',
                              'vorname',
                              'nachname',
                              'email',
+                             'matriculation_number',
                              'status',
                              'authentifizierung',
                              'domänen',
@@ -189,11 +191,12 @@ class Admin_UserController extends AuthenticatedController
                         $u['Vorname'],
                         $u['Nachname'],
                         $u['Email'],
+                        $u['matriculation_number'],
                         $u['perms'],
                         $u['auth_plugin'],
-                        join(';', $userdomains),
+                        implode(';', $userdomains),
                         $u['mkdate'] ? strftime('%x', $u['mkdate']) : '',
-                        $u->online->last_lifesign ? strftime('%x', $u->online->last_lifesign) : ''
+                        isset($u->online->last_lifesign) ? strftime('%x', $u->online->last_lifesign) : ''
                     ];
                     foreach ($this->datafields as $datafield) {
                         $df = new DatafieldEntryModel(
@@ -207,14 +210,15 @@ class Admin_UserController extends AuthenticatedController
                     }
                     return $data;
                 };
-                if (array_to_csv(array_map($mapper, $this->users), $GLOBALS['TMP_PATH'] . '/' . $tmpname, $captions)) {
-                    $this->redirect(
-                        FileManager::getDownloadURLForTemporaryFile(
-                            $tmpname,
-                            'nutzer-export.csv'
-                        )
-                    );
-                }
+
+                $this->render_csv(
+                    array_merge(
+                        [$captions],
+                        array_map($mapper, $this->users),
+                    ),
+                    'nutzer-export.csv'
+                );
+                return;
             }
         }
 
diff --git a/app/views/admin/user/index.php b/app/views/admin/user/index.php
index 77c6937771f..2470428a225 100644
--- a/app/views/admin/user/index.php
+++ b/app/views/admin/user/index.php
@@ -21,16 +21,21 @@ use Studip\Button;
     <fieldset>
         <legend><?= _('Benutzerverwaltung') ?></legend>
 
-        <label class="col-3">
+        <label class="col-2">
             <?= _('Benutzername') ?>
             <input name="username" type="text" value="<?= htmlReady($request['username'] ?? '') ?>">
         </label>
 
-        <label class="col-3">
+        <label class="col-2">
             <?= _('E-Mail') ?>
             <input name="email" type="text" value="<?= htmlReady($request['email'] ?? '') ?>">
         </label>
 
+        <label class="col-2">
+            <?= _('Matrikelnummer') ?>
+            <input name="matriculation_number" type="text" value="<?= htmlReady($request['matriculation_number'] ?? '') ?>">
+        </label>
+
         <label class="col-3">
             <?= _('Vorname') ?>
             <input name="vorname" type="text" value="<?= htmlReady($request['vorname'] ?? '') ?>">
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index c51d38fa0f8..c0254e32a24 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -432,6 +432,11 @@ class User extends AuthUserMd5 implements Range, PrivacyObject, Studip\Calendar\
             $params[':email'] = self::searchParam($attributes['email']);
         }
 
+        if (!empty($attributes['matriculation_number'])) {
+            $where[] = "au.`matriculation_number` LIKE :matriculation_number";
+            $params[':matriculation_number'] = self::searchParam($attributes['matriculation_number']);
+        }
+
         //permissions
         if (!empty($attributes['perm']) && $attributes['perm'] !== 'alle') {
             $where[] = "au.`perms` = :perms";
-- 
GitLab