Projet

Général

Profil

Development #63778

emails, accepter une lazylist de destinataires

Ajouté par Frédéric Péters il y a environ 2 ans. Mis à jour il y a environ 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
10 avril 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

On gère une possibilité de liste,

            if isinstance(dest, list):
                addresses.extend(dest)
                continue

et la possibilité d'une longue chaine avec des adresses séparées par des virgules, mais on devrait aussi pouvoir accepter une "lazylist", ne pas avoir à construire de chaine.


Fichiers


Demandes liées

Lié à w.c.s. - Development #60513: Pouvoir envoyer des mails en masse Fermé11 janvier 202225 mars 2022

Actions

Révisions associées

Révision 6b59e361 (diff)
Ajouté par Frédéric Péters il y a environ 2 ans

workflows: allow sending emails to lazy lists (#63778)

Historique

#2

Mis à jour par Frédéric Péters il y a environ 2 ans

#3

Mis à jour par Frédéric Péters il y a environ 2 ans

  • Assigné à mis à Frédéric Péters
#4

Mis à jour par Frédéric Péters il y a environ 2 ans

Une lazylist d'adresses mais également une lazylist de (lazy ou pasa) users (sur le modèle de ce qui a été fait pour les notifs, mais sans la partie uuid).

#5

Mis à jour par Lauréline Guérin il y a environ 2 ans

  • Statut changé de Solution proposée à Solution validée
#6

Mis à jour par Thomas Noël il y a environ 2 ans

  • Statut changé de Solution validée à Solution proposée

Je me permets de dévalider.

Sans trop d'importance d'abord, je pense que le test

            if not dest:
                continue

pourrait être posé après la transformation de la LazyList en list.

Mais plus important, dans l'idée que dest peut maintenant contenir tout autre chose que du str, ajouter avant la gestion de la présence de "@" :

+   if isinstance(dest, (LazyUser, get_publisher().user_class)):
+      dests.extend(dest)
+      continue
+
+   if not isinstance(dest, str):   <--- parce que je pense qu'on ne veut rien gérer d'autre comme type
+      # logguer un truc ou pas
+      continue
+
    if '@' in str(dest):
       ...
#7

Mis à jour par Frédéric Péters il y a environ 2 ans

pourrait être posé après la transformation de la LazyList en list.

Il y a un __nonzero__ sur LazyList, si elle est vide on prendra déjà le chemin du continue.

Pour la suite j'ai repris davantage le code, principalement pour accepter les autres itérables (en imaginant pas impossible de recevoir un set); ça donne en gros :

si pas str:
    unlazy l'éventuelle lazy list
    si itérable:
        tout ajouter
    continue
traiter le cas str
#9

Mis à jour par Thomas Noël il y a environ 2 ans

  • Statut changé de Solution proposée à Solution validée

Juste pour être sûr qu'on s'entend : on ne considère pas le cas où self.to n'est pas itérable et est un user ?

Notant que ce n'est pas l'objet du ticket... je valide déjà le présent patch.

#10

Mis à jour par Frédéric Péters il y a environ 2 ans

Juste pour être sûr qu'on s'entend : on ne considère pas le cas où self.to n'est pas itérable et est un user ?

Je ne comprenais pas je me demandais si ça faisait référence à :

        # this works around the fact that parametric workflows only support
        # string values, so if we get set a string, we convert it here to an
        # array.
        if isinstance(self.to, str):
            self.to = [self.to]

(i.e. on gère l'éventuel cas où self.to serait une chaine).

Mais à essayer de mettre en rapport ton commentaire et le patch, la question porterait non pas sur self.to mais sur dest, qu'on obtient en "donnée complexe", et qui pourrait être LazyUser, et ça ferait

+            if not isinstance(dest, str):
+                if isinstance(dest, LazyList):
+                    dest = list(dest)
+                if isinstance(dest, collections.abc.Iterable):
+                    dests.extend(dest)
                 continue

"continue" sans toucher à dests.

~~

Si c'est bien ça, tant qu'à y penser maintenant autant le faire, je viens de modifier pour avoir

            if isinstance(dest, (LazyUser, get_publisher().user_class)):
                dests.append(dest)
                continue

et j'ai ajouté le test approprié,

+    formdata.user_id = user1.id
+    pub.substitutions.feed(formdata)
+    item.to = ['{{form_user}}']
+    emails.empty()
+    item.perform(formdata)
+    get_response().process_after_jobs()
+    assert emails.count() == 1
+    assert set(formdata.evolution[-1].parts[-1].addresses) == {'user1@example.com'}
#11

Mis à jour par Benjamin Dauvergne il y a environ 2 ans

  • Statut changé de Solution proposée à Solution validée
#12

Mis à jour par Frédéric Péters il y a environ 2 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 6b59e3614566c3378c18bd1cda160fda16f5806f
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sun Apr 10 19:45:22 2022 +0200

    workflows: allow sending emails to lazy lists (#63778)
#13

Mis à jour par Transition automatique il y a environ 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
#14

Mis à jour par Transition automatique il y a presque 2 ans

Automatic expiration

Formats disponibles : Atom PDF