def create(self, **kwargs): provider = MTurkProvider(host=SITE_HOST, aws_access_key_id=self.validated_data['client_id'], aws_secret_access_key=self.validated_data['client_secret']) balance, is_valid = provider.test_connection() if not is_valid: raise ValidationError('Invalid AWS Keys or missing AmazonMechanicalTurkFullAccess policy') client_secret = AESUtil(key=AWS_DAEMO_KEY).encrypt(self.validated_data.pop('client_secret')) if not hasattr(kwargs.get('user'), 'mturk_account'): account = MTurkAccount.objects.create(user=kwargs.get('user'), client_secret=client_secret, **self.validated_data) return account else: kwargs.get('user').mturk_account.client_id = self.validated_data['client_id'] kwargs.get('user').mturk_account.client_secret = client_secret kwargs.get('user').mturk_account.save() return kwargs.get('user').mturk_account
def get_provider(user, host=None): if not hasattr(user, 'mturk_account'): return None if host is None: host = SITE_HOST client_secret = AESUtil(key=AWS_DAEMO_KEY).decrypt( user.mturk_account.client_secret) return MTurkProvider(host=host, aws_access_key_id=user.mturk_account.client_id, aws_secret_access_key=client_secret)
def create(self, request, *args, **kwargs): worker = get_or_create_worker(worker_id=request.data.get('workerId')) provider = MTurkProvider('https://' + request.get_host()) task_id = request.data.get('taskId', -1) task_hash = Hashids(salt=settings.SECRET_KEY, min_length=settings.ID_HASH_MIN_LENGTH) task_id = task_hash.decode(task_id) if len(task_id) == 0: task_id = -1 hit_id = request.data.get('hitId', -1) mturk_hit = get_object_or_404(MTurkHIT, task_id=task_id, hit_id=hit_id) assignment_id = request.data.get('assignmentId', -1) mturk_assignment_id = None task_worker = None if assignment_id != 'ASSIGNMENT_ID_NOT_AVAILABLE': assignment, is_valid = provider.get_assignment(assignment_id) if not assignment or (is_valid and assignment.HITId != hit_id): return Response(data={"message": "Invalid assignment"}, status=status.HTTP_400_BAD_REQUEST) task_worker, created = TaskWorker.objects.get_or_create( worker=worker, task_id=task_id[0]) if created: task_worker.task_status = TaskWorker.STATUS_IN_PROGRESS task_worker.save() assignment, created = MTurkAssignment.objects.get_or_create( hit=mturk_hit, assignment_id=assignment_id, task_worker=task_worker) mturk_assignment_id = assignment.id if created: assignment.status = TaskWorker.STATUS_IN_PROGRESS assignment.save() task_serializer = TaskSerializer(instance=mturk_hit.task, fields=('id', 'template', 'project_data', 'status'), context={'task_worker': task_worker}) response_data = { 'task': task_serializer.data, 'assignment': mturk_assignment_id } return Response(data=response_data, status=status.HTTP_200_OK)
def create(self, **kwargs): provider = MTurkProvider( host=SITE_HOST, aws_access_key_id=self.validated_data['client_id'], aws_secret_access_key=self.validated_data['client_secret']) balance, is_valid = provider.test_connection() if not is_valid: raise ValidationError( 'Invalid AWS Keys or missing AmazonMechanicalTurkFullAccess policy' ) client_secret = AESUtil(key=AWS_DAEMO_KEY).encrypt( self.validated_data.pop('client_secret')) if not hasattr(kwargs.get('user'), 'mturk_account'): account = MTurkAccount.objects.create(user=kwargs.get('user'), client_secret=client_secret, **self.validated_data) return account else: kwargs.get('user').mturk_account.client_id = self.validated_data[ 'client_id'] kwargs.get('user').mturk_account.client_secret = client_secret kwargs.get('user').mturk_account.save() return kwargs.get('user').mturk_account
def create(self, request, *args, **kwargs): worker = get_or_create_worker(worker_id=request.data.get('workerId')) provider = MTurkProvider('https://' + request.get_host()) task_id = request.data.get('taskId', -1) task_hash = Hashids(salt=settings.SECRET_KEY, min_length=settings.ID_HASH_MIN_LENGTH) task_id = task_hash.decode(task_id) if len(task_id) == 0: task_id = -1 hit_id = request.data.get('hitId', -1) mturk_hit = get_object_or_404(MTurkHIT, task_id=task_id, hit_id=hit_id) assignment_id = request.data.get('assignmentId', -1) mturk_assignment_id = None task_worker = None if assignment_id != 'ASSIGNMENT_ID_NOT_AVAILABLE': assignment, is_valid = provider.get_assignment(assignment_id) if not assignment or (is_valid and assignment.HITId != hit_id): return Response(data={"message": "Invalid assignment"}, status=status.HTTP_400_BAD_REQUEST) task_worker, created = TaskWorker.objects.get_or_create(worker=worker, task_id=task_id[0]) if created: task_worker.task_status = TaskWorker.STATUS_IN_PROGRESS task_worker.save() assignment, created = MTurkAssignment.objects.get_or_create(hit=mturk_hit, assignment_id=assignment_id, task_worker=task_worker) mturk_assignment_id = assignment.id if created: assignment.status = TaskWorker.STATUS_IN_PROGRESS assignment.save() task_serializer = TaskSerializer(instance=mturk_hit.task, fields=('id', 'template', 'project_data', 'status'), context={'task_worker': task_worker}) response_data = { 'task': task_serializer.data, 'assignment': mturk_assignment_id } return Response(data=response_data, status=status.HTTP_200_OK)
def mturk_update_status(project): provider = MTurkProvider(SITE_HOST) hits = MTurkHIT.objects.filter(task__project_id=project['id']) for hit in hits: if project['status'] == Project.STATUS_IN_PROGRESS: provider.extend_hit(hit.hit_id) hit.status = MTurkHIT.STATUS_IN_PROGRESS else: provider.expire_hit(hit.hit_id) hit.status = MTurkHIT.STATUS_EXPIRED hit.save() return 'SUCCESS'
def mturk_publish(): provider = MTurkProvider(SITE_HOST) projects = Project.objects.filter(deleted=False, min_rating__lt=0.61) for project in projects: provider.create_hits(project) return {'message': 'SUCCESS'}
def mturk_approve(list_workers): provider = MTurkProvider(SITE_HOST) for task_worker_id in list_workers: provider.approve_assignment({'id': task_worker_id}) return 'SUCCESS'
def mturk_hit_update(task): provider = MTurkProvider(SITE_HOST) return provider.update_max_assignments(task)