Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
 def get_approved_list(cls):
     return (
         cls.all()
         .filter("start_time >", local_today())
         .filter("status IN", ["approved", "canceled"])
         .order("start_time")
     )
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
 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")
     )
Exemplo n.º 5
0
 def get_pending_list(cls):
     return (
         cls.all()
         .filter("start_time >", local_today())
         .filter("status IN", ["pending", "understaffed", "onhold", "expired"])
         .order("start_time")
     )
Exemplo n.º 6
0
 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")
     )
Exemplo n.º 7
0
 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()))
Exemplo n.º 8
0
 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)
Exemplo n.º 9
0
 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)
     )
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
 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)
Exemplo n.º 12
0
 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()))
Exemplo n.º 13
0
 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)
Exemplo n.º 14
0
    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
Exemplo n.º 15
0
 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()))
Exemplo n.º 16
0
 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)
Exemplo n.º 17
0
 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()))
Exemplo n.º 18
0
 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)
Exemplo n.º 19
0
 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()))
Exemplo n.º 20
0
 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()))
Exemplo n.º 21
0
 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()))
Exemplo n.º 22
0
 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()))
Exemplo n.º 23
0
 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)
Exemplo n.º 24
0
 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()))
Exemplo n.º 25
0
 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()))
Exemplo n.º 26
0
 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()))
Exemplo n.º 27
0
 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()))
Exemplo n.º 28
0
 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()))
Exemplo n.º 29
0
 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)
Exemplo n.º 30
0
 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()))
Exemplo n.º 31
0
 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()))
Exemplo n.º 32
0
 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()))
Exemplo n.º 33
0
    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
Exemplo n.º 34
0
 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()))
Exemplo n.º 35
0
 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()))
Exemplo n.º 36
0
 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()))
Exemplo n.º 37
0
 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()))
Exemplo n.º 38
0
 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()))
Exemplo n.º 39
0
 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()
Exemplo n.º 40
0
 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()
Exemplo n.º 41
0
 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()))
Exemplo n.º 42
0
    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
        }
Exemplo n.º 43
0
 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')
Exemplo n.º 44
0
 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()))
Exemplo n.º 45
0
    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()
Exemplo n.º 46
0
 def get_approved_list(cls):
     return cls.all() \
         .filter('start_time >', local_today()) \
         .filter('status IN', ['approved', 'canceled']) \
         .order('start_time')
Exemplo n.º 47
0
 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)
Exemplo n.º 48
0
    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)
Exemplo n.º 49
0
    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 &amp; 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()))
Exemplo n.º 50
0
 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')
Exemplo n.º 51
0
 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')
Exemplo n.º 52
0
 def get_pending_list(cls):
     return cls.all() \
         .filter('start_time >', local_today()) \
         .filter('status IN', ['pending', 'understaffed', 'onhold', 'expired']) \
         .order('start_time')
Exemplo n.º 53
0
 def get_pending_list(cls):
     return cls.all() \
         .filter('start_time >', local_today()) \
         .filter('status IN', ['pending', 'understaffed', 'onhold', 'expired']) \
         .order('start_time')
Exemplo n.º 54
0
 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')
Exemplo n.º 55
0
    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 &amp; 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()))
Exemplo n.º 56
0
 def is_past(self):
     return self.end_time < local_today()
Exemplo n.º 57
0
 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')
Exemplo n.º 58
0
 def get_approved_list(cls):
     return cls.all() \
         .filter('start_time >', local_today()) \
         .filter('status IN', ['approved', 'canceled']) \
         .order('start_time')
Exemplo n.º 59
0
 def is_past(self):
     return self.end_time < local_today()
Exemplo n.º 60
0
 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)