Ejemplo n.º 1
0
def task_enqueue_categories(request):
    """
    Enqueues animal tables. To be run by cron
    """
    q = Queue('animal-indexes')
    category = None  #request.GET.get('category')
    if category:
        taskqueue.add(
            Task(url='/adopt/_tasks_/fetch_category',
                 method='post',
                 payload=json.dumps({
                     'category': category,
                     'url': _getpetharbor_url(x)
                 })))
    else:
        for x in PETHARBOR_URLS.keys():
            q.add(
                Task(url='/adopt/_tasks_/fetch_category',
                     name="fetch-%s-%s" %
                     (x, datetime.datetime.now().strftime('%Y%m%d%H%M%S')),
                     method='post',
                     payload=str(
                         json.dumps({
                             'category': x,
                             'url': _get_petharbor_url(x)
                         }))))
    return TextResponse('OK')
Ejemplo n.º 2
0
def apiTimeStat(stat_key, value):
    task = Task(url='/stats/new/value',
                params={
                    'stat_key': stat_key,
                    'value': value
                })
    task.add('stats')
Ejemplo n.º 3
0
        def _tx():

            pending_email = PendingEmail(subscription=sub, edition=edition)
            db.put(pending_email)
            SendNewsletter.add(
                Task(params={'pending_email': pending_email.key()}),
                transactional=True)
Ejemplo n.º 4
0
    def get(self):

        # review the results for popular stops
        reqs = getRequestedStops()
        stops_stats = []
        keyLookup = []
        totalReqs = 0
        for key, value in reqs.items():
            stops_stats.append({
                'stopID': key,
                'count': value,
            })
            totalReqs += value
            keyLookup.append(key + ':loc')

        # do we have the stop locations?
        stopLocations = memcache.get_multi(keyLookup)  #reqs.keys())
        if stopLocations is None or len(stopLocations) == 0:
            logging.error("unable to find stop locations!?")
            # create an event to go get this data
            task = Task(url='/labs/maptask', params={
                'clean': '1',
            })
            task.add('crawler')
            msg = "no data"
        else:
            logging.debug('yes... found cached copies of the stop locations!')
            msg = "your data"

        locations = []
        median = 2.5
        logging.debug('found a total of %s requests with a median %s' %
                      (str(totalReqs), str(median)))
        for key, value in stopLocations.items():
            if value is None:
                continue

            stopID = key.split(':')[0]
            # normalized value = count/median * %Total + (count-median)+ base
            weight = (float(reqs[stopID]) / median) + float(
                reqs[stopID]) - median + 75.0
            logging.debug('%s / %s weight is %s' %
                          (stopID, reqs[stopID], str(weight)))
            locations.append({
                'stopID': stopID,
                'location': value,
                'count': reqs[stopID],
                'weight': weight,
            })

        template_values = {
            'stops': stops_stats,
            'locations': locations,
            'message': msg,
        }

        # create a page that provides a form for sending an SMS message
        path = os.path.join(os.path.dirname(__file__), 'mapit.html')
        self.response.out.write(template.render(path, template_values))
Ejemplo n.º 5
0
    def get(self):

        # validate it is in fact coming from twilio
        if config.ACCOUNT_SID == self.request.get('AccountSid'):
            logging.debug(
                "PHONE request was confirmed to have come from Twilio.")
        else:
            logging.error("was NOT VALID.  It might have been spoofed!")
            self.response.out.write(errorResponse("Illegal caller"))
            return

        # pull the route and stopID out of the request body and
        # pad it with a zero on the front if the message forgot
        # to include it (that's how they are stored in the DB)
        routeID = memcache.get(self.request.get('AccountSid'))
        memcache.delete(self.request.get('AccountSid'))

        stopID = self.request.get('Digits')
        if len(stopID) == 3:
            stopID = "0" + stopID

        # hack - creating a string out of the details to conform to other interfaces
        requestArgs = "%s %s" % (routeID, stopID)

        ## magic ##
        logging.info('starting the magic... %s' % requestArgs)
        textBody = api_bridge.getarrivals(requestArgs, 1)
        logging.debug('phone results are %s' % textBody)

        # create an event to log the event
        task = Task(url='/loggingtask',
                    params={
                        'phone': self.request.get('Caller'),
                        'inboundBody': requestArgs,
                        'sid': self.request.get('SmsSid'),
                        'outboundBody': textBody,
                    })
        task.add('eventlogger')

        # transform the text a smidge so it can be pronounced more easily...
        # 1. strip the colons
        textBody = textBody.replace(':', ' ')
        # 2. add a space between p-and-m and a-and-m
        textBody = textBody.replace('pm', 'p m').replace('am', 'a m')
        logging.debug('transformed results into %s' % textBody)

        # setup the response
        r = twilio.Response()
        r.append(
            twilio.Say(textBody,
                       voice=twilio.Say.MAN,
                       language=twilio.Say.ENGLISH,
                       loop=1))

        self.response.out.write(r)
Ejemplo n.º 6
0
    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')
Ejemplo n.º 7
0
def application ( environ, start_response ):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    form = cgi.FieldStorage(fp=environ['wsgi.input'], 
                            environ=environ)

    users = db.GqlQuery('SELECT * FROM User')
    for user in users:
        task = Task(payload=None, countdown =60, method = 'GET', url = '/get_timeline?account=' + user.screen_name)
        task.add()
        print user.screen_name
    return "OK"
Ejemplo n.º 8
0
def _task_fetch_category(url, category):
    """
    Fetch an animal table, parse out information, and enqueue a task to fetch the image and store the data in the database
    """
    q = Queue('animal-profiles')
    page = fetch(url)
    animals = parse_petharbor_table(page.content, category)
    for animal in animals:
        animal['src_url'] = url
        q.add(
            Task(url='/adopt/_tasks_/fetch_animal',
                 name="fetch-%s-%s-%s" %
                 (category, animal['code'],
                  datetime.datetime.now().strftime('%Y%m%d%H%M')),
                 method="post",
                 payload=str(json.dumps(animal))))
Ejemplo n.º 9
0
def mail_queue_expander(request):
    BATCH_SIZE = 5
    edition = db.get(request.form['edition'])
    if not edition: pass
    page = int(request.form.get('page', 0))
    subscriber_q = Query(subscriptions.models.Subscription,
                         keys_only=True).filter('site =', edition.site).filter(
                             'active =', True)
    if request.form.has_key('cursor'):
        subscriber_q = subscriber_q.with_cursor(request.form['cursor'])
    subscribers = subscriber_q.fetch(BATCH_SIZE)
    if not subscribers:
        edition.status = 'complete'
        edition.put()
        return
    task = Task(params={
        'edition': edition.key(),
        'cursor': subscriber_q.cursor(),
        'page': page + 1
    },
                name="%s-%s-%s-%s" %
                (edition.site.slug, edition.issue_num,
                 edition.publish_after.strftime("%Y%j%H%M-%S"), page + 1))
    try:
        MailQueueExpander.add(task)
    except (TaskAlreadyExistsError, TombstonedTaskError):
        raise
    for sub in subscribers:

        def _tx():

            pending_email = PendingEmail(subscription=sub, edition=edition)
            db.put(pending_email)
            SendNewsletter.add(
                Task(params={'pending_email': pending_email.key()}),
                transactional=True)

        db.run_in_transaction_custom_retries(10, _tx)
Ejemplo n.º 10
0
    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()
Ejemplo n.º 11
0
 def get(self):
     # create an event to go get this data
     task = Task(url='/labs/maptask', params={
         'clean': '1',
     })
     task.add('crawler')
Ejemplo n.º 12
0
class HitList(RequestHandler):
    def get(self):
        user = users.get_current_user()
        type = self.get_value('type', required=False)
        type = self.map_type(type)

        self.render('priv/hit_list.html', {
            'user': user,
            'type': type,
            'time': datetime_format(datetime.utcnow())
        })

    def post(self):

        type = self.get_value('type', required=False)
        type = self.map_type(type)

        try:
            hit = HIT()
            hit.owner = users.get_current_user()
            hit.lifetime = self.get_value('lifetime', required=True, mapfn=int)
            hit.duration = self.get_value('duration', required=True, mapfn=int)
            hit.approval_delay = self.get_value('approval_delay',
                                                required=True,
                                                mapfn=int)

            hit.hit_approval = self.get_value('hit_approval',
                                              required=False,
                                              mapfn=int)
            hit.hit_approval_rate = self.get_value('hit_approval_rate',
                                                   required=True,
                                                   mapfn=int)
            hit.accepted_hit_rate = self.get_value('accepted_hit_rate',
                                                   required=True,
                                                   mapfn=int)
            hit.returned_hit_rate = self.get_value('returned_hit_rate',
                                                   required=True,
                                                   mapfn=int)
            hit.abandoned_hit_rate = self.get_value('abandoned_hit_rate',
                                                    required=True,
                                                    mapfn=int)
            hit.rejected_hit_rate = self.get_value('rejected_hit_rate',
                                                   required=True,
                                                   mapfn=int)
            hit.locale_qualification = self.get_value('locale_qualification',
                                                      required=True)

            hit.frame_height = self.get_value('frame_height',
                                              required=True,
                                              mapfn=int)

            if type != 'MULTIPLE_URLS':
                hit.max_workers = self.get_value('max_workers',
                                                 required=True,
                                                 mapfn=int)
                if type != 'PASS_THROUGH':
                    hit.min_workers = self.get_value('min_workers',
                                                     required=True,
                                                     mapfn=int)

            if type == 'MULTIPLE_URLS':
                hit.location1 = self.get_value('location1', required=True)
                hit.size1 = self.get_value('size1', required=True, mapfn=int)
                hit.location2 = self.get_value('location2', required=False)
                hit.size2 = self.get_value('size2', required=False, mapfn=int)
                hit.location3 = self.get_value('location3', required=False)
                hit.size3 = self.get_value('size3', required=False, mapfn=int)
                hit.location4 = self.get_value('location4', required=False)
                hit.size4 = self.get_value('size4', required=False, mapfn=int)
                hit.location5 = self.get_value('location5', required=False)
                hit.size5 = self.get_value('size5', required=False, mapfn=int)
                hit.location6 = self.get_value('location6', required=False)
                hit.size6 = self.get_value('size6', required=False, mapfn=int)
                hit.location7 = self.get_value('location7', required=False)
                hit.size7 = self.get_value('size7', required=False, mapfn=int)
                hit.location8 = self.get_value('location8', required=False)
                hit.size8 = self.get_value('size8', required=False, mapfn=int)
                hit.location9 = self.get_value('location9', required=False)
                hit.size9 = self.get_value('size9', required=False, mapfn=int)
                hit.location10 = self.get_value('location10', required=False)
                hit.size10 = self.get_value('size10',
                                            required=False,
                                            mapfn=int)
            else:
                hit.location = self.get_value('location', required=True)

            hit.aws_access_key = self.get_value('aws_access_key',
                                                required=True)
            hit.aws_secret_key = self.get_value('aws_secret_key',
                                                required=True)
            hit.auth_secret = self.get_value('auth_secret', required=False)
            hit.title = self.get_value('title', required=True)
            hit.description = self.get_value('description', required=True)
            hit.reward = self.get_value('reward', required=True)
            hit.handle_submit = self.get_value('handle_submit',
                                               required=False,
                                               mapfn=bool)
            hit.always_pay = self.get_value('always_pay',
                                            required=False,
                                            mapfn=bool)
            hit.sandbox = self.get_value('sandbox', required=False, mapfn=bool)
            hit.blacklist = re.split('[,\s]+',
                                     self.request.get('blacklist').strip())
            hit.info = self.get_value('info')

            if type == 'FOCAL_TIME':
                hit.focal_time = iso8601.parse_date(
                    self.get_value('focal_time',
                                   required=True).replace('Z', ':00Z'))

            hit.type = type
            hit.next_worker_number = 1
            hit.put()
        except BadValueError, error:
            self.response.set_status(400)
            self.response.out.write(error.reason)
            return

        try:
            response = create_hit(self.hit_countdown_url(hit), hit)

            hit.mturkid = response.identifier
            hit.groupid = response.HITTypeId
            hit.time = iso8601.parse_date(response.expiration)
            hit.put()

            if type == 'FOCAL_TIME':
                task = Task(url='/notification',
                            params={'key': str(hit.key())},
                            eta=hit.focal_time - timedelta(minutes=2))
                task.add('default')

            self.response.out.write(self.hit_url(hit))
        except (BotoClientError, BotoServerError), aws:
            error = 'Error: %s: %s' % (aws.errors[0][0], aws.errors[0][1])

            self.response.set_status(500)
            self.response.out.write(error)