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()
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()
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()
def get(self, key): try: hit = HIT.get(key) except BadKeyError: data = {} else: data = self.item(hit) self.json(data)
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)
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()
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()
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()
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()
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()
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()
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()
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()
def post(self): key = self.request.get('key') logging.info("key=" + key) hit = HIT.get(key) notify(hit)
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
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