ajout limite, ModeleCourriel.__unicode__
authorBéranger Enselme <beranger.enselme@auf.org>
Thu, 19 Jul 2012 20:35:41 +0000 (16:35 -0400)
committerBéranger Enselme <beranger.enselme@auf.org>
Thu, 19 Jul 2012 20:35:41 +0000 (16:35 -0400)
auf/django/mailing/models.py
setup.py
tests/tests.py

index 4634ff0..6ddc157 100644 (file)
@@ -55,6 +55,9 @@ class ModeleCourriel(models.Model):
     sujet = CharField(max_length=256)
     corps = TextField()
     html = BooleanField(verbose_name=u"Le corps est au format HTML")
+    
+    def __unicode__(self):
+        return self.code + u" / " + self.sujet
 
 
 TAILLE_JETON = 32
@@ -121,17 +124,38 @@ class EntreeLog(models.Model):
     erreur = TextField(null=True)
 
 @transaction.commit_manually
-def envoyer(code_modele, adresse_expediteur, site=None, url_name=None):
+def envoyer(code_modele, adresse_expediteur, site=None, url_name=None,
+            limit=None, retry_errors=True):
+    u"""
+    Cette fonction procède à l'envoi proprement dit, pour toutes les enveloppes
+    du modele ayant pour code :code_modele. Si ``site``, ``url_name`` sont spécifiés
+    et que les enveloppes passent un paramètre ``jeton`` dans leur contexte,
+    une url sera générée et passée comme variable au template.
+    :param code_modele: le code du modèle pour lequel faire l'envoi
+    :param adresse_expediteur:
+    :param site: une instance de django.contrib.sites (pour la génération de l'URL)
+    :param url_name: le nom de l'URL à générer
+    :param limit: indique un nombre maximal de courriels à envoyer pour cet appel
+    :param retry_errors: les envois en erreur doivent-ils être retentés ou non ?
+
+    .. warning:: L'utilisation conjointe d'une limite (paramètre ``limit``) et
+     de ``retry_errors`` pourrait faire en sorte que certains courriels ne soient
+     jamais envoyés (si il y a plus de courriels en erreur que ``limit``)
+    """
     modele = ModeleCourriel.objects.get(code=code_modele)
     enveloppes = Enveloppe.objects.filter(modele=modele)
     temporisation = getattr(settings, 'MAILING_TEMPORISATION', 2)
+    counter = 0
     try:
         for enveloppe in enveloppes:
             # on vérifie qu'on n'a pas déjà envoyé ce courriel à
             # cet établissement et à cette adresse
             adresse_envoi = enveloppe.get_adresse()
             entree_log = EntreeLog.objects.filter(enveloppe=enveloppe,
-                erreur__isnull=True, adresse=adresse_envoi)
+                adresse=adresse_envoi)
+            if retry_errors:
+                entree_log = entree_log.filter(erreur__isnull=True)
+
             if entree_log.count() > 0:
                 continue
 
@@ -164,11 +188,14 @@ def envoyer(code_modele, adresse_expediteur, site=None, url_name=None):
                 entree_log.enveloppe = enveloppe
                 entree_log.adresse = adresse_envoi
                 message.send()
+                counter += 1
                 time.sleep(temporisation)
             except smtplib.SMTPException as e:
                 entree_log.erreur = e.__str__()
             entree_log.save()
             transaction.commit()
+            if limit and counter >= limit:
+                break
     except:
         transaction.rollback()
         raise
index 4ae3316..c2489e6 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
 from setuptools import setup, find_packages
 
 name = 'auf.django.mailing'
-version = '0.3'
+version = '0.4'
 
 setup(
     name=name,
index 16901e7..cec3cff 100644 (file)
@@ -49,20 +49,21 @@ class MailTest(TestCase):
             sujet='sujet_modele',  corps='{{ nom_destinataire }}{{ url }}',
             html=False)
         self.modele_courriel.save()
+        mail.outbox = []
 
     def get_site(self):
         return Site.objects.all()[0]
 
-    def create_enveloppe_params(self):
+    def create_enveloppe_params(self, dest):
         enveloppe = Enveloppe(modele=self.modele_courriel)
         enveloppe.save()
-        enveloppe_params = TestEnveloppeParams(enveloppe=enveloppe, destinataire=self.dest1)
+        enveloppe_params = TestEnveloppeParams(enveloppe=enveloppe, destinataire=dest)
         enveloppe_params.save()
         return enveloppe, enveloppe_params
 
 
     def test_envoi_simple(self):
-        enveloppe, enveloppe_params = self.create_enveloppe_params()
+        enveloppe, enveloppe_params = self.create_enveloppe_params(self.dest1)
 
         envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy')
 
@@ -91,17 +92,34 @@ class MailTest(TestCase):
         entrees_log = EntreeLog.objects.all()
         self.assertEqual(len(entrees_log), 2)
 
+        # mais pas si on demande que les erreurs ne soient pas retentées
+        EntreeLog.objects.all()[1].delete()
+        envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy', retry_errors=False)
+        self.assertEqual(len(mail.outbox), 2)
+        entrees_log = EntreeLog.objects.all()
+        self.assertEqual(len(entrees_log), 1)
+
         entrees_log[0].delete()
 
         # le courriel devrait également être renvoyé si l'adresse du destinataire
         # a changé
+        envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy', retry_errors=False)
         self.dest1.adresse_courriel = 'autre_adresse@test.org'
         self.dest1.save()
         envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy')
-        self.assertEqual(len(mail.outbox), 3)
+        self.assertEqual(len(mail.outbox), 4)
         entrees_log = EntreeLog.objects.all()
         self.assertEqual(len(entrees_log), 2)
 
+    def test_limit(self):
+        self.create_enveloppe_params(self.dest1)
+        self.create_enveloppe_params(self.dest2)
+        envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy', limit=1, retry_errors=False)
+        self.assertEqual(len(mail.outbox), 1)
+        envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy', limit=1, retry_errors=False)
+        self.assertEqual(len(mail.outbox), 2)
+
+