diff --git a/loko/common/management/commands/create_users_from_file.py b/loko/common/management/commands/create_users_from_file.py index 23ccb56..364dfd0 100644 --- a/loko/common/management/commands/create_users_from_file.py +++ b/loko/common/management/commands/create_users_from_file.py @@ -98,6 +98,12 @@ class Command(BaseCommand): default=False, help="Si spécifié, met à jour la configuration des utilisateurs déjà existants au lieu de les ignorer.", ) + parser.add_argument( + "--reset-passwords", + action="store_true", + default=False, + help="Régénère un nouveau mot de passe pour les utilisateurs existants lors d'une mise à jour.", + ) def handle(self, *args, **options): input_file = options["file"] @@ -108,8 +114,9 @@ class Command(BaseCommand): desktop_url = options["desktop_url"] mobile_url = options["mobile_url"] install_url = options["install_url"] - dry_run = options["dry_run"] update_existing = options["update_existing"] + reset_passwords = options.get("reset_passwords", False) + dry_run = options["dry_run"] if dry_run: self.stdout.write(self.style.WARNING("=== MODE SIMULATION (DRY-RUN) : Aucune modification en base ===")) @@ -126,12 +133,12 @@ class Command(BaseCommand): source_config = UserConfig.objects.get(user=source_user) except UserConfig.DoesNotExist: raise CommandError( - f"L'utilisateur source '{source_user.username}' n'a pas de UserConfig associée à dupliquer." + f"L'utilisateur source '{source_user.username}' ne possède pas de configuration (UserConfig)." ) self.stdout.write( self.style.SUCCESS( - f"Utilisateur source sélectionné : {source_user.username} ({source_user.get_full_name() or source_user.email})" + f"Utilisateur modèle source validé : {source_user.username} ({source_user.get_full_name() or source_user.email})" ) ) @@ -203,6 +210,16 @@ class Command(BaseCommand): existing_user = User.objects.filter(email__iexact=email).first() if not existing_user and given_username: existing_user = User.objects.filter(username__iexact=given_username).first() + if not existing_user and not given_username and first_name and last_name: + # Vérifier si un utilisateur existant porte déjà le même prénom et nom avec le login standard + candidate = generate_username(first_name, last_name, set()) + match_user = User.objects.filter(username__iexact=candidate).first() + if ( + match_user + and match_user.first_name.lower() == first_name.lower() + and match_user.last_name.lower() == last_name.lower() + ): + existing_user = match_user if existing_user and not update_existing: self.stdout.write( @@ -226,7 +243,10 @@ class Command(BaseCommand): # Générer ou réutiliser le login if existing_user: username = existing_user.username - password = "[CONSERVÉ]" + if reset_passwords: + password = generate_secure_password(20) + else: + password = "[CONSERVÉ]" user_obj = existing_user action_label = "Mis à jour" else: @@ -265,6 +285,10 @@ class Command(BaseCommand): user_obj.first_name = first_name if last_name: user_obj.last_name = last_name + if email: + user_obj.email = email + if reset_passwords and password and password != "[CONSERVÉ]": + user_obj.set_password(password) user_obj.save() count_updated += 1