Send notifications individually.
authorMatthijs Kooijman <matthijs@stdin.nl>
Sat, 31 Jan 2009 10:14:40 +0000 (11:14 +0100)
committerMatthijs Kooijman <matthijs@stdin.nl>
Sat, 31 Jan 2009 10:14:40 +0000 (11:14 +0100)
Previously, a notification was sent as a single message with multiple
recipients. Now, each of the recipients gets his or her own message.
This prepares for sending notification to many users.

templates/influences/email/character_changed.html
templates/influences/email/influence_changed.html
templates/influences/email/influence_comment_added.html
tools/notify.py

index c858119ad3d1c9a04a4dfe478b3e4d6b5d7e8def..524f64dd112f746a6e3165cee32ce9357df76c74 100644 (file)
@@ -9,8 +9,8 @@ Subject: {% blocktrans %}Character "{{ character }}" created.{% endblocktrans %}
 Subject: {% blocktrans %}Character "{{ character }}" was changed.{% endblocktrans %}
 {% endif%}
 \\
-{% if recipients.0.first_name %}
-{% blocktrans with recipients.0.first_name as name %}Hello {{ name }}{% endblocktrans %},
+{% if first_name %}
+{% blocktrans %}Hello {{ first_name }}{% endblocktrans %},
 {% else %}
 {% trans "L.S." %},
 {% endif %}
index 3c563373e0d847d18da15b17a39fe8112e30e5e9..ee08310c79718fce18ed9eca42ac29a947f64798 100644 (file)
@@ -9,8 +9,8 @@ Subject: {% blocktrans %}Influence "{{ influence }}" submitted.{% endblocktrans
 Subject: {% blocktrans %}Influence "{{ influence }}" was changed.{% endblocktrans %}
 {% endif%}
 \\
-{% if recipients.0.first_name %}
-{% blocktrans with recipients.0.first_name as name %}Hello {{ name }}{% endblocktrans %},
+{% if first_name %}
+{% blocktrans %}Hello {{ first_name }}{% endblocktrans %},
 {% else %}
 {% trans "L.S." %},
 {% endif %}
index 7ebe70ca52c98e57656c92e3103283b714b14ca0..60b62d26e2695e523e1f62107dc3bf6d300079c0 100644 (file)
@@ -5,8 +5,8 @@ From: Xerxes (Evolution Events)<xerxes@evolution-events.nl>
 X-Mailer: Xerxes
 Subject: {% blocktrans %}Comment added to influence "{{ influence }}".{% endblocktrans %}
 \\
-{% if recipients.0.first_name %}
-{% blocktrans with recipients.0.first_name as name %}Hello {{ name }}{% endblocktrans %},
+{% if first_name %}
+{% blocktrans %}Hello {{ first_name }}{% endblocktrans %},
 {% else %}
 {% trans "L.S." %},
 {% endif %}
index bc0b4d84336d95f835f31b6dc1a8a6cb34b22914..50eb375e2dd3b4268c8df43751334e5f594714ac 100644 (file)
@@ -8,51 +8,69 @@ Notify someone about something.
 """
 def notify(recipients, template, context = {}):
     recipients = make_iter(recipients)
-    addresses = []; 
+    # Keep a dict of address -> (firstname, lastname)
+    to = {}; 
     for r in recipients:
         if (isinstance(r, User)):
-            addresses.append(r.email)
+            to[r.email] = (r.first_name, r.last_name)
         elif (isinstance(r, Group)):
-            addresses += [m.email for m in r.user_set.all()]
+            to.update([(m.email, (m.first_name, m.last_name)) for m in r.user_set.all()])
         else:
             # Assume it is an email address
-            addresses.append(r)
-    # TODO: Make addresses unique
-
-    context['recipients'] = recipients 
-    context['addresses'] = addresses 
-
-    rendered = loader.render_to_string(template, context)
-    (headers, body) = rendered.split('\n\n', 1)
-
-    # Turn the headers into a dict so EmailMessage can turn them into a
-    # string again. Bit pointless, but it works. 
-    # Perhaps we should just use python email stuff directly. OTOH, we
-    # still always need to parse for the From header.
-
-    headers_dict = {}
-    # If no From header is present, let EmailMessage do the default
-    # thing
-    from_email = None
-    for header in headers.split('\n'):
-        (field, value) = header.split(':')
-        if (field == 'From'):
-            from_email = value
-        elif (field == 'Subject'):
-            subject = value
-        else:
-            # Don't put From and Subject in the dict, else they'll be
-            # present twice.
-            headers_dict[field] = value
-
-    msg = EmailMessage(
-        # Only setting the From address through headers won't set the
-        # envelope address right.
-        from_email = from_email,
-        subject    = subject,
-        body       = body, 
-        to         = addresses, 
-        headers    = headers_dict
-    )
-    msg.send()
+            to[r] = None
+    print to
+    for (address, name) in to.items():
+        if name is None:
+            name = (None, None)
+
+        context['first_name'] = name[0]
+        context['last_name']  = name[1]
+
+        rendered = loader.render_to_string(template, context)
+        (headers, body) = rendered.split('\n\n', 1)
+
+        # Turn the headers into a dict so EmailMessage can turn them into a
+        # string again. Bit pointless, but it works. 
+        # Perhaps we should just use python email stuff directly. OTOH, we
+        # still always need to parse for the From header.
+
+        headers_dict = {}
+        # If no From header is present, let EmailMessage do the default
+        # thing
+        from_email = None
+        subject    = ''
+        for header in headers.split('\n'):
+            (field, value) = header.split(':')
+            if (field == 'From'):
+                from_email = value
+            elif (field == 'Subject'):
+                subject = value
+            else:
+                # Don't put From and Subject in the dict, else they'll be
+                # present twice.
+                headers_dict[field] = value
+        print address, name
+        msg = EmailMessage(
+            # Only setting the From address through headers won't set the
+            # envelope address right.
+            from_email = from_email,
+            subject    = subject,
+            body       = body, 
+            to         = [make_rfc822_recipient(address, name)],
+            headers    = headers_dict
+        )
+        msg.send()
+
+def make_rfc822_recipient(address, name):
+    """
+    Creates a rfc 822 style recipient: Firstname Lastname <address@domain.nl>
+
+    Takes an address and a tuple with firstname and lastname. The tuple can
+    also be None when no name is known.
+    """
+    if name:
+        return "%s %s <%s>" % (name[0], name[1], address)
+    else:
+        return address
+
 # vim: set sts=4 sw=4 expandtab: