Add an e-mail dispatcher that can be used to send messages via the website. Add base and invitation templates that can be used with email dispatcher to send invitation emails. Please read the module doc string for more information how to use it.
authorPawel Solyga <Pawel.Solyga@gmail.com>
Sun, 16 Nov 2008 12:48:23 +0000
changeset 484 6364f8b0656b
parent 483 70f21691b0e1
child 485 2865922ea06a
Add an e-mail dispatcher that can be used to send messages via the website. Add base and invitation templates that can be used with email dispatcher to send invitation emails. Please read the module doc string for more information how to use it. Patch by: Lennard de Rijk, Pawel Solyga
app/soc/logic/dicts.py
app/soc/logic/mail_dispatcher.py
app/soc/templates/soc/mail/base.html
app/soc/templates/soc/mail/invitation.html
--- a/app/soc/logic/dicts.py	Sat Nov 15 21:46:23 2008 +0000
+++ b/app/soc/logic/dicts.py	Sun Nov 16 12:48:23 2008 +0000
@@ -19,11 +19,31 @@
 
 __authors__ = [
   '"Sverre Rabbelier" <sverre@rabbelier.nl>',
+  '"Lennard de Rijk" <ljvderijk@gmail.com>',
   ]
 
 
+def filter(target, keys):
+  """Filters a dictonary to only allow items with the given keys.
+  
+  Args:
+    target: The dictionary that is to be filtered
+    keys: The list with keys to filter the dictionary on
+  
+  Returns:
+    A dictionary that only contains the (key,value) from target that have their key in keys
+  """
+  result = {}
+  
+  for key, value in target.iteritems():
+    if key in keys:
+      result[key] = value
+  
+  return result
+
+
 def merge(target, updates):
-  """Like the builtin 'update' method but does not overwrite existing values
+  """Like the builtin 'update' method but does not overwrite existing values.
 
   Args:
     target: The dictionary that is to be updated, may be None
@@ -42,8 +62,9 @@
 
   return target
 
+
 def zip(keys, values):
-  """Returns a dict containing keys with values
+  """Returns a dict containing keys with values.
 
   If there are more items in keys than in values, None will be used.
   If there are more items in values than in keys, they will be ignored.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/logic/mail_dispatcher.py	Sun Nov 16 12:48:23 2008 +0000
@@ -0,0 +1,118 @@
+#!/usr/bin/python2.5
+#
+# Copyright 2008 the Melange authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Functions used to send email messages.
+
+The following are the possible fields of an email message:
+
+  sender: The email address of the sender, the From address. This must be the 
+    email address of a registered administrator for the application, or the
+    address of the current signed-in user. Administrators can be added to
+    an application using the Administration Console. The current user's email
+    address can be determined with the Users API.
+  to: A recipient's email address (a string) or a list of email addresses to 
+    appear on the To: line in the message header.
+  cc: A recipient's email address (a string) or a list of email addresses to 
+    appear on the Cc: line in the message header.
+  bcc: A recipient's email address (a string) or a list of email addresses to 
+    receive the message, but not appear in the message header ("blind carbon 
+    copy").
+  reply_to: An email address to which a recipient should reply instead of the 
+    sender address, the Reply-To: field.
+  subject: The subject of the message, the Subject: line.
+  body: The plaintext body content of the message.
+  html: An HTML version of the body content, for recipients that 
+    prefer HTML email.
+  attachments: The file attachments for the message, as a list of two-value 
+    tuples, one tuple for each attachment. Each tuple contains a filename as 
+    the first element, and the file contents as the second element.
+    An attachment file must be one of the allowed file types, and the 
+    filename must end with an extension that corresponds with the type. 
+    For a list of allowed types and filename extensions, see Allowed 
+    Attachment Types.
+
+Usage:
+
+  context = { 'sender': 'melange-noreply@foo.com',
+              'to': 'bob@bar.com',
+              'subject': 'You have been invited to become a Host',
+              'sender_name': 'Alice',
+              'to_name': 'Melange Team',
+              'role': 'Host',
+              'group': 'Google Summer of Code 2009',
+              'invitation_url': 'http://invitation-url'}
+
+  sendMailUsingTemplate('soc/mail/invitation.html', context)
+"""
+
+__authors__ = [
+  '"Lennard de Rijk" <ljvderijk@gmail.com>',
+  '"Pawel Solyga" <pawel.solyga@gmail.com',
+  ]
+
+
+from django.template import loader
+
+from google.appengine.api import mail
+
+from soc.logic import dicts
+
+
+def sendMailFromTemplate(template, context):
+  """Sends out an email using a Django template.
+  
+  If 'html' is present in context dictionary it is overwritten with
+  template HTML output.
+  
+  Args:
+    template: the template (or search list of templates) to use
+    context: The context supplied to the template and email (dictionary)
+  
+  Raises:
+    Error that corresponds with the first problem it finds ff the message 
+    is not properly initialized.
+
+    List of all possible errors:
+      http://code.google.com/appengine/docs/mail/exceptions.html
+  """
+  # render the template and put in context with 'html' as key
+  context['html'] = loader.render_to_string(template, dictionary=context)
+
+  # filter out the unneeded values in context to keep sendMail happy
+  sendMail(dicts.filter(context, mail.EmailMessage.PROPERTIES))
+
+
+def sendMail(context):
+  """Sends out an email using context to supply the needed information.
+  
+  Args:
+    context : The context supplied to the email message (dictionary)
+
+  Raises:
+    Error that corresponds with the first problem it finds ff the message 
+    is not properly initialized.
+
+    List of all possible errors:
+      http://code.google.com/appengine/docs/mail/exceptions.html
+  """
+  
+  # construct the EmailMessage from the given context
+  message = mail.EmailMessage(**context)
+  
+  message.check_initialized()
+  
+  # send the message
+  message.send()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/templates/soc/mail/base.html	Sun Nov 16 12:48:23 2008 +0000
@@ -0,0 +1,40 @@
+{% comment %}
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+{% endcomment %}
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+	<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+</head>
+
+<body>
+	<div id="greeting">
+	    <p>
+		{% block greeting %}
+		Hi {{ to_name }},
+		{% endblock %}
+		</p>
+	</div>
+	
+	<div id="content">
+		<p>{% block content %}{% endblock %}</p>
+	</div>
+	
+	<div id="signature">
+		<p>
+		{% block signature %}Greetings, <br />{{ sender_name }}{% endblock %}
+		</p>
+	</div>
+</body>
+
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/templates/soc/mail/invitation.html	Sun Nov 16 12:48:23 2008 +0000
@@ -0,0 +1,19 @@
+{% extends "soc/mail/base.html" %}
+{% comment %}
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+{% endcomment %}
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+{% block content %}
+You have been invited by {{ sender_name }} to become a {{ role }} for {{ group }}.
+Please click <a href="{{ invitation_url }}">here</a> to fill in the necessary information and accept the invitation.
+{% endblock %}