Skip to content

Instantly share code, notes, and snippets.

@sgammon
Created May 19, 2011 07:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sgammon/980347 to your computer and use it in GitHub Desktop.
Save sgammon/980347 to your computer and use it in GitHub Desktop.
import pipeline
from pipeline import common
from google.appengine.ext import db
from google.appengine.api import mail
from google.appengine.api import xmpp
###### Models ######
class User(db.Model):
email = db.StringProperty(default=None)
jid = db.StringProperty(default=None)
class EmailList(db.Model):
name = db.StringProperty()
users = db.ListProperty(db.Key)
###### Pipelines ######
class EmailMessage(pipeline.Pipeline):
async = True
def run(self, to, subject, body):
start_expensive_remote_task()
task = self.get_callback_task(countdown=300, name='emailmessage-' + self.pipeline_id)
try:
task.add(self.queue_name)
except (taskqueue.TombstonedTaskError, taskqueue.TaskAlreadyExistsError):
pass
def callback(self):
message = mail.MailMessage(to=to)
self.complete(message.send())
class XMPPMessage(pipeline.Pipeline):
def run(self, jid, message):
return xmpp.send_message(jid, message)
class EmailOrXMPPBlast(pipeline.Pipeline):
def run(self, key, subject, body):
e_list = EmailList.get(key)
email_messages = []
users = db.get(e_list.users)
for user in users:
if user.email != None:
sent_message = yield EmailMessage(to=user.email, subject=subject, body=body)
email_messages.append(sent_message)
elif user.xmpp != None:
yield XMPPMessage(jid=user.jid, message=body)
result = yield common.Dict(users=[str(u) for u in users], results=email_messages)
yield common.Return(result)
------------------------------------------------------------------------------------
e = EmailNewsletterBlast(some_key, 'subject', 'body')
e.start(queue_name='whatever')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment