diff --git a/loko/common/management/commands/create_users_from_file.py b/loko/common/management/commands/create_users_from_file.py index e915084..23ccb56 100644 --- a/loko/common/management/commands/create_users_from_file.py +++ b/loko/common/management/commands/create_users_from_file.py @@ -302,12 +302,12 @@ class Command(BaseCommand): "source_user": source_user.username, }) - # URL Outlook Web Deep Link pour composer directement + # URL Outlook Web Deep Link pour composer directement (%20 au lieu de + pour les espaces) deeplink_params = urllib.parse.urlencode({ "to": email, "subject": subject, "body": body, - }) + }, quote_via=urllib.parse.quote) outlook_deeplink = f"https://outlook.cloud.microsoft/mail/deeplink/compose?{deeplink_params}" drafts_payload.append({ diff --git a/loko/scripts/create_outlook_drafts.py b/loko/scripts/create_outlook_drafts.py index 635b3ec..3daa50c 100755 --- a/loko/scripts/create_outlook_drafts.py +++ b/loko/scripts/create_outlook_drafts.py @@ -94,8 +94,8 @@ def main(): parser.add_argument( "--delay", type=float, - default=2.5, - help="Délai en secondes entre l'ouverture de chaque brouillon en mode automatique (défaut : 2.5s).", + default=6.0, + help="Délai en secondes entre l'ouverture de chaque brouillon en mode automatique (défaut : 6.0s).", ) parser.add_argument( "--step", @@ -103,6 +103,12 @@ def main(): default=False, help="Mode pas-à-pas : demande confirmation avant d'ouvrir chaque brouillon.", ) + parser.add_argument( + "--only", + type=str, + default=None, + help="Filtre pour n'ouvrir que les brouillons correspondant à ce texte (nom, email ou login).", + ) parser.add_argument( "--dry-run", action="store_true", @@ -136,6 +142,18 @@ def main(): print("Aucun brouillon trouvé dans la charge utile.") return + if args.only: + pattern = args.only.lower() + drafts = [ + d + for d in drafts + if pattern in d.get("to", "").lower() + or pattern in d.get("first_name", "").lower() + or pattern in d.get("last_name", "").lower() + or pattern in d.get("username", "").lower() + ] + print(f"Filtre '{args.only}' appliqué : {len(drafts)} brouillon(s) sélectionné(s).") + print(f"Chargement de {len(drafts)} brouillon(s) depuis {payload_file.name}...") # Mode HTML @@ -189,17 +207,19 @@ def main(): for idx, item in enumerate(drafts, start=1): to_email = item.get("to", "") subject = item.get("subject", "") - deeplink = item.get("outlook_deeplink") first_name = item.get("first_name", "") last_name = item.get("last_name", "") - - if not deeplink: - params = urllib.parse.urlencode({ + # Reconstruire le deep link pour garantir l'encodage %20 des espaces (supprime les '+' intempestifs) + body = item.get("body", "") + params = urllib.parse.urlencode( + { "to": to_email, "subject": subject, - "body": item.get("body", ""), - }) - deeplink = f"https://outlook.cloud.microsoft/mail/deeplink/compose?{params}" + "body": body, + }, + quote_via=urllib.parse.quote, + ) + deeplink = f"https://outlook.cloud.microsoft/mail/deeplink/compose?{params}" print(f"[{idx}/{len(drafts)}] {first_name} {last_name} <{to_email}>")