def test_create_event_less_48hours(self): params = self.params.copy() print params date = local_today() print local_today() params["start_date"] = "%d/%d/%d" % (date.month, date.day, date.year) params["end_date"] = "%d/%d/%d" % (date.month, date.day, date.year) print params response = self.test_app.post("/new", params, expect_errors=True) self.assertEqual(400, response.status_int) self.assertIn("cannot start", response.body)
def get_approved_list(cls): return ( cls.all() .filter("start_time >", local_today()) .filter("status IN", ["approved", "canceled"]) .order("start_time") )
def test_four_week_limit(self): # Make one fewer than the limit events. events = self._make_events(Config().USER_MAX_FOUR_WEEKS - 1) print events for event in events: print event.start_time # The start time of our last event. # add 2 days to avoid being rejected by the 48hours limit last_start = local_today() + datetime.timedelta( days=2) + datetime.timedelta(days=Config().USER_MAX_FOUR_WEEKS) print last_start # Now, it should let us create a last one. event_date = "%d/%d/%d" % (last_start.month, last_start.day, last_start.year) params = self.params.copy() params["start_date"] = event_date params["end_date"] = event_date print params response = self.test_app.post("/new", params) self.assertEqual(200, response.status_int) # It should not, however, allow us to create another one. last_start += datetime.timedelta(days=1) event_date = "%d/%d/%d" % (last_start.month, last_start.day, last_start.year) params["start_date"] = event_date params["end_date"] = event_date response = self.test_app.post("/new", params, expect_errors=True) self.assertEqual(400, response.status_int) self.assertIn("4-week period", response.body)
def get_recent_not_approved_list(cls): return ( cls.all() .filter("start_time >", local_today() - timedelta(days=60)) .filter("status IN", ["not_approved"]) .order("start_time") )
def get_pending_list(cls): return ( cls.all() .filter("start_time >", local_today()) .filter("status IN", ["pending", "understaffed", "onhold", "expired"]) .order("start_time") )
def get_all_future_list(cls): return ( cls.all() .filter("start_time >", local_today()) .filter("status IN", ["approved", "not_approved", "canceled", "pending", "onhold"]) .order("start_time") )
def post(self): user = users.get_current_user() try: start_time = datetime.strptime('%s %s:%s %s' % ( self.request.get('date'), self.request.get('start_time_hour'), self.request.get('start_time_minute'), self.request.get('start_time_ampm')), '%m/%d/%Y %I:%M %p') end_time = datetime.strptime('%s %s:%s %s' % ( self.request.get('date'), self.request.get('end_time_hour'), self.request.get('end_time_minute'), self.request.get('end_time_ampm')), '%m/%d/%Y %I:%M %p') conflicts = Event.check_conflict(start_time,end_time,self.request.get_all('rooms')) if conflicts: raise ValueError('Room conflict detected') if not self.request.get('estimated_size').isdigit(): raise ValueError('Estimated number of people must be a number') if not int(self.request.get('estimated_size')) > 0: raise ValueError('Estimated number of people must be greater then zero') if (end_time-start_time).days < 0: raise ValueError('End time must be after start time') if ( self.request.get( 'contact_phone' ) and not is_phone_valid( self.request.get( 'contact_phone' ) ) ): raise ValueError( 'Phone number does not appear to be valid' ) else: event = Event( name = cgi.escape(self.request.get('name')), start_time = start_time, end_time = end_time, type = cgi.escape(self.request.get('type')), estimated_size = cgi.escape(self.request.get('estimated_size')), contact_name = cgi.escape(self.request.get('contact_name')), contact_phone = cgi.escape(self.request.get('contact_phone')), details = cgi.escape(self.request.get('details')), url = cgi.escape(self.request.get('url')), fee = cgi.escape(self.request.get('fee')), notes = cgi.escape(self.request.get('notes')), rooms = self.request.get_all('rooms'), expired = local_today() + timedelta(days=PENDING_LIFETIME), # Set expected expiration date ) event.put() log = HDLog(event=event,description="Created new event") log.put() notify_owner_confirmation(event) notify_new_event(event) set_cookie(self.response.headers, 'formvalues', None) self.redirect('/event/%s-%s' % (event.key().id(), slugify(event.name))) except Exception, e: message = str(e) if 'match format' in message: message = 'Date is required.' if message.startswith('Property'): message = message[9:].replace('_', ' ').capitalize() # This is NOT a reliable way to handle erorrs #set_cookie(self.response.headers, 'formerror', message) #set_cookie(self.response.headers, 'formvalues', dict(self.request.POST)) #self.redirect('/new') error = message self.response.out.write(template.render('templates/error.html', locals()))
def test_no_48hours_for_admin(self): params = self.params.copy() date = local_today() params["start_date"] = "%d/%d/%d" % (date.month, date.day, date.year) params["end_date"] = "%d/%d/%d" % (date.month, date.day, date.year) self.testbed.setup_env(user_is_admin="1", overwrite=True) response = self.test_app.post("/new", params, expect_errors=True) self.assertEqual(200, response.status_int)
def get_recent_past_and_future(cls): return ( cls.all() .filter("start_time >", local_today() - timedelta(days=1)) .filter("status IN", ["approved", "canceled"]) .order("start_time") .fetch(200) )
def get_approved_list_with_multiday(cls): events = list(cls.all().filter("end_time >", local_today()).filter("status IN", ["approved", "canceled"])) # create dupe event objects for each day of multiday events for event in list(events): if event.start_time < local_today(): # remove original if it started before today events.remove(event) for day in range(1, event.num_days): if event.start_time + timedelta(days=day) >= local_today(): clone = copy(event) clone.start_time = datetime.combine(event.start_date(), time()) + timedelta(days=day) clone.is_continued = True events.append(clone) events.sort(key=lambda event: event.start_time) return events
def post(self): # Find events expiring in 10 days to warn owner ten_days = local_today() + timedelta(days=10) events = Event.all() \ .filter('status IN', ['pending', 'understaffed']) \ .filter('expired >=', ten_days) \ .filter('expired <', ten_days + timedelta(days=1)) for event in events: notify_owner_expiring(event)
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') today = local_today() events = Event.all().filter('start_time < ', today).order('-start_time') self.response.out.write(template.render('templates/past.html', locals()))
def get_approved_list_with_multiday(cls): events = list(cls.all() \ .filter('end_time >', local_today()) \ .filter('status IN', ['approved', 'canceled'])) # create dupe event objects for each day of multiday events for event in list(events): if event.start_time < local_today(): # remove original if it started before today events.remove(event) for day in range(1, event.num_days): if event.start_time + timedelta(days=day) >= local_today(): clone = copy(event) clone.start_time = datetime.combine(event.start_date(), time()) + timedelta(days=day) clone.is_continued = True events.append(clone) events.sort(key = lambda event: event.start_time) return events
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') events = Event.get_pending_list() today = local_today() tomorrow = today + timedelta(days=1) self.response.out.write(template.render('templates/pending.html', locals()))
def post(self): # Expire events marked to expire today today = local_today() events = Event.all() \ .filter('status IN', ['pending', 'understaffed']) \ .filter('expired >=', today) \ .filter('expired <', today + timedelta(days=1)) for event in events: event.expire() notify_owner_expired(event)
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') today = local_today() show_all_nav = user events = Event.get_recent_not_approved_list() self.response.out.write(template.render('templates/not_approved.html', locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') today = local_today() show_all_nav = user events = Event.all().filter('start_time < ', today).order('-start_time') self.response.out.write(template.render('templates/past.html', locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url("/") else: login_url = users.create_login_url("/") today = local_today() show_all_nav = user events = Event.all().filter("start_time < ", today).order("-start_time") self.response.out.write(template.render("templates/past.html", locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') events = Event.all().filter('member = ', user).order('start_time') today = local_today() tomorrow = today + timedelta(days=1) self.response.out.write(template.render('templates/myevents.html', locals()))
def post(self): # Find events expiring in 10 days to warn owner ten_days = local_today() + timedelta(days=10) events = ( Event.all() .filter("status IN", ["pending", "understaffed"]) .filter("expired >=", ten_days) .filter("expired <", ten_days + timedelta(days=1)) ) for event in events: notify_owner_expiring(event)
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url("/") else: login_url = users.create_login_url("/") show_all_nav = user events = Event.get_large_list() today = local_today() tomorrow = today + timedelta(days=1) self.response.out.write(template.render("templates/large.html", locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url("/") else: login_url = users.create_login_url("/") events = Event.all().filter("member = ", user).order("start_time") show_all_nav = user today = local_today() tomorrow = today + timedelta(days=1) self.response.out.write(template.render("templates/myevents.html", locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') events = Event.get_pending_list() show_all_nav = user today = local_today() tomorrow = today + timedelta(days=1) self.response.out.write(template.render('templates/pending.html', locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') events = Event.all().filter('member = ', user).order('start_time') show_all_nav = user today = local_today() tomorrow = today + timedelta(days=1) self.response.out.write(template.render('templates/myevents.html', locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url("/") else: login_url = users.create_login_url("/") today = local_today() show_all_nav = user events = Event.get_recent_not_approved_list() # this is not the permanent answer but just for now cdn = "http://cdn.hackerdojo.com" self.response.out.write(template.render("templates/not_approved.html", locals()))
def post(self): # Expire events marked to expire today today = local_today() events = ( Event.all() .filter("status IN", ["pending", "understaffed"]) .filter("expired >=", today) .filter("expired <", today + timedelta(days=1)) ) for event in events: event.expire() notify_owner_expired(event)
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url("/") else: login_url = users.create_login_url("/") today = local_today() show_all_nav = user events = Event.all().filter("start_time < ", today).order("-start_time") # this is not the permanent answer but just for now cdn = "http://cdn.hackerdojo.com" self.response.out.write(template.render("templates/past.html", locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') today = local_today() events = Event.get_approved_list() tomorrow = today + timedelta(days=1) whichbase = 'base.html' if self.request.get('base'): whichbase = self.request.get('base') + '.html' self.response.out.write(template.render('templates/approved.html', locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url("/") else: login_url = users.create_login_url("/") events = Event.get_pending_list() show_all_nav = user today = local_today() tomorrow = today + timedelta(days=1) # this is not the permanent answer but just for now cdn = "http://cdn.hackerdojo.com" self.response.out.write(template.render("templates/pending.html", locals()))
def get_approved_list_with_multiday(cls): # TODO(eascott): PEP8: the backslash is redundant between brackets events = list(cls.all() \ .filter('end_time >', local_today()) \ .filter('status IN', ['approved', 'canceled'])) # create dupe event objects for each day of multiday events for event in list(events): if event.start_time < local_today(): # remove original if it started before today events.remove(event) for day in range(1, event.num_days): if event.start_time + timedelta(days=day) >= local_today(): clone = copy(event) clone.start_time = datetime.combine(event.start_date(), time()) + timedelta(days=day) clone.is_continued = True events.append(clone) # TODO(eascott): shadows name 'event' from outer scope events.sort(key=lambda event: event.start_time) return events
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') today = local_today() show_all_nav = user events = Event.get_recent_not_approved_list() # this is not the permanent answer but just for now cdn = 'http://cdn.hackerdojo.com' self.response.out.write( template.render('templates/not_approved.html', locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') today = local_today() show_all_nav = user events = Event.all().filter('start_time < ', today).order('-start_time') # this is not the permanent answer but just for now cdn = 'http://cdn.hackerdojo.com' self.response.out.write( template.render('templates/past.html', locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url("/") else: login_url = users.create_login_url("/") today = local_today() show_all_nav = user events = Event.get_approved_list_with_multiday() tomorrow = today + timedelta(days=1) whichbase = "base.html" if self.request.get("base"): whichbase = self.request.get("base") + ".html" self.response.out.write(template.render("templates/approved.html", locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') events = Event.get_pending_list() show_all_nav = user today = local_today() tomorrow = today + timedelta(days=1) # this is not the permanent answer but just for now cdn = 'http://cdn.hackerdojo.com' self.response.out.write( template.render('templates/pending.html', locals()))
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') today = local_today() show_all_nav = user events = Event.get_approved_list_with_multiday() tomorrow = today + timedelta(days=1) whichbase = 'base.html' if self.request.get('base'): whichbase = self.request.get('base') + '.html' self.response.out.write(template.render('templates/approved.html', locals()))
def post(self): self.response.out.write("REMINDERS") today = local_today() # remind everyone 3 days in advance they need to show up events = Event.all() \ .filter('status IN', ['approved']) \ .filter('reminded =', False) \ .filter('start_time <', today + timedelta(days=3)) for event in events: self.response.out.write(event.name) # only mail them if they created the event 2+ days ago if event.created < today - timedelta(days=2): schedule_reminder_email(event) event.reminded = True event.put()
def get(self): self.response.out.write("REMINDERS") today = local_today() # remind everyone 3 days in advance they need to show up events = Event.all() \ .filter('status IN', ['approved']) \ .filter('reminded =', False) \ .filter('start_time <', today + timedelta(days=3)) for event in events: self.response.out.write(event.name) # only mail them if they created the event 2+ days ago if event.created < today - timedelta(days=2): schedule_reminder_email(event) event.reminded = True event.put()
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url("/") else: login_url = users.create_login_url("/") today = local_today() show_all_nav = user events = Event.get_approved_list_with_multiday() tomorrow = today + timedelta(days=1) # this is not the permanent answer but just for now cdn = "http://cdn.hackerdojo.com" whichbase = "../hd-ui/templates/base.html" if self.request.get("base"): whichbase = self.request.get("base") + ".html" self.response.out.write(template.render("templates/approved.html", locals()))
def setUp(self): # Set up GAE testbed. self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_user_stub() self.testbed.init_memcache_stub() self.testbed.init_taskqueue_stub() # Set up testing for application. self.test_app = webtest.TestApp(main.app) # Simulate a logged-in user. self.testbed.setup_env(user_email="*****@*****.**", user_is_admin="0", overwrite=True) # Default parameters for putting in the form. date = utils.local_today() + datetime.timedelta(days=2) event_date = "%d/%d/%d" % (date.month, date.day, date.year) self.params = { "start_date": event_date, "start_time_hour": "12", "start_time_minute": "0", "start_time_ampm": "PM", "end_date": event_date, "end_time_hour": "2", "end_time_minute": "0", "end_time_ampm": "PM", "setup": "15", "teardown": "15", "rooms": models.ROOM_OPTIONS[0][0], "details": "This is a test event.", "estimated_size": "10", "name": "Test Event", "type": "Meetup", } # Make a fake dictionary detailing a basic recurring event. self.recurring_data = { "frequency": "monthly", "repetitions": 5, "dayNumber": "1st", "monthDay": "Monday", "weekdaysOnly": False }
def post(self): user = users.get_current_user() try: start_time = datetime.strptime("%s %s:%s %s" % ( self.request.get('date'), self.request.get('start_time_hour'), self.request.get('start_time_minute'), self.request.get('start_time_ampm')), "%m/%d/%Y %I:%M %p") end_time = datetime.strptime("%s %s:%s %s" % ( self.request.get('date'), self.request.get('end_time_hour'), self.request.get('end_time_minute'), self.request.get('end_time_ampm')), "%m/%d/%Y %I:%M %p") if (end_time-start_time).days < 0: raise ValueError("End time must be after start time") else: event = Event( name = self.request.get('name'), start_time = start_time, end_time = end_time, type = self.request.get('type'), estimated_size = self.request.get('estimated_size'), contact_name = self.request.get('contact_name'), contact_phone = self.request.get('contact_phone'), details = self.request.get('details'), url = self.request.get('url'), fee = self.request.get('fee'), notes = self.request.get('notes'), rooms = self.request.get_all('rooms'), expired = local_today() + timedelta(days=PENDING_LIFETIME), # Set expected expiration date ) event.put() notify_owner_confirmation(event) if not event.is_staffed(): notify_staff_needed(event) notify_new_event(event) set_cookie(self.response.headers, 'formvalues', None) self.redirect('/event/%s-%s' % (event.key().id(), slugify(event.name))) except Exception, e: message = str(e) if 'match format' in message: message = "Date is required." if message.startswith('Property'): message = message[9:].replace('_', ' ').capitalize() set_cookie(self.response.headers, 'formerror', message) set_cookie(self.response.headers, 'formvalues', dict(self.request.POST)) self.redirect('/new')
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') today = local_today() show_all_nav = user events = Event.get_approved_list_with_multiday() tomorrow = today + timedelta(days=1) # this is not the permanent answer but just for now cdn = 'http://cdn.hackerdojo.com' whichbase = '../hd-ui/templates/base.html' if self.request.get('base'): whichbase = self.request.get('base') + '.html' self.response.out.write( template.render('templates/approved.html', locals()))
def test_second_member_requirement(self): params = self.params.copy() date = utils.local_today() + datetime.timedelta(days=3) # Make it last 24 hours or more. params["end_date"] = "%d/%d/%d" % (date.month, date.day, date.year) response = self.test_app.post("/new", params, expect_errors=True) print response self.assertEqual(400, response.status_int) # It should give us an error about specifying the email address. self.assertIn("specify second", response.body) # If we enter one, it should let us create it. params["other_member"] = "*****@*****.**" response = self.test_app.post("/new", params) self.assertEqual(200, response.status_int) self._check_new_event_in_datastore()
def get_approved_list(cls): return cls.all() \ .filter('start_time >', local_today()) \ .filter('status IN', ['approved', 'canceled']) \ .order('start_time')
def get_recent_ongoing_and_future(cls): return cls.all() \ .filter('start_time >', local_today()) \ .filter('status IN', ['approved', 'canceled']) \ .order('start_time').fetch(200)
def test_one_per_day(self): # move 48hours to avoid being denied limit = local_today() + timedelta(days=2) start = limit # For this test to work, the event initially has to be scheduled on a # weekday. if start.weekday() > 4: # weekend so move 2 days again start += datetime.timedelta(days=2) self.assertLess(start.weekday(), 5) start = start.replace(hour=10) event = models.Event(name="Test Event", start_time=start, end_time=start + datetime.timedelta(minutes=30), type="Meetup", estimated_size="10", setup=15, teardown=15, details="This is a test event.") event.put() print event.start_time params = self.params.copy() params["start_date"] = "%d/%d/%d" % (start.month, start.day, start.year) params["end_date"] = params["start_date"] print params # That should be our one event for that day. It should complain if we try to # create another one. response = self.test_app.post("/new", params, expect_errors=True) self.assertEqual(400, response.status_int) self.assertIn("coworking hours", response.body) # It should ignore the event if it doesn't have the right status. event.status = "not_approved" event.put() response = self.test_app.post("/new", params) self.assertEqual(200, response.status_int) # Another status that should trigger it is approved. event.status = "approved" event.put() response = self.test_app.post("/new", params, expect_errors=True) self.assertEqual(400, response.status_int) self.assertIn("coworking hours", response.body) # If the event we are making is not during these hours, it should not have a # problem. new_params = params.copy() new_params["start_time_hour"] = "6" new_params["end_time_hour"] = "7" response = self.test_app.post("/new", new_params) self.assertEqual(200, response.status_int) # If we schedule it on a weekend, however, we should have no such problems. days_to_weekend = 6 - limit.weekday() start = limit + datetime.timedelta(days=days_to_weekend) self.assertGreater(start.weekday(), 4) event.start_time = start event.end_time = start + datetime.timedelta(minutes=30) event.put() params["start_date"] = "%d/%d/%d" % (start.month, start.day, start.year) params["end_date"] = params["start_date"] response = self.test_app.post("/new", params) self.assertEqual(200, response.status_int)
def post(self): user = users.get_current_user() try: start_time = datetime.strptime('%s %s:%s %s' % ( self.request.get('start_date'), self.request.get('start_time_hour'), self.request.get('start_time_minute'), self.request.get('start_time_ampm')), '%m/%d/%Y %I:%M %p') end_time = datetime.strptime('%s %s:%s %s' % ( self.request.get('end_date'), self.request.get('end_time_hour'), self.request.get('end_time_minute'), self.request.get('end_time_ampm')), '%m/%d/%Y %I:%M %p') conflicts = Event.check_conflict(start_time,end_time,self.request.get_all('rooms')) if conflicts: if "Deck" in self.request.get_all('rooms') or "Savanna" in self.request.get_all('rooms'): raise ValueError('Room conflict detected <small>(Note: Deck & Savanna share the same area, two events cannot take place at the same time in these rooms.)</small>') else: raise ValueError('Room conflict detected') if not self.request.get('estimated_size').isdigit(): raise ValueError('Estimated number of people must be a number') if not int(self.request.get('estimated_size')) > 0: raise ValueError('Estimated number of people must be greater then zero') if (end_time-start_time).days < 0: raise ValueError('End time must be after start time') if ( self.request.get( 'contact_phone' ) and not is_phone_valid( self.request.get( 'contact_phone' ) ) ): raise ValueError( 'Phone number does not appear to be valid' ) else: event = Event( name = cgi.escape(self.request.get('name')), start_time = start_time, end_time = end_time, type = cgi.escape(self.request.get('type')), estimated_size = cgi.escape(self.request.get('estimated_size')), contact_name = cgi.escape(self.request.get('contact_name')), contact_phone = cgi.escape(self.request.get('contact_phone')), details = cgi.escape(self.request.get('details')), url = cgi.escape(self.request.get('url')), fee = cgi.escape(self.request.get('fee')), notes = cgi.escape(self.request.get('notes')), rooms = self.request.get_all('rooms'), expired = local_today() + timedelta(days=PENDING_LIFETIME), # Set expected expiration date ) event.put() log = HDLog(event=event,description="Created new event") log.put() notify_owner_confirmation(event) notify_new_event(event) set_cookie(self.response.headers, 'formvalues', None) #self.redirect('/event/%s-%s' % (event.key().id(), slugify(event.name))) self.redirect('/confirm/%s-%s' % (event.key().id(), slugify(event.name))) except Exception, e: message = str(e) if 'match format' in message: message = 'Date is required.' if message.startswith('Property'): message = message[9:].replace('_', ' ').capitalize() # This is NOT a reliable way to handle erorrs #set_cookie(self.response.headers, 'formerror', message) #set_cookie(self.response.headers, 'formvalues', dict(self.request.POST)) #self.redirect('/new') error = message self.response.out.write(template.render('templates/error.html', locals()))
def get_future_suspended_events_by_member(cls, member): return cls.all() \ .filter('start_time >', local_today()) \ .filter('member = ', member) \ .filter('status IN ', ['suspended'])\ .order('start_time')
def get_future_events_by_member(cls, member): return cls.all() \ .filter('start_time >', local_today()) \ .filter('status IN', ['approved', 'not_approved', 'pending', 'onhold']) \ .filter('member = ', member)\ .order('start_time')
def get_pending_list(cls): return cls.all() \ .filter('start_time >', local_today()) \ .filter('status IN', ['pending', 'understaffed', 'onhold', 'expired']) \ .order('start_time')
def get_recent_not_approved_list(cls): return cls.all() \ .filter('start_time >', local_today() - timedelta(days=60)) \ .filter('status IN', ['not_approved']) \ .order('start_time')
def post(self): user = users.get_current_user() try: start_time = datetime.strptime( '%s %s:%s %s' % (self.request.get('start_date'), self.request.get('start_time_hour'), self.request.get('start_time_minute'), self.request.get('start_time_ampm')), '%m/%d/%Y %I:%M %p') end_time = datetime.strptime( '%s %s:%s %s' % (self.request.get('end_date'), self.request.get('end_time_hour'), self.request.get('end_time_minute'), self.request.get('end_time_ampm')), '%m/%d/%Y %I:%M %p') conflicts = Event.check_conflict(start_time, end_time, self.request.get_all('rooms')) if conflicts: if "Deck" in self.request.get_all( 'rooms') or "Savanna" in self.request.get_all('rooms'): raise ValueError( 'Room conflict detected <small>(Note: Deck & Savanna share the same area, two events cannot take place at the same time in these rooms.)</small>' ) else: raise ValueError('Room conflict detected') if not self.request.get('details'): raise ValueError('You must provide a description of the event') if not self.request.get('estimated_size').isdigit(): raise ValueError('Estimated number of people must be a number') if not int(self.request.get('estimated_size')) > 0: raise ValueError( 'Estimated number of people must be greater then zero') if (end_time - start_time).days < 0: raise ValueError('End time must be after start time') if (self.request.get('contact_phone') and not is_phone_valid(self.request.get('contact_phone'))): raise ValueError('Phone number does not appear to be valid') else: event = Event( name=cgi.escape(self.request.get('name')), start_time=start_time, end_time=end_time, type=cgi.escape(self.request.get('type')), estimated_size=cgi.escape( self.request.get('estimated_size')), contact_name=cgi.escape(self.request.get('contact_name')), contact_phone=cgi.escape( self.request.get('contact_phone')), details=cgi.escape(self.request.get('details')), url=cgi.escape(self.request.get('url')), fee=cgi.escape(self.request.get('fee')), notes=cgi.escape(self.request.get('notes')), rooms=self.request.get_all('rooms'), expired=local_today() + timedelta( days=PENDING_LIFETIME), # Set expected expiration date ) event.put() log = HDLog(event=event, description="Created new event") log.put() notify_owner_confirmation(event) notify_new_event(event) set_cookie(self.response.headers, 'formvalues', None) rules = memcache.get("rules") if (rules is None): try: rules = urlfetch.fetch( "http://wiki.hackerdojo.com/api_v2/op/GetPage/page/Event+Policies/_type/html", "GET").content memcache.add("rules", rules, 86400) except Exception, e: rules = "Error fetching rules. Please report this error to [email protected]." self.response.out.write( template.render('templates/confirmation.html', locals())) except Exception, e: message = str(e) if 'match format' in message: message = 'Date is required.' if message.startswith('Property'): message = message[9:].replace('_', ' ').capitalize() # This is NOT a reliable way to handle erorrs #set_cookie(self.response.headers, 'formerror', message) #set_cookie(self.response.headers, 'formvalues', dict(self.request.POST)) #self.redirect('/new') error = message # this is not the permanent answer but just for now cdn = 'http://cdn.hackerdojo.com' self.response.out.write( template.render('templates/error.html', locals()))
def is_past(self): return self.end_time < local_today()
def get_all_future_list(cls): return cls.all() \ .filter('start_time >', local_today()) \ .filter('status IN', ['approved', 'not_approved', 'canceled', 'pending', 'onhold']) \ .order('start_time')
def get_recent_past_and_future_approved(cls): return cls.all() \ .filter('start_time >', local_today() - timedelta(days=1)) \ .filter('status IN', ['approved']) \ .order('start_time').fetch(200)