diff --git a/dateutil.py b/dateutil.py new file mode 100644 index 0000000..0735d6c --- /dev/null +++ b/dateutil.py @@ -0,0 +1,45 @@ +import datetime + +class Eastern_tzinfo(datetime.tzinfo): + """Implementation of the Eastern timezone. + + Adapted from http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html + """ + def utcoffset(self, dt): + return datetime.timedelta(hours=-5) + self.dst(dt) + + def _FirstSunday(self, dt): + """First Sunday on or after dt.""" + return dt + datetime.timedelta(days=(6-dt.weekday())) + + def dst(self, dt): + # 2 am on the second Sunday in March + dst_start = self._FirstSunday(datetime.datetime(dt.year, 3, 8, 2)) + # 1 am on the first Sunday in November + dst_end = self._FirstSunday(datetime.datetime(dt.year, 11, 1, 1)) + + if dst_start <= dt.replace(tzinfo=None) < dst_end: + return datetime.timedelta(hours=1) + else: + return datetime.timedelta(hours=0) + + def tzname(self, dt): + if self.dst(dt) == datetime.timedelta(hours=0): + return "EST" + else: + return "EDT" + + +def date_for_new_snippet(): + """Return next Monday, unless it is Monday (0) or Tuesday (1)""" + today = datetime.datetime.now(Eastern_tzinfo()).date() + if (today.weekday() < 2): + aligned = today - datetime.timedelta(days=today.weekday()) + else: + aligned = today + datetime.timedelta(days=(7 - today.weekday())) + return aligned + +def date_for_retrieval(): + """Always return the most recent Monday.""" + today = datetime.datetime.now(Eastern_tzinfo()).date() + return today - datetime.timedelta(days=today.weekday()) diff --git a/emails.py b/emails.py index 639ce91..a1c3ff9 100644 --- a/emails.py +++ b/emails.py @@ -1,37 +1,48 @@ +import logging + from google.appengine.api import mail from google.appengine.api import taskqueue from google.appengine.ext import webapp from google.appengine.ext.webapp import util -class ReminderEmail(webapp.RequestHandler): - def get(self): - pass - taskqueue.add(url='/onereminder', params={'user': key}) - -class DigestEmail(webapp.RequestHandler): - def get(self): - # Find all users and add to queue - taskqueue.add(url='/onedigest', params={'user': key}) +from dateutil import * +from model import * -class OneReminder(webapp.RequestHandler): - def post(self): - key = self.request.get('user') - mail.send_mail(sender="Example.com Support ", - to="Albert Johnson ", - subject="Your account has been approved", - body=""" -Dear Albert: +REMINDER = """ +Hey nerd, -Your example.com account has been approved. You can now visit -http://www.example.com/ and sign in using your Google Account to -access new features. +The kids want to know what you're up to. Don't leave 'em hanging. +""" -Please let us know if you have any questions. - -The example.com Team -""") +class ReminderEmail(webapp.RequestHandler): + def __send_mail(self, recipient): + mail.send_mail(sender="snippets ", + to=recipient, + subject="Snippet time!", + body=REMINDER) -class OneDigest(webapp.RequestHandler): - def post(self): - key = self.request.get('user') + def get(self): + all_users = User.all().filter("enabled =", True).fetch(500) + for user in all_users: + # TODO: Check if one has already been submitted for this period. + self.__send_mail(user.user.email()) +class DigestEmail(webapp.RequestHandler): + def __send_mail(self, recipient, body): + mail.send_mail(sender="snippets ", + to=recipient, + subject="Snippet delivery!", + body=body) + + def __snippet_to_text(self, snippet): + divider = '-' * 30 + return '%s\n%s\n%s' % (snippet.user.user.email(), divider, snippet.text) + + def get(self): + all_users = User.all().filter("enabled =", True).fetch(500) + d = date_for_retrieval() + all_snippets = Snippet.all().filter("date =", d).fetch(500) + # TODO: Build custom emails + body = '\n\n\n'.join([self.__snippet_to_text(s) for s in all_snippets]) + for user in all_users: + self.__send_mail(user.user.email(), body) diff --git a/main.py b/main.py index 6c7c942..bde2d75 100755 --- a/main.py +++ b/main.py @@ -57,13 +57,15 @@ class UserHandler(BaseHandler): """Show a given user's snippets.""" def authed_get(self, user): - desired_user = user_from_email(self.request.get('user')) - snippets = user.snippets_set + desired_user = user_from_email(self.request.get('email')) + snippets = user.snippet_set + snippets = sorted(snippets, key=lambda s: s.date, reverse=True) self.response.headers['Content-Type'] = 'text/html' template_values = { 'current_user' : user, - 'user': desired_user + 'user': desired_user, + 'snippets': snippets } path = os.path.join(os.path.dirname(__file__), 'templates/user.html') @@ -81,6 +83,16 @@ class MainHandler(BaseHandler): """Show list of all users and acting user's settings.""" def authed_get(self, user): + # Update enabled state if requested + set_enabled = self.request.get('setenabled') + if set_enabled == '1': + user.enabled = True + user.put() + elif set_enabled == '0': + user.enabled = False + user.put() + + # Fetch user list and display all_users = User.all().fetch(500) self.response.headers['Content-Type'] = 'text/html' template_values = { diff --git a/model.py b/model.py index ac6fbe3..45d6883 100644 --- a/model.py +++ b/model.py @@ -6,7 +6,7 @@ class User(db.Model): user = db.UserProperty() following = db.ListProperty(db.Key) - enabled = db.BooleanProperty() + enabled = db.BooleanProperty(default=True) class Snippet(db.Model): user = db.ReferenceProperty(User) @@ -14,7 +14,6 @@ class Snippet(db.Model): date = db.DateProperty() def user_from_email(email): - logging.info(email) return User.all().filter("user =", users.User(email)).fetch(1)[0] def create_or_replace_snippet(user, text, date): diff --git a/receive_email.py b/receive_email.py index 8bc23f9..83dfe5d 100644 --- a/receive_email.py +++ b/receive_email.py @@ -6,54 +6,16 @@ from google.appengine.ext.webapp.mail_handlers import InboundMailHandler from google.appengine.ext.webapp import util +from dateutil import date_for_new_snippet from model import user_from_email, create_or_replace_snippet - -class Eastern_tzinfo(datetime.tzinfo): - """Implementation of the Eastern timezone. - - Adapted from http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html - """ - def utcoffset(self, dt): - return datetime.timedelta(hours=-5) + self.dst(dt) - - def _FirstSunday(self, dt): - """First Sunday on or after dt.""" - return dt + datetime.timedelta(days=(6-dt.weekday())) - - def dst(self, dt): - # 2 am on the second Sunday in March - dst_start = self._FirstSunday(datetime.datetime(dt.year, 3, 8, 2)) - # 1 am on the first Sunday in November - dst_end = self._FirstSunday(datetime.datetime(dt.year, 11, 1, 1)) - - if dst_start <= dt.replace(tzinfo=None) < dst_end: - return datetime.timedelta(hours=1) - else: - return datetime.timedelta(hours=0) - - def tzname(self, dt): - if self.dst(dt) == datetime.timedelta(hours=0): - return "EST" - else: - return "EDT" - - class ReceiveEmail(InboundMailHandler): """Receive a snippet email and create or replace snippet for this week.""" def receive(self, message): user = user_from_email(message.sender) for content_type, body in message.bodies('text/plain'): - today = datetime.datetime.now(Eastern_tzinfo()).date() - - # For now, just align to next Monday, unless it is Monday (0), Tuesday (1) - if (today.weekday() < 2): - aligned = today - datetime.timedelta(days=today.weekday()) - else: - aligned = today + datetime.timedelta(days=(7 - today.weekday())) - - create_or_replace_snippet(user, body.decode(), aligned) + create_or_replace_snippet(user, body.decode(), date_for_new_snippet()) def main(): diff --git a/templates/base.html b/templates/base.html index cc46e26..813d2a6 100644 --- a/templates/base.html +++ b/templates/base.html @@ -2,13 +2,15 @@ - {% block title %}Snippets{% endblock %} + {% block title %}snippets{% endblock %} -

Snippets

+

snippets

{% block body %} {% endblock %} diff --git a/templates/index.html b/templates/index.html index 6ecb395..2d8b714 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,13 +1,17 @@ {% extends "base.html" %} {% block body %} - {{ current_user.user.email }} -
- Currently {{ current_user.enabled }} - +

{{ current_user.user.email }}

+ currently + {% if current_user.enabled %} + enabled disable + {% else %} + disabled enable + {% endif %} +

Users

{% for user in all_users %} - {{ user.email }} + {{ user.user.email }}
{% endfor %} diff --git a/templates/user.html b/templates/user.html index e69de29..b216f39 100644 --- a/templates/user.html +++ b/templates/user.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block body %} +

{{ user.user.email }}

+ + {% for snippet in snippets %} + {{ snippet.date }}
+ {{ snippet.text }} +

+ {% endfor %} + +{% endblock %} \ No newline at end of file