forked from progrium/remindify
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmodels.py
More file actions
96 lines (81 loc) · 3.37 KB
/
models.py
File metadata and controls
96 lines (81 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from google.appengine.ext import db
from google.appengine.api import urlfetch
from google.appengine.api import mail
import urllib
from dateutil import parser
import logging
from encode import *
import os
import time
def parse_time(tz, text):
# TODO: modify to parse send-date as well for relative time expressions
max_tries = 3
for _try in range(max_tries):
try:
response = urlfetch.fetch('http://www.timeapi.org/%s/%s' % (tz.lower(), urllib.quote(text)))
if response.status_code == 200:
return response.content
elif response.status_code == 500:
logging.info( 'TimeAPI returned 500 on "%s"' % text )
except Exception(e):
logging.info( 'TimeAPI fetch failed with "%s"' % str(e) )
def create_reminder( s, tz, user ):
try:
reminder = Reminder( parse=s, timezone=tz, user=user )
reminder.put()
return reminder
except:
logging.error( 'Failed to create Reminder for request "%s"' % s )
class Reminder(db.Model):
# TODO: replace user with account reference, to avoid needless queries
user = db.UserProperty(required=True)
raw = db.StringProperty(required=True)
text = db.StringProperty()
scheduled_raw = db.StringProperty()
scheduled = db.DateTimeProperty()
created = db.DateTimeProperty(auto_now_add=True)
updated = db.DateTimeProperty(auto_now=True)
fired = db.BooleanProperty(default=False)
#TODO: recurrence
def __init__(self, *args, **kwargs):
if 'parse' in kwargs:
kwargs['text'], kwargs['scheduled_raw'] = self.parse(kwargs['parse'], kwargs['timezone'])
kwargs['scheduled'] = parser.parse(kwargs['scheduled_raw'])
kwargs['raw'] = kwargs['parse']
super(Reminder, self).__init__(*args, **kwargs)
def scheduled_local(self):
return parser.parse(self.scheduled_raw)
def parse(self, raw, timezone):
ats = raw.split(' at ')
if len(ats) == 2:
return (ats[0], parse_time(timezone, 'at %s' % ats[1]))
ins = raw.split(' in ')
if len(ins) == 2:
return (ins[0], parse_time(timezone, 'in %s' % ins[1]))
return raw, None
def parse_and_update(self, raw, timezone):
self.scheduled_raw = parse_time(timezone, raw)
logging.info( 'parse_and_update returned raw: ' + str(self.scheduled_raw) )
self.scheduled = self.scheduled_local()
self.fired = False
def account_for_sender( sender ):
if '<' in sender:
sender = sender.split('<')[-1].split('>')[0]
accts = Account.gql( "WHERE emails = :sender", sender=sender ).fetch(2)
if not accts:
return None
if len( accts ) > 1:
logging.error( 'Matched multiple accounts for sender %s---this should not happen' % sender )
return None
return accts[ 0 ]
class Account(db.Model):
user = db.UserProperty(required=True)
emails = db.StringListProperty( )
tz = db.StringProperty(default='PDT')
timezones = [ 'PST', 'PDT', 'MST', 'MDT', 'CST', 'CDT', 'EST', 'EDT' ]
def __init__(self, *args, **kwargs):
if 'emails' not in kwargs:
kwargs['emails'] = []
if kwargs['user'].email() not in kwargs['emails']:
kwargs['emails'].append( kwargs['user'].email() )
super(Account, self).__init__(*args, **kwargs)