Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100755 352 lines (308 sloc) 14.725 kB
8414350 @billsaysthis multiline for details and notes fields
billsaysthis authored
1 import cgi
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
2 from google.appengine.ext import webapp, db
3 from google.appengine.ext.webapp import util, template
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
4 from google.appengine.api import urlfetch, memcache, users, mail
5
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
6 from django.utils import simplejson
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
7 from django.template.defaultfilters import slugify
5cd04ac Fixed iCalendar-related imports, and added the end date to the
Matt Hancher authored
8 from icalendar import Calendar
b4ea292 Handler to bug pending events
Brian Klug authored
9 import logging, urllib, os
7bdb866 Let all members staff events.
Brian Klug authored
10 from pprint import pprint
b879063 @mdhancher Respect the local timezone (Pacific), and tidy up related imports.
mdhancher authored
11 from datetime import datetime, timedelta
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
12
4d85afa @dustball Remove staffing requirement and make members more responsible
dustball authored
13 from models import Event, Feedback, ROOM_OPTIONS, PENDING_LIFETIME
219203b @dustball Cache better
dustball authored
14 from utils import username, human_username, set_cookie, local_today, is_phone_valid, UserRights, dojo
81a81e1 @progrium adding errors for form validation, full notifications, and minor edit…
progrium authored
15 from notices import *
7742592 @progrium start of maintaining form state on errors
progrium authored
16
219203b @dustball Cache better
dustball authored
17 class DomainCacheCron(webapp.RequestHandler):
18 def post(self):
19 noop = dojo('/groups/events',force=True)
20
21
f49797a @dustball Reminders 2.0
dustball authored
22 class ReminderCron(webapp.RequestHandler):
23 def post(self):
24 self.response.out.write("REMINDERS")
25 today = local_today()
26 # remind everyone 3 days in advance they need to show up
27 events = Event.all() \
28 .filter('status IN', ['approved']) \
29 .filter('reminded =', False) \
30 .filter('start_time <', today + timedelta(days=3))
31 for event in events:
32 self.response.out.write(event.name)
33 # only mail them if they created the event 2+ days ago
34 if event.created < today - timedelta(days=2):
35 schedule_reminder_email(event)
36 event.reminded = True
37 event.put()
38
39
e2b9558 @btubbs Fixes issue 4. Changed to jqueryUI datepicker. Replaced jquery
btubbs authored
40 class ExpireCron(webapp.RequestHandler):
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
41 def post(self):
42 # Expire events marked to expire today
b879063 @mdhancher Respect the local timezone (Pacific), and tidy up related imports.
mdhancher authored
43 today = local_today()
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
44 events = Event.all() \
45 .filter('status IN', ['pending', 'understaffed']) \
46 .filter('expired >=', today) \
47 .filter('expired <', today + timedelta(days=1))
48 for event in events:
49 event.expire()
50 notify_owner_expired(event)
f49797a @dustball Reminders 2.0
dustball authored
51
f1997e4 @christopherb Made misc style fixes
christopherb authored
52
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
53 class ExpireReminderCron(webapp.RequestHandler):
54 def post(self):
55 # Find events expiring in 10 days to warn owner
b879063 @mdhancher Respect the local timezone (Pacific), and tidy up related imports.
mdhancher authored
56 ten_days = local_today() + timedelta(days=10)
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
57 events = Event.all() \
58 .filter('status IN', ['pending', 'understaffed']) \
59 .filter('expired >=', ten_days) \
60 .filter('expired <', ten_days + timedelta(days=1))
61 for event in events:
62 notify_owner_expiring(event)
63
f1997e4 @christopherb Made misc style fixes
christopherb authored
64
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
65 class EventsHandler(webapp.RequestHandler):
66 def get(self, format):
67 if format == 'ics':
a493a39 @progrium changing the json events list to the approved list
progrium authored
68 events = Event.all().filter('status IN', ['approved', 'canceled']).order('start_time')
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
69 cal = Calendar()
70 for event in events:
71 cal.add_component(event.to_ical())
72 self.response.headers['content-type'] = 'text/calendar'
73 self.response.out.write(cal.as_string())
2e08a66 @progrium cleaning things up and adding json representations for jon
progrium authored
74 elif format == 'json':
75 self.response.headers['content-type'] = 'application/json'
a493a39 @progrium changing the json events list to the approved list
progrium authored
76 events = map(lambda x: x.to_dict(summarize=True), Event.get_approved_list())
2e08a66 @progrium cleaning things up and adding json representations for jon
progrium authored
77 self.response.out.write(simplejson.dumps(events))
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
78
f1997e4 @christopherb Made misc style fixes
christopherb authored
79
ca8c7f2 @dustball Let edit events and refactor error handling
dustball authored
80 class EditHandler(webapp.RequestHandler):
81 def get(self, id):
82 event = Event.get_by_id(int(id))
83 user = users.get_current_user()
84 access_rights = UserRights(user, event)
85 if access_rights.can_edit:
86 logout_url = users.create_logout_url('/')
87 rooms = '\n'.join(event.rooms)
88 self.response.out.write(template.render('templates/edit.html', locals()))
89 else:
90 self.response.out.write("Access denied")
91
92 def post(self, id):
93 event = Event.get_by_id(int(id))
94 user = users.get_current_user()
95 access_rights = UserRights(user, event)
96 if access_rights.can_edit:
97 try:
98 if not self.request.get('estimated_size').isdigit():
99 raise ValueError('Estimated number of people must be a number')
100 if not int(self.request.get('estimated_size')) > 0:
101 raise ValueError('Estimated number of people must be greater then zero')
102 if ( self.request.get( 'contact_phone' ) and not is_phone_valid( self.request.get( 'contact_phone' ) ) ):
103 raise ValueError( 'Phone number does not appear to be valid' )
104 else:
105 event.name = self.request.get('name')
106 event.estimated_size = cgi.escape(self.request.get('estimated_size'))
107 event.contact_name = cgi.escape(self.request.get('contact_name'))
108 event.contact_phone = cgi.escape(self.request.get('contact_phone'))
109 event.details = cgi.escape(self.request.get('details'))
110 event.url = cgi.escape(self.request.get('url'))
111 event.fee = cgi.escape(self.request.get('fee'))
112 event.notes = cgi.escape(self.request.get('notes'))
113 event.rooms = self.request.get('rooms').strip().split("\n")
114 event.put()
115 self.redirect('/event/%s-%s' % (event.key().id(), slugify(event.name)))
116 except Exception, e:
117 error = str(e)
118 self.response.out.write(template.render('templates/error.html', locals()))
119 else:
120 self.response.out.write("Access denied")
121
122
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
123 class EventHandler(webapp.RequestHandler):
124 def get(self, id):
125 event = Event.get_by_id(int(id))
2e08a66 @progrium cleaning things up and adding json representations for jon
progrium authored
126 if self.request.path.endswith('json'):
127 self.response.headers['content-type'] = 'application/json'
128 self.response.out.write(simplejson.dumps(event.to_dict()))
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
129 else:
2e08a66 @progrium cleaning things up and adding json representations for jon
progrium authored
130 user = users.get_current_user()
131 if user:
766e87c @christopherb Added UserRights class.
christopherb authored
132 access_rights = UserRights(user, event)
2e08a66 @progrium cleaning things up and adding json representations for jon
progrium authored
133 logout_url = users.create_logout_url('/')
766e87c @christopherb Added UserRights class.
christopherb authored
134
2e08a66 @progrium cleaning things up and adding json representations for jon
progrium authored
135 else:
136 login_url = users.create_login_url('/')
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
137 event.details = db.Text(event.details.replace('\n','<br/>'))
138 event.notes = db.Text(event.notes.replace('\n','<br/>'))
2e08a66 @progrium cleaning things up and adding json representations for jon
progrium authored
139 self.response.out.write(template.render('templates/event.html', locals()))
e2b9558 @btubbs Fixes issue 4. Changed to jqueryUI datepicker. Replaced jquery
btubbs authored
140
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
141 def post(self, id):
142 event = Event.get_by_id(int(id))
143 user = users.get_current_user()
766e87c @christopherb Added UserRights class.
christopherb authored
144 access_rights = UserRights(user, event)
145
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
146 state = self.request.get('state')
147 if state:
766e87c @christopherb Added UserRights class.
christopherb authored
148 if state.lower() == 'approve' and access_rights.can_approve:
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
149 event.approve()
b84b533 @dustball Fix one more staff logic bomb
dustball authored
150 if state.lower() == 'staff' and access_rights.can_staff:
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
151 event.add_staff(user)
766e87c @christopherb Added UserRights class.
christopherb authored
152 if state.lower() == 'unstaff' and access_rights.can_unstaff:
72849c2 @billsaysthis added unstaff event, including email notification if event becomes un…
billsaysthis authored
153 event.remove_staff(user)
766e87c @christopherb Added UserRights class.
christopherb authored
154 if state.lower() == 'cancel' and access_rights.can_cancel:
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
155 event.cancel()
766e87c @christopherb Added UserRights class.
christopherb authored
156 if state.lower() == 'delete' and access_rights.is_admin:
a67ac50 @mdhancher Add a simple admin-only event delete and undelete.
mdhancher authored
157 event.delete()
766e87c @christopherb Added UserRights class.
christopherb authored
158 if state.lower() == 'undelete' and access_rights.is_admin:
a67ac50 @mdhancher Add a simple admin-only event delete and undelete.
mdhancher authored
159 event.undelete()
766e87c @christopherb Added UserRights class.
christopherb authored
160 if state.lower() == 'expire' and access_rights.is_admin:
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
161 event.expire()
162 if event.status == 'approved':
163 notify_owner_approved(event)
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
164 self.redirect('/event/%s-%s' % (event.key().id(), slugify(event.name)))
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
165
f1997e4 @christopherb Made misc style fixes
christopherb authored
166
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
167 class ApprovedHandler(webapp.RequestHandler):
168 def get(self):
169 user = users.get_current_user()
170 if user:
171 logout_url = users.create_logout_url('/')
172 else:
173 login_url = users.create_login_url('/')
b879063 @mdhancher Respect the local timezone (Pacific), and tidy up related imports.
mdhancher authored
174 today = local_today()
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
175 events = Event.get_approved_list()
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
176 tomorrow = today + timedelta(days=1)
d63161a Add widget mode
Brian Klug authored
177 whichbase = 'base.html'
178 if self.request.get('base'):
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
179 whichbase = self.request.get('base') + '.html'
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
180 self.response.out.write(template.render('templates/approved.html', locals()))
181
f1997e4 @christopherb Made misc style fixes
christopherb authored
182
a82b43e @billsaysthis add myevents, pastevents code, refined list display on event page
billsaysthis authored
183 class MyEventsHandler(webapp.RequestHandler):
184 @util.login_required
185 def get(self):
186 user = users.get_current_user()
187 if user:
188 logout_url = users.create_logout_url('/')
189 else:
190 login_url = users.create_login_url('/')
191 events = Event.all().filter('member = ', user).order('start_time')
b879063 @mdhancher Respect the local timezone (Pacific), and tidy up related imports.
mdhancher authored
192 today = local_today()
a82b43e @billsaysthis add myevents, pastevents code, refined list display on event page
billsaysthis authored
193 tomorrow = today + timedelta(days=1)
194 self.response.out.write(template.render('templates/myevents.html', locals()))
195
f1997e4 @christopherb Made misc style fixes
christopherb authored
196
a82b43e @billsaysthis add myevents, pastevents code, refined list display on event page
billsaysthis authored
197 class PastHandler(webapp.RequestHandler):
198 def get(self):
199 user = users.get_current_user()
200 if user:
201 logout_url = users.create_logout_url('/')
202 else:
203 login_url = users.create_login_url('/')
b879063 @mdhancher Respect the local timezone (Pacific), and tidy up related imports.
mdhancher authored
204 today = local_today()
d75579f @progrium minor updates here and there to bills contributions.
progrium authored
205 events = Event.all().filter('start_time < ', today).order('-start_time')
a82b43e @billsaysthis add myevents, pastevents code, refined list display on event page
billsaysthis authored
206 self.response.out.write(template.render('templates/past.html', locals()))
207
f1997e4 @christopherb Made misc style fixes
christopherb authored
208
b4ea292 Handler to bug pending events
Brian Klug authored
209 class CronBugOwnersHandler(webapp.RequestHandler):
210 def get(self):
211 events = Event.get_pending_list()
212 for e in events:
213 bug_owner_pending(e)
214
f1997e4 @christopherb Made misc style fixes
christopherb authored
215
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
216 class PendingHandler(webapp.RequestHandler):
217 def get(self):
218 user = users.get_current_user()
219 if user:
220 logout_url = users.create_logout_url('/')
221 else:
222 login_url = users.create_login_url('/')
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
223 events = Event.get_pending_list()
b879063 @mdhancher Respect the local timezone (Pacific), and tidy up related imports.
mdhancher authored
224 today = local_today()
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
225 tomorrow = today + timedelta(days=1)
226 self.response.out.write(template.render('templates/pending.html', locals()))
227
f1997e4 @christopherb Made misc style fixes
christopherb authored
228
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
229 class NewHandler(webapp.RequestHandler):
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
230 @util.login_required
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
231 def get(self):
232 user = users.get_current_user()
4d85afa @dustball Remove staffing requirement and make members more responsible
dustball authored
233 human = human_username(user)
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
234 if user:
235 logout_url = users.create_logout_url('/')
236 else:
237 login_url = users.create_login_url('/')
238 rooms = ROOM_OPTIONS
239 self.response.out.write(template.render('templates/new.html', locals()))
e2b9558 @btubbs Fixes issue 4. Changed to jqueryUI datepicker. Replaced jquery
btubbs authored
240
f1997e4 @christopherb Made misc style fixes
christopherb authored
241
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
242 def post(self):
243 user = users.get_current_user()
7742592 @progrium start of maintaining form state on errors
progrium authored
244 try:
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
245 start_time = datetime.strptime('%s %s:%s %s' % (
7742592 @progrium start of maintaining form state on errors
progrium authored
246 self.request.get('date'),
247 self.request.get('start_time_hour'),
248 self.request.get('start_time_minute'),
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
249 self.request.get('start_time_ampm')), '%m/%d/%Y %I:%M %p')
250 end_time = datetime.strptime('%s %s:%s %s' % (
7742592 @progrium start of maintaining form state on errors
progrium authored
251 self.request.get('date'),
252 self.request.get('end_time_hour'),
253 self.request.get('end_time_minute'),
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
254 self.request.get('end_time_ampm')), '%m/%d/%Y %I:%M %p')
8615877 Fix validation for event size
Brian Klug authored
255 if not self.request.get('estimated_size').isdigit():
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
256 raise ValueError('Estimated number of people must be a number')
8615877 Fix validation for event size
Brian Klug authored
257 if not int(self.request.get('estimated_size')) > 0:
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
258 raise ValueError('Estimated number of people must be greater then zero')
7742592 @progrium start of maintaining form state on errors
progrium authored
259 if (end_time-start_time).days < 0:
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
260 raise ValueError('End time must be after start time')
a244c65 @dustball Bug fixes
dustball authored
261 if ( self.request.get( 'contact_phone' ) and not is_phone_valid( self.request.get( 'contact_phone' ) ) ):
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
262 raise ValueError( 'Phone number does not appear to be valid' )
7742592 @progrium start of maintaining form state on errors
progrium authored
263 else:
264 event = Event(
ca3c6dd Escaped additional fields that could be used for XSS
Christopher Biettchert authored
265 name = cgi.escape(self.request.get('name')),
7742592 @progrium start of maintaining form state on errors
progrium authored
266 start_time = start_time,
267 end_time = end_time,
ca3c6dd Escaped additional fields that could be used for XSS
Christopher Biettchert authored
268 type = cgi.escape(self.request.get('type')),
269 estimated_size = cgi.escape(self.request.get('estimated_size')),
270 contact_name = cgi.escape(self.request.get('contact_name')),
271 contact_phone = cgi.escape(self.request.get('contact_phone')),
8414350 @billsaysthis multiline for details and notes fields
billsaysthis authored
272 details = cgi.escape(self.request.get('details')),
ca3c6dd Escaped additional fields that could be used for XSS
Christopher Biettchert authored
273 url = cgi.escape(self.request.get('url')),
274 fee = cgi.escape(self.request.get('fee')),
8414350 @billsaysthis multiline for details and notes fields
billsaysthis authored
275 notes = cgi.escape(self.request.get('notes')),
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
276 rooms = self.request.get_all('rooms'),
b879063 @mdhancher Respect the local timezone (Pacific), and tidy up related imports.
mdhancher authored
277 expired = local_today() + timedelta(days=PENDING_LIFETIME), # Set expected expiration date
7742592 @progrium start of maintaining form state on errors
progrium authored
278 )
279 event.put()
280 notify_owner_confirmation(event)
281 notify_new_event(event)
81a81e1 @progrium adding errors for form validation, full notifications, and minor edit…
progrium authored
282 set_cookie(self.response.headers, 'formvalues', None)
7742592 @progrium start of maintaining form state on errors
progrium authored
283 self.redirect('/event/%s-%s' % (event.key().id(), slugify(event.name)))
81a81e1 @progrium adding errors for form validation, full notifications, and minor edit…
progrium authored
284 except Exception, e:
285 message = str(e)
286 if 'match format' in message:
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
287 message = 'Date is required.'
81a81e1 @progrium adding errors for form validation, full notifications, and minor edit…
progrium authored
288 if message.startswith('Property'):
289 message = message[9:].replace('_', ' ').capitalize()
ca8c7f2 @dustball Let edit events and refactor error handling
dustball authored
290 # This is NOT a reliable way to handle erorrs
291 #set_cookie(self.response.headers, 'formerror', message)
292 #set_cookie(self.response.headers, 'formvalues', dict(self.request.POST))
293 #self.redirect('/new')
294 error = message
295 self.response.out.write(template.render('templates/error.html', locals()))
296
297
298
299
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
300
d2c3dc7 @billsaysthis moved app-specific js to separate file
billsaysthis authored
301
302 class FeedbackHandler(webapp.RequestHandler):
303 @util.login_required
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
304 def get(self, id):
d2c3dc7 @billsaysthis moved app-specific js to separate file
billsaysthis authored
305 user = users.get_current_user()
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
306 event = Event.get_by_id(int(id))
d2c3dc7 @billsaysthis moved app-specific js to separate file
billsaysthis authored
307 if user:
308 logout_url = users.create_logout_url('/')
309 else:
310 login_url = users.create_login_url('/')
311 self.response.out.write(template.render('templates/feedback.html', locals()))
312
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
313 def post(self, id):
d2c3dc7 @billsaysthis moved app-specific js to separate file
billsaysthis authored
314 user = users.get_current_user()
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
315 event = Event.get_by_id(int(id))
8c52522 @billsaysthis small tweak to how feedbacks displayed in event page
billsaysthis authored
316 try:
317 if self.request.get('rating'):
318 feedback = Feedback(
319 event = event,
320 rating = int(self.request.get('rating')),
ca3c6dd Escaped additional fields that could be used for XSS
Christopher Biettchert authored
321 comment = cgi.escape(self.request.get('comment')))
8c52522 @billsaysthis small tweak to how feedbacks displayed in event page
billsaysthis authored
322 feedback.put()
323 self.redirect('/event/%s-%s' % (event.key().id(), slugify(event.name)))
324 else:
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
325 raise ValueError('Please select a rating')
8c52522 @billsaysthis small tweak to how feedbacks displayed in event page
billsaysthis authored
326 except Exception:
327 set_cookie(self.response.headers, 'formvalues', dict(self.request.POST))
7ebb2cd @christopherb Cleaned up the style of the files some. Mostly standardizing on singl…
christopherb authored
328 self.redirect('/feedback/new/' + id)
d2c3dc7 @billsaysthis moved app-specific js to separate file
billsaysthis authored
329
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
330 def main():
331 application = webapp.WSGIApplication([
332 ('/', ApprovedHandler),
fcf7602 @progrium working approval process and ical view of approved events
progrium authored
333 ('/events\.(.+)', EventsHandler),
d75579f @progrium minor updates here and there to bills contributions.
progrium authored
334 ('/past', PastHandler),
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
335 ('/pending', PendingHandler),
b4ea292 Handler to bug pending events
Brian Klug authored
336 ('/cronbugowners', CronBugOwnersHandler),
a82b43e @billsaysthis add myevents, pastevents code, refined list display on event page
billsaysthis authored
337 ('/myevents', MyEventsHandler),
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
338 ('/new', NewHandler),
ca8c7f2 @dustball Let edit events and refactor error handling
dustball authored
339 ('/edit/(\d+).*', EditHandler),
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
340 ('/event/(\d+).*', EventHandler),
2e08a66 @progrium cleaning things up and adding json representations for jon
progrium authored
341 ('/event/(\d+)\.json', EventHandler),
47a7f7a @progrium basic form validation, added end time, start of notifications, some f…
progrium authored
342 ('/expire', ExpireCron),
34d98f0 @billsaysthis moved feedback stuff to separate py file, small tweak to email notifi…
billsaysthis authored
343 ('/expiring', ExpireReminderCron),
219203b @dustball Cache better
dustball authored
344 ('/domaincache', DomainCacheCron),
f49797a @dustball Reminders 2.0
dustball authored
345 ('/reminder', ReminderCron),
d2c3dc7 @billsaysthis moved app-specific js to separate file
billsaysthis authored
346 ('/feedback/new/(\d+).*', FeedbackHandler) ],debug=True)
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
347 util.run_wsgi_app(application)
348
f1997e4 @christopherb Made misc style fixes
christopherb authored
349
9b632dd @progrium initial commit -- basic form, rough listing
progrium authored
350 if __name__ == '__main__':
351 main()
Something went wrong with that request. Please try again.