Ejemplo n.º 1
0
    def _valid_request(self, user, name, values):
        # Malformed request
        if u"group_members" not in values or u"deadline" not in values or u"duration" not in values or u"off_limits_start" not in values or u"off_limits_end" not in values:
            return False

        # Malformed request
        group_members = values[u"group_members"]
        deadline = values[u"deadline"]
        duration = values[u"duration"]
        off_limits_start = values[u"off_limits_start"]
        off_limits_end = values[u"off_limits_end"]
        if not group_members or not deadline or not duration or not off_limits_start or not off_limits_end:
            return False

        #real deadline
        dr = DeadlineRepository()
        dl = dr.fetch(deadline)
        dr.close()

        if not dl:
            sys.stderr.write("invalid deadline id: " + str(dl))
            return False

        #real users
        for email in group_members:
            new_user_repo = UserRepository()
            new_user = new_user_repo.get_user_by_email(email)
            new_user_repo.close()
            if not new_user:
                sys.stderr.write("invalid email: " + email)
                return False


        return True
Ejemplo n.º 2
0
    def _perform_request(self, user, name, values):

        parser = ConfigParser.ConfigParser()
        parser.read('./config/app.conf')

        section = 'General'
        client_id = parser.get(section, 'client_id')
        client_secret = parser.get(section, 'client_secret')

        group_emails = values[u"group_members"]
        deadline = values[u"deadline"]
        duration = values[u"duration"]
        off_limits_start = values[u"off_limits_start"]
        off_limits_end = values[u"off_limits_end"]

        #real deadline
        dr = DeadlineRepository()
        deadline = dr.fetch(deadline).deadline
        dr.close()

        duration = timedelta(minutes=int(duration))

        off_limits_start = datetime.strptime(off_limits_start, u'%I:%M %p').time()
        off_limits_end = datetime.strptime(off_limits_end, u'%I:%M %p').time()

        group_members = {}

        for email in group_emails:
            new_user_repo = UserRepository()
            new_user = new_user_repo.get_user_by_email(email)
            new_user_repo.close()

            #must have refresh token
            if not new_user.refreshTok:
                sys.stderr.write(email + "has not given google permission to view calendar information" + '\n')
                None.hi()

            ref_tok = new_user.refreshTok
            #sys.stderr.write("refresh_token = " + ref_token + '\n\n')

            #get access token
            url = "https://accounts.google.com/o/oauth2/token"
            access_token_request = "refresh_token=" + ref_tok + "&" +\
                      "client_id=" + client_id + "&" +\
                      "client_secret=" + client_secret + "&" +\
                      "grant_type=refresh_token"\

            sys.stderr.write("access_token request = " + access_token_request + '\n\n')

            http_client = tornado.httpclient.HTTPClient()
            http_request = tornado.httpclient.HTTPRequest(url, 'POST', body=access_token_request)
            response = http_client.fetch(http_request)

            #handle the access token response
            #sys.stderr.write("response = " + str(response) + '\n\n')

            data = json.loads(response.body)
            a_token = data['access_token']
            sys.stderr.write("access_token = " + a_token + '\n\n')

            events = []

            cal_list_http_client = tornado.httpclient.HTTPClient()
            response2 = cal_list_http_client.fetch("https://www.googleapis.com/calendar/v3/users/me/calendarList?access_token=" + a_token)

            #handle google calendar list
            #sys.stderr.write("calendar list response = " + str(response2) + '\n\n')

            data2 = json.loads(response2.body)
            #sys.stderr.write(str(data2) + '\n\n')

            for calendar in data2['items']:

                calendar_id = calendar['id']

                #calendars without the 'selected' attribute appear to be invalid
                if 'selected' not in calendar:
                    continue

                sys.stderr.write("Reading calendar: " + str(calendar_id) + '\n')

                event_list_http_client = tornado.httpclient.HTTPClient()
                response3 = event_list_http_client.fetch("https://www.googleapis.com/calendar/v3/calendars/" + calendar_id + "/events?singleEvents=true&access_token=" + a_token)

                #handle event list
                #sys.stderr.write("event list response = " + str(response3) + '\n\n')

                data3 = json.loads(response3.body)
                #sys.stderr.write(str(data3) + '\n\n')

                #add each event
                for event in data3['items']:
                    #I have many doubts this will work for arbitrary calendars
                    #and I am certain it will error for other timezones.....
                    if 'start' not in event:
                        continue
                    if 'dateTime' not in event['start']:
                        continue
                    if 'end' not in event:
                        continue
                    if 'dateTime' not in event['end']:
                        continue
                    start = datetime.strptime(event['start']['dateTime'][:19], u'%Y-%m-%dT%H:%M:%S')
                    end = datetime.strptime(event['end']['dateTime'][:19], u'%Y-%m-%dT%H:%M:%S')
                    events.append((start, end))
                    #sys.stderr.write("Event found: " + str(start) + " - " + str(end) + '\n')
                sys.stderr.write('\n')

            group_members[email] = events
        
        meets = schedule_meeting(group_members, deadline, duration, off_limits_start, off_limits_end)

        result = []
        for meet in meets:
            result.append(meet[0].strftime(u'%A %b %d (%Y) at %I:%M %p'))

        i = 0
        real = []
        for r in result:
            if i % 4 == 0:
                real.append(r)
            i+=1

        self.write(json.dumps(real[:15]))
        self.flush
        self.finish