def get(self): # validate the request parameters devStoreKey = validateRequest(self.request, api_utils.GETROUTES) if devStoreKey is None: logging.debug("unable to validate the request parameters") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write( json.dumps( api_utils.buildErrorResponse( '-1', 'Illegal request parameters'))) return logging.debug('getroutes request... ') if self.request.get('force') is not '': refresh = True else: refresh = False if api_utils.afterHours() is True: # don't run these jobs during "off" hours json_response = api_utils.buildErrorResponse( '-1', 'The Metro service is not currently running') else: if refresh is True: json_response = getRoutes(refresh) # drop it into the memcache again memcache.set(api_utils.GETROUTES, json_response) logging.debug('---> storing in memcache') else: logging.debug('---> memcache hit') json_response = memcache.get(api_utils.GETROUTES) if json_response is None: json_response = getRoutes(refresh) # drop it into the memcache again memcache.set(api_utils.GETROUTES, json_response) logging.debug('---> storing in memcache') # record the API call for this devkey api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETROUTES, self.request.query_string, self.request.remote_addr) #logging.debug('API: json response %s' % json_response); callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json_response self.response.out.write(response) stathat.apiStatCount()
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request, api_utils.GETSTOPLOCATION) if devStoreKey is None: logging.debug("unable to validate the request parameters") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write( json.dumps( api_utils.buildErrorResponse( '-1', 'Illegal request parameters'))) return # snare the inputs stopID = api_utils.conformStopID(self.request.get('stopID')) logging.debug('getstoplocation request parameters... stopID %s' % stopID) if api_utils.afterHours() is True: # don't run these jobs during "off" hours json_response = api_utils.buildErrorResponse( '-1', 'The Metro service is not currently running') elif stopID is not '': json_response = stopLocationRequest(stopID) api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETSTOPS, self.request.query_string, self.request.remote_addr) else: logging.error("API: invalid request") json_response = api_utils.buildErrorResponse( '-1', 'Invalid Request parameters. Did you forget to include a stpID?' ) api_utils.recordDeveloperRequest( devStoreKey, api_utils.GETSTOPS, self.request.query_string, self.request.remote_addr, 'illegal query string combination') #logging.debug('API: json response %s' % json_response); # encapsulate response in json callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json.dumps(json_response) self.response.out.write(response) stathat.apiStatCount() # push event out to anyone watching the live board task = Task(url='/map/task', params={'stopID': stopID}) task.add('eventlogger')
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request,api_utils.GETROUTES) if devStoreKey is None: logging.debug("unable to validate the request parameters") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Illegal request parameters'))) return logging.debug('getroutes request... ') if self.request.get('force') is not '': refresh = True else: refresh = False if api_utils.afterHours() is True: # don't run these jobs during "off" hours json_response = api_utils.buildErrorResponse('-1','The Metro service is not currently running') else: if refresh is True: json_response = getRoutes(refresh) # drop it into the memcache again memcache.set(api_utils.GETROUTES, json_response) logging.debug('---> storing in memcache'); else: logging.debug('---> memcache hit'); json_response = memcache.get(api_utils.GETROUTES) if json_response is None: json_response = getRoutes(refresh) # drop it into the memcache again memcache.set(api_utils.GETROUTES, json_response) logging.debug('---> storing in memcache'); # record the API call for this devkey api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETROUTES,self.request.query_string,self.request.remote_addr); #logging.debug('API: json response %s' % json_response); callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json_response self.response.out.write(response) stathat.apiStatCount()
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request) if devStoreKey is None: logging.debug("unable to validate the request parameters") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write( json.dumps( api_utils.buildErrorResponse( '-1', 'Illegal request parameters'))) return # snare the inputs routeID = self.request.get('routeID') logging.debug('getvehicles request parameters... routeID %s' % routeID) if api_utils.afterHours() is True: # don't run these jobs during "off" hours json_response = api_utils.buildErrorResponse( '-1', 'The Metro service is not currently running') elif routeID is not '': json_response = routeRequest(routeID) api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETVEHICLES, self.request.query_string, self.request.remote_addr) else: logging.error("API: invalid request") json_response = api_utils.buildErrorResponse( '-1', 'Invalid Request parameters. Did you forget to include a routeID?' ) api_utils.recordDeveloperRequest( devStoreKey, api_utils.GETVEHICLES, self.request.query_string, self.request.remote_addr, 'illegal query string combination') #logging.debug('API: json response %s' % json_response); # encapsulate response in json callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json.dumps(json_response) self.response.out.write(response) stathat.apiStatCount()
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request,api_utils.GETSTOPS) if devStoreKey is None: if( not (self.request.get('key') == 'kiosk' and self.request.get('stopID') == '') ): logging.error("failed to validate the request parameters") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Illegal request parameters'))) return # snare the inputs stopID = api_utils.conformStopID(self.request.get('stopID')) routeID = self.request.get('routeID') destination = self.request.get('destination').upper() logging.debug('getstops request parameters... routeID %s destination %s' % (routeID,destination)) if api_utils.afterHours() is True: # don't run these jobs during "off" hours json_response = api_utils.buildErrorResponse('-1','The Metro service is not currently running') elif routeID is not '' and destination is '': json_response = routeRequest(routeID, None) api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETSTOPS,self.request.query_string,self.request.remote_addr); elif routeID is not '' and destination is not '': json_response = routeRequest(routeID, destination) api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETSTOPS,self.request.query_string,self.request.remote_addr); else: logging.error("API: invalid request") json_response = api_utils.buildErrorResponse('-1','Invalid Request parameters. Did you forget to include a routeID?') api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETSTOPS,self.request.query_string,self.request.remote_addr,'illegal query string combination'); #logging.debug('API: json response %s' % json_response); # encapsulate response in json callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json.dumps(json_response) self.response.out.write(response) stathat.apiStatCount() # push event out to anyone watching the live board task = Task(url='/map/task', params={'stopID':stopID}) task.add('eventlogger')
def post(self): self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write( json.dumps( api_utils.buildErrorResponse( '-1', 'The API does not support POST requests'))) return
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request) if devStoreKey is None: logging.warning("API: unsupported method") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','This method is not yet enabled'))) return
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request) if devStoreKey is None: logging.debug("unable to validate the request parameters") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Illegal request parameters'))) return # snare the inputs routeID = self.request.get('routeID') if len(routeID) == 1: routeID = "0" + routeID logging.debug('getvehicles request parameters... routeID %s' % routeID) if api_utils.afterHours() is True: # don't run these jobs during "off" hours json_response = api_utils.buildErrorResponse('-1', 'The Metro service is not currently running') elif routeID is not '': json_response = routeRequest(routeID) api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETVEHICLES, self.request.query_string, self.request.remote_addr); else: logging.error("API: invalid request") json_response = api_utils.buildErrorResponse('-1','Invalid Request parameters. Did you forget to include a routeID?') api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETVEHICLES, self.request.query_string, self.request.remote_addr,'illegal query string combination'); #logging.debug('API: json response %s' % json_response); # encapsulate response in json callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json.dumps(json_response) self.response.out.write(response) stathat.apiStatCount()
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request) if devStoreKey is None: logging.warning("API: unsupported method") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write( json.dumps( api_utils.buildErrorResponse( '-1', 'This method is not yet enabled'))) return
def routeRequest(routeID): loop = 0 done = False result = None while not done and loop < 3: try: url = VEHICLE_URL_BASE + routeID result = urlfetch.fetch(url) done = True except urlfetch.DownloadError: logging.error("Error loading page (%s)... sleeping" % loop) if result: logging.debug("Error status: %s" % result.status_code) logging.debug("Error header: %s" % result.headers) logging.debug("Error content: %s" % result.content) time.sleep(6) loop = loop + 1 if result is None or result.status_code != 200: logging.error("Exiting early: error fetching URL: " + result.status_code) return api_utils.buildErrorResponse('-1', 'Error reading live Metro feed') dataArray = result.content.split('*') logging.debug('timestamp is %s' % dataArray[0]) timestamp = dataArray[0] vehicles = dataArray[2].split(';') results = dict({ 'status': 0, 'routeID': routeID, 'count': len(vehicles) - 1, 'timestamp': timestamp, 'vehicles': list() }) for v in vehicles: if v == vehicles[-1]: break location = v.split('|') next = location[3].split('<br>') spot = dict({ 'lat': location[0], 'lon': location[1], 'direction': re.sub('<[^>]*>', '', next[0]), 'vehicleID': next[1].split(':')[1].lstrip(), 'nextStop': next[2].split(':')[1].lstrip() }) results['vehicles'].append(spot) return results
def routeRequest(routeID): loop = 0 done = False result = None while not done and loop < 3: try: url = VEHICLE_URL_BASE + routeID result = urlfetch.fetch(url) done = True; except urlfetch.DownloadError: logging.error("Error loading page (%s)... sleeping" % loop) if result: logging.debug("Error status: %s" % result.status_code) logging.debug("Error header: %s" % result.headers) logging.debug("Error content: %s" % result.content) time.sleep(6) loop = loop+1 if result is None or result.status_code != 200: logging.error("Exiting early: error fetching URL: " + result.status_code) return api_utils.buildErrorResponse('-1','Error reading live Metro feed') dataArray = result.content.split('*') logging.debug('timestamp is %s' % dataArray[0]) timestamp = dataArray[0] vehicles = dataArray[2].split(';') results = dict({'status' : 0, 'routeID' : routeID, 'count' : len(vehicles)-1, 'timestamp' : timestamp, 'vehicles' : list() }) for v in vehicles: if v == vehicles[-1]: break location = v.split('|') next = location[3].split('<br>') spot = dict({'lat':location[0], 'lon':location[1], 'direction':re.sub('<[^>]*>', '', next[0]), 'vehicleID':next[1].split(':')[1].lstrip(), 'nextStop':next[2].split(':')[1].lstrip() }) results['vehicles'].append(spot) return results
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request, api_utils.GETNEARBYSTOPS) if devStoreKey is None: logging.error("unable to validate the request parameters") self.response.headers['Content-Type'] = 'application/json' self.response.out.write( json.dumps( api_utils.buildErrorResponse( '-1', 'Illegal request parameters'))) return # snare the inputs lat = float(self.request.get('lat')) lon = float(self.request.get('lon')) radius = self.request.get('radius') if radius == '' or radius is None: radius = 100 else: radius = int(radius) routeID = self.request.get('routeID') destination = self.request.get('destination') # stop location requests... json_response = nearbyStops(lat, lon, radius, routeID, destination) # encapsulate response in json #logging.debug('API: json response %s' % response); callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json.dumps(json_response) self.response.out.write(response) stathat.apiStatCount()
def get(self): # validate the request parameters devStoreKey = validateRequest(self.request,api_utils.GETNEARBYSTOPS) if devStoreKey is None: logging.error("unable to validate the request parameters") self.response.headers['Content-Type'] = 'application/json' self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Illegal request parameters'))) return # snare the inputs lat = float(self.request.get('lat')) lon = float(self.request.get('lon')) radius = self.request.get('radius') if radius == '' or radius is None: radius = 100 else: radius = int(radius) routeID = self.request.get('routeID') direction = self.request.get('direction') # stop location requests... json_response = nearbyStops(lat,lon,radius,routeID,direction) # encapsulate response in json #logging.debug('API: json response %s' % response); callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json.dumps(json_response) self.response.out.write(response) stathat.apiStatCount()
def routeRequest(routeID): # need to first translate the routeID into the # internal Metro code for that route. route = asynch.getRouteListing(routeID=routeID) if not route or len(route) is 0: logging.error("Exiting early: unable to locate route listing: " + routeID) return api_utils.buildErrorResponse('-1', 'Unknown routeID') else: metro_route_code = route[0].routeCode logging.debug('%s - %s' % (routeID, metro_route_code)) # now go fetch the vehicle details from Metro... loop = 0 done = False result = None while not done and loop < 3: try: payload = {} payload['routeID'] = metro_route_code headers = {'Content-Type': 'application/json'} result = urlfetch.fetch( url=VEHICLE_URL_BASE, payload=json.dumps(payload), method=urlfetch.POST, headers=headers) done = True except urlfetch.Error: logging.error("Error loading page (%s)... sleeping" % loop) if result: logging.debug("Error status: %s" % result.status_code) logging.debug("Error header: %s" % result.headers) logging.debug("Error content: %s" % result.content) time.sleep(6) loop = loop+1 if result is None or result.status_code != 200: logging.error("Exiting early: error fetching URL: " + result.status_code) return api_utils.buildErrorResponse('-1', 'Error reading live Metro feed') # vehicle results are in a JSON array # { "d" : [ {}, {} ] } json_result = json.loads(result.content) vehicles = json_result['d'] if vehicles: vehicle_count = len(vehicles) else: vehicle_count = 0 # setup the core response object results = dict({'status' : 0, 'routeID' : routeID, 'count' : vehicle_count, 'timestamp' : api_utils.getLocalTimestamp(), 'vehicles' : list()}) if vehicles: # loop through all vehicles on the route and parse # out details for the response for v in vehicles: if v == vehicles[-1]: break spot = dict({'lat':v['lat'], 'lon':v['lon'], 'direction':v['directionName'], 'vehicleID':v['propertyTag'], 'nextStop':v['nextStop'], 'bikeRack':v['bikeRack'], 'wifiAccess':v['wiFiAccess'], 'wheelChairAccessible':v['wheelChairAccessible'], 'wheelChairLift':v['wheelChairLift']}) results['vehicles'].append(spot) return results
def post(self): self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','The API does not support POST requests'))) return
def get(self): start = time.time() # snare the inputs dev_key = self.request.get('key') stopID = api_utils.conformStopID(self.request.get('stopID')) routeID = self.request.get('routeID') vehicleID = self.request.get('vehicleID') #logging.debug('getarrivals request parameters... stopID %s routeID %s vehicleID %s' % (stopID,routeID,vehicleID)) self.request.registry['aggregated_results'] = [] try: if api_utils.afterHours() is False: # and dev_key != 'uwkiosk9': # validate the request parameters devStoreKey = validateRequest(self.request) if devStoreKey is None: # filter out the kiosk errors from the log if (not (dev_key == 'kiosk' and self.request.get('stopID') == '')): logging.error( "failed to validate the request parameters") self.response.headers[ 'Content-Type'] = 'application/javascript' self.response.out.write( json.dumps( api_utils.buildErrorResponse( '-1', 'Unable to validate the request. There may be an illegal developer key.' ))) return if stopID is not '' and routeID is '': json_response = stopRequest(stopID, dev_key) api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETARRIVALS, self.request.query_string, self.request.remote_addr) elif stopID is not '' and routeID is not '': json_response = stopRouteRequest(stopID, routeID, devStoreKey) api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETARRIVALS, self.request.query_string, self.request.remote_addr) elif routeID is not '' and vehicleID is not '': json_response = routeVehicleRequest( routeID, vehicleID, devStoreKey) api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETVEHICLE, self.request.query_string, self.request.remote_addr) else: logging.debug("API: invalid request") api_utils.recordDeveloperRequest( devStoreKey, api_utils.GETARRIVALS, self.request.query_string, self.request.remote_addr, 'illegal query string combination') json_response = api_utils.buildErrorResponse( '-1', 'Invalid Request parameters') # push event out to anyone watching the live board channels = memcache.get('channels') if channels is not None: task = Task(url='/map/task', params={'stopID': stopID}) task.add('eventlogger') # stop statistics - DISABLED # if( "kiosk" not in dev_key ): # task = Task(url='/stats/stop', params={'apikey':dev_key,'stop':stopID}) # task.add('stats') else: # don't run these jobs during "off" hours #logging.debug('shunted... off hour request') #if dev_key.find('kiosk') >= 0: # json_response = api_utils.buildErrorResponse('-1','Kiosk requests no longer supported') #else: json_response = api_utils.buildErrorResponse( '-1', 'The Metro service is not currently running') # encapsulate response in json or jsonp callback = self.request.get('callback') if callback is not '': self.response.headers[ 'Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json.dumps(json_response) self.response.out.write(response) except DeadlineExceededError: self.response.clear() self.response.set_status(500) self.response.out.write( "This operation could not be completed in time...") # persist some statistics # stathat: if api_utils.afterHours() is False and dev_key != 'uwkiosk9': stathat.apiTimeStat(config.STATHAT_API_GETARRIVALS_TIME_KEY, ((time.time() - start) * 1000)) stathat.apiStatCount()
def post(self): self.response.headers["Content-Type"] = "application/javascript" self.response.out.write( json.dumps(api_utils.buildErrorResponse("-1", "The API does not support POST requests")) ) return
def get(self): start = time.time() # snare the inputs dev_key = self.request.get('key') stopID = api_utils.conformStopID(self.request.get('stopID')) routeID = self.request.get('routeID') vehicleID = self.request.get('vehicleID') #logging.debug('getarrivals request parameters... stopID %s routeID %s vehicleID %s' % (stopID,routeID,vehicleID)) self.request.registry['aggregated_results'] = [] try: if api_utils.afterHours() is False: # and dev_key != 'uwkiosk9': # validate the request parameters devStoreKey = validateRequest(self.request) if devStoreKey is None: # filter out the kiosk errors from the log if( not (dev_key == 'kiosk' and self.request.get('stopID') == '') ): logging.error("failed to validate the request parameters") self.response.headers['Content-Type'] = 'application/javascript' self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Unable to validate the request. There may be an illegal developer key.'))) return if stopID is not '' and routeID is '': json_response = stopRequest(stopID, dev_key) api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETARRIVALS,self.request.query_string,self.request.remote_addr); elif stopID is not '' and routeID is not '': json_response = stopRouteRequest(stopID, routeID, devStoreKey) api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETARRIVALS,self.request.query_string,self.request.remote_addr); elif routeID is not '' and vehicleID is not '': json_response = routeVehicleRequest(routeID, vehicleID, devStoreKey) api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETVEHICLE,self.request.query_string,self.request.remote_addr); else: logging.debug("API: invalid request") api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETARRIVALS,self.request.query_string,self.request.remote_addr,'illegal query string combination'); json_response = api_utils.buildErrorResponse('-1','Invalid Request parameters') # push event out to anyone watching the live board channels = memcache.get('channels') if channels is not None: task = Task(url='/map/task', params={'stopID':stopID}) task.add('eventlogger') # stop statistics - DISABLED # if( "kiosk" not in dev_key ): # task = Task(url='/stats/stop', params={'apikey':dev_key,'stop':stopID}) # task.add('stats') else: # don't run these jobs during "off" hours #logging.debug('shunted... off hour request') #if dev_key.find('kiosk') >= 0: # json_response = api_utils.buildErrorResponse('-1','Kiosk requests no longer supported') #else: json_response = api_utils.buildErrorResponse('-1','The Metro service is not currently running') # encapsulate response in json or jsonp callback = self.request.get('callback') if callback is not '': self.response.headers['Content-Type'] = 'application/javascript' self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET' response = callback + '(' + json.dumps(json_response) + ');' else: self.response.headers['Content-Type'] = 'application/json' response = json.dumps(json_response) self.response.out.write(response) except DeadlineExceededError: self.response.clear() self.response.set_status(500) self.response.out.write("This operation could not be completed in time...") # persist some statistics # stathat: if api_utils.afterHours() is False and dev_key != 'uwkiosk9': stathat.apiTimeStat(config.STATHAT_API_GETARRIVALS_TIME_KEY,((time.time()-start)*1000)) stathat.apiStatCount()