Exemplo n.º 1
0
  def get(self, key):
    hit = HIT.get(key)

    if hit:
      worker = worker_lookup(hit, self.request.get('workerId'))

      if worker is None:
        self.not_found()
      else:
        worker.remote_addr = self.request.remote_addr
        worker.user_agent = self.request.headers['User-Agent']
        worker.put()

        if hit.type == 'MULTIPLE_URLS':
          sizes = get_sizes(hit)
          remaining = 0
          for i in range (0, 11):
            if sizes[i] < worker.number <= sizes[i + 1]:
              remaining = sizes[i + 1] - worker.number
              break
          self.json({'status': 'OK', 'remaining': str(remaining)})
        elif hit.type == 'PASS_THROUGH':
          self.json({'status': 'OK', 'go': 'true'})
        else:
          self.json({'status': 'OK'})
    else:
      self.not_found()
Exemplo n.º 2
0
    def get(self, key):
        hit = HIT.get(key)

        if hit:
            worker = worker_lookup(hit, self.request.get('workerId'))

            if worker is None:
                self.not_found()
            else:
                worker.remote_addr = self.request.remote_addr
                worker.user_agent = self.request.headers['User-Agent']
                worker.put()

                if hit.type == 'MULTIPLE_URLS':
                    sizes = get_sizes(hit)
                    remaining = 0
                    for i in range(0, 11):
                        if sizes[i] < worker.number <= sizes[i + 1]:
                            remaining = sizes[i + 1] - worker.number
                            break
                    self.json({'status': 'OK', 'remaining': str(remaining)})
                elif hit.type == 'PASS_THROUGH':
                    self.json({'status': 'OK', 'go': 'true'})
                else:
                    self.json({'status': 'OK'})
        else:
            self.not_found()
Exemplo n.º 3
0
  def get(self, key):
    hit = HIT.get(key)

    # TODO: track worker details here too?

    if hit:
      if hit.type == 'PASS_THROUGH' or datetime.utcnow() > hit.time:  # don't check time for pass-through
        worker = worker_lookup(hit, self.request.get('workerId'))

        if worker is None:
          self.not_found() # TODO: log error?
        else:
          if hit.min_workers > hit_workers(hit).count(): # TODO: only include active workers in count?
            if hit.always_pay:
              self.json({'available': False, 'message': 'Not enough people. You will still be paid for this HIT.', 'submit': True})
            else:
              self.json({'available': False, 'message': 'Not enough people. Please return this HIT.', 'submit': False})
          else:
            #worker.number = next_worker_number(hit)
            #worker.put()

            url = target_url(hit, self.request.query_string, worker)

            self.json({'available': True, 'location': url, 'submit': hit.handle_submit})
      else:
        self.not_found() # or other error code?
    else:
      self.not_found()
Exemplo n.º 4
0
  def get(self, key):
    try:
      hit = HIT.get(key)
    except BadKeyError:
      data = {}
    else:
      data = self.item(hit)

    self.json(data)
Exemplo n.º 5
0
    def get(self, key):
        try:
            hit = HIT.get(key)
        except BadKeyError:
            data = {}
        else:
            data = self.item(hit)

        self.json(data)
Exemplo n.º 6
0
  def get(self):
    type = self.get_value('type', required=False)
    type = self.map_type(type)
    hits = HIT.all().filter('owner = ', users.get_current_user()) \
                    .filter('type = ', type)\
                    .order('added')

    data = [self.item(hit) for hit in hits]

    self.json(data)
Exemplo n.º 7
0
    def get(self):
        type = self.get_value('type', required=False)
        type = self.map_type(type)
        hits = HIT.all().filter('owner = ', users.get_current_user()) \
                        .filter('type = ', type)\
                        .order('added')

        data = [self.item(hit) for hit in hits]

        self.json(data)
Exemplo n.º 8
0
  def get(self, key):
    hit = HIT.get(key)

    if hit:
      try: 
        cancel_hit(hit)
      except Exception:
        status = 'NG'
      else:
        hit.delete()
        status = 'OK'

      self.json({'status': status})
    else:
      self.not_found()
Exemplo n.º 9
0
    def get(self, key):
        hit = HIT.get(key)

        if hit:
            try:
                cancel_hit(hit)
            except Exception:
                status = 'NG'
            else:
                hit.delete()
                status = 'OK'

            self.json({'status': status})
        else:
            self.not_found()
Exemplo n.º 10
0
    def get(self, key):
        hit = HIT.get(key)

        # TODO: track worker details here too?

        if hit:
            if hit.type == 'PASS_THROUGH' or datetime.utcnow(
            ) > hit.time:  # don't check time for pass-through
                worker = worker_lookup(hit, self.request.get('workerId'))

                if worker is None:
                    self.not_found()  # TODO: log error?
                else:
                    if hit.min_workers > hit_workers(hit).count(
                    ):  # TODO: only include active workers in count?
                        if hit.always_pay:
                            self.json({
                                'available': False,
                                'message':
                                'Not enough people. You will still be paid for this HIT.',
                                'submit': True
                            })
                        else:
                            self.json({
                                'available': False,
                                'message':
                                'Not enough people. Please return this HIT.',
                                'submit': False
                            })
                    else:
                        #worker.number = next_worker_number(hit)
                        #worker.put()

                        url = target_url(hit, self.request.query_string,
                                         worker)

                        self.json({
                            'available': True,
                            'location': url,
                            'submit': hit.handle_submit
                        })
            else:
                self.not_found()  # or other error code?
        else:
            self.not_found()
Exemplo n.º 11
0
  def get(self, key):
    hit = HIT.get(key)

    if hit:
      workers = []

      for worker in hit_workers(hit):
        workers.append({
          'last_seen': unix_timestamp(worker.last_seen)
        , 'remote_addr': worker.remote_addr
        , 'mturkid': worker.mturkid
        , 'assignment_id': worker.assignment_id
        , 'click_go': worker.click_go
        })

      self.json({'workers': workers})
    else:
      self.not_found()
Exemplo n.º 12
0
    def get(self, key):
        hit = HIT.get(key)

        if hit:
            workers = []

            for worker in hit_workers(hit):
                workers.append({
                    'last_seen': unix_timestamp(worker.last_seen),
                    'remote_addr': worker.remote_addr,
                    'mturkid': worker.mturkid,
                    'assignment_id': worker.assignment_id,
                    'click_go': worker.click_go
                })

            self.json({'workers': workers})
        else:
            self.not_found()
Exemplo n.º 13
0
    def get(self, key):
        hit = HIT.get(key)

        if hit:
            if self.request.get(
                    'assignmentId') != 'ASSIGNMENT_ID_NOT_AVAILABLE':
                if self.request.get('workerId') in hit.blacklist:
                    self.render('priv/hit_blacklisted.html',
                                {'title': hit.title})
                    return

                worker = worker_lookup(hit, self.request.get('workerId'))

                if worker is None:
                    worker = Worker()
                    worker.hit = hit
                    worker.mturkid = self.request.get('workerId')
                    worker.assignment_id = self.request.get('assignmentId')
                    worker.number = next_worker_number(hit)  # save number ASAP

                worker.remote_addr = self.request.remote_addr
                worker.user_agent = self.request.headers['User-Agent']
                worker.put()

                clickgo_url = json.dumps(self.worker_click_go(worker))

            else:
                clickgo_url = json.dumps('')

            self.render(
                'priv/hit_countdown.html', {
                    'time': unix_timestamp(hit.time),
                    'title': hit.title,
                    'heartbeat_url': json.dumps(self.hit_heartbeat_url(hit)),
                    'location_url': json.dumps(self.hit_location_url(hit)),
                    'info': hit.info,
                    'hit': hit,
                    'clickgo_url': clickgo_url
                })
        else:
            self.not_found()
Exemplo n.º 14
0
  def get(self, key):
    hit = HIT.get(key)

    if hit:
      if hit.focal_time:
        focal_time = datetime_format(hit.focal_time)
      else:
        focal_time = None

      self.render('priv/hit_detail.html', {
        'hit': hit
      , 'hit_group_url': hit_group_url(hit)
      , 'added': datetime_format(hit.added)
      , 'timestamp': json.dumps(unix_timestamp(hit.time))
      , 'workers_url': json.dumps(self.hit_workers_url(hit))
      , 'cancel_url': json.dumps(self.hit_cancel_url(hit))
      , 'user': users.get_current_user()
      , 'focal_time': focal_time
      })
    else:
      self.not_found()
Exemplo n.º 15
0
    def get(self, key):
        hit = HIT.get(key)

        if hit:
            if hit.focal_time:
                focal_time = datetime_format(hit.focal_time)
            else:
                focal_time = None

            self.render(
                'priv/hit_detail.html', {
                    'hit': hit,
                    'hit_group_url': hit_group_url(hit),
                    'added': datetime_format(hit.added),
                    'timestamp': json.dumps(unix_timestamp(hit.time)),
                    'workers_url': json.dumps(self.hit_workers_url(hit)),
                    'cancel_url': json.dumps(self.hit_cancel_url(hit)),
                    'user': users.get_current_user(),
                    'focal_time': focal_time
                })
        else:
            self.not_found()
Exemplo n.º 16
0
  def get(self, key):
    hit = HIT.get(key)

    if hit:
      if self.request.get('assignmentId') != 'ASSIGNMENT_ID_NOT_AVAILABLE':
        if self.request.get('workerId') in hit.blacklist:
          self.render('priv/hit_blacklisted.html', {'title': hit.title})
          return

        worker = worker_lookup(hit, self.request.get('workerId'))

        if worker is None:
          worker = Worker()
          worker.hit = hit
          worker.mturkid = self.request.get('workerId')
          worker.assignment_id = self.request.get('assignmentId')
          worker.number = next_worker_number(hit)  # save number ASAP

        worker.remote_addr = self.request.remote_addr
        worker.user_agent = self.request.headers['User-Agent']
        worker.put()
      
        clickgo_url = json.dumps(self.worker_click_go(worker))

      else:
        clickgo_url = json.dumps('')

      self.render('priv/hit_countdown.html', {
        'time': unix_timestamp(hit.time)
      , 'title': hit.title
      , 'heartbeat_url': json.dumps(self.hit_heartbeat_url(hit))
      , 'location_url': json.dumps(self.hit_location_url(hit))
      , 'info': hit.info
      , 'hit': hit
      , 'clickgo_url': clickgo_url
      })
    else:
      self.not_found()
Exemplo n.º 17
0
 def post(self):
     key = self.request.get('key')
     logging.info("key=" + key)
     hit = HIT.get(key)
     notify(hit)
Exemplo n.º 18
0
  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
Exemplo n.º 19
0
 def post(self):
   key = self.request.get('key')
   logging.info("key=" + key)
   hit = HIT.get(key)
   notify(hit)
Exemplo n.º 20
0
    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