From d708be7478d9a65775d89c6498c4c148e3bda096 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luis=20L=C3=BCrenbaum?= <luis.luerenbaum@redbots.de>
Date: Fri, 27 Sep 2024 11:13:37 +0200
Subject: [PATCH] feat: Added option to upload random profile pictures when
 importing users from a file.

---
 lib/import_user.py          | 21 +++++++++++++++++++--
 lib/random_user.py          |  2 +-
 user_import_udm_rest_api.py |  3 ++-
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/lib/import_user.py b/lib/import_user.py
index 9fd169e..9ca95ec 100644
--- a/lib/import_user.py
+++ b/lib/import_user.py
@@ -1,6 +1,9 @@
 # SPDX-FileCopyrightText: 2023 Bundesministerium des Innern und für Heimat, PG ZenDiS "Projektgruppe für Aufbau ZenDiS"
 # SPDX-License-Identifier: Apache-2.0
 
+import base64
+import glob
+import random
 import re
 import sys
 import logging
@@ -8,7 +11,8 @@ import pandas as pd
 
 class ImportUser:
 
-    def __init__(self, callback,  import_filename, create_admin_accounts = False):
+    def __init__(self, callback,  import_filename, create_admin_accounts = False, use_images = False):
+        self.input_dir_imgs_base = "./data/images_"
         self.input_file = import_filename
         self.skip_rows = 0
         self.columnnames_map = {
@@ -80,8 +84,21 @@ class ImportUser:
             if 'organisation' not in person or pd.isna(person['organisation']):
                 person['organisation'] = person['email'].rpartition('@')[-1]
             person['is_admin'] = False
+            if use_images:
+                person["jpegPhoto"] = self.__get_image()
             callback(person)
             if create_admin_accounts:
                 person['username'] = person['username']+'-admin'
                 person['is_admin'] = True
-                callback(person)
\ No newline at end of file
+                callback(person)
+
+    def __get_image(self):
+        if (not hasattr(self, "input_filelist_img_list")):
+            self.input_filelist_img_list= []
+        if (len(self.input_filelist_img_list) == 0):
+            for gender in ("m", "f"):
+                self.input_filelist_img_list.extend(glob.glob(self.input_dir_imgs_base+gender+'/*.jpg'))
+
+        selected_image = random.choice(self.input_filelist_img_list)
+        with open(selected_image, "rb") as image_file:
+            return base64.b64encode(image_file.read()).decode()
\ No newline at end of file
diff --git a/lib/random_user.py b/lib/random_user.py
index 957f8c9..406dddf 100644
--- a/lib/random_user.py
+++ b/lib/random_user.py
@@ -49,7 +49,7 @@ class RandomUser:
 
     def __get_random_list_entry(self, category):
         if not category in self.lists:
-            with open(self.input_files_list[category]) as f:
+            with open(self.input_files_list[category], encoding="utf-8") as f:
                 lines_with_comments = f.read().splitlines()
             self.lists[category] = [entry for entry in lines_with_comments if not entry.startswith('#')]
         return random.choice(self.lists[category])
diff --git a/user_import_udm_rest_api.py b/user_import_udm_rest_api.py
index 0bc1676..d27ac7e 100755
--- a/user_import_udm_rest_api.py
+++ b/user_import_udm_rest_api.py
@@ -42,6 +42,7 @@ p.add('--create_oxcontexts', env_var='CREATE_OXCONTEXT', default=False, help='Op
 p.add('--default_oxcontext', env_var='DEFAULT_OXCONTEXT', default=1, help='Optional: Set the default OX context ID to use when creating users.')
 p.add('--import_domain', env_var='IMPORT_DOMAIN', required=True, help='The domain name of your openDesk instance - omit the "portal." or other service specific hostnames.')
 p.add('--import_filename', env_var='IMPORT_FILENAME', required=False, default=None, help='The filename containing the user account details for the import - see template.ods for reference. If filename is not provided or related file is not found random users will be imported.')
+p.add('--import_use_images', env_var='IMPORT_USE_IMAGES', default=False, help='Optional: Set to "True" if each user should be uploaded with a random profile picture when "import_filename" was set.')
 p.add('--import_maildomain', env_var='IMPORT_MAILDOMAIN', required=False, help='Optional: If you are using a different maildomain please specify it, otherwise `IMPORT_DOMAIN` is used.')
 p.add('--import_random_amount', env_var='IMPORT_RANDOM_AMOUNT', default=10, help='The number of random accounts to import if the "import_filename" was not set or found.')
 p.add('--loglevel', env_var='LOGLEVEL', default='INFO', help='Set the loglevel: DEBUG, INFO, WARNING, ERROR, CRITICAL. Default: WARNING')
@@ -95,7 +96,7 @@ if not options.import_filename:
     logging.info(f"Accounts that have been created:\n{ucs.get_imported_credentials_list()}")
 elif os.path.isfile(options.import_filename):
     logging.info(f"Importing users from '{options.import_filename}'")
-    ImportUser(import_callback, import_filename=options.import_filename, create_admin_accounts=options.create_admin_accounts)
+    ImportUser(import_callback, import_filename=options.import_filename, create_admin_accounts=options.create_admin_accounts, use_images=options.import_use_images)
 else:
     logging.error(f"File to import from '{options.import_filename}' was not found.")
 
-- 
GitLab