Exemple #1
0
    def create_revision(instance):
        models.Project.objects.filter(group_id=instance.group_id).update(
            status=models.Project.STATUS_PAUSED)
        template = TemplateSerializer.create_revision(
            instance=instance.template)
        batch_files = copy.copy(instance.batch_files.all())
        tasks = copy.copy(instance.tasks.all())
        mturk_update_status.delay({
            'id': instance.id,
            'status': models.Project.STATUS_PAUSED
        })
        instance.pk = None
        instance.template = template
        instance.status = models.Project.STATUS_DRAFT
        instance.is_prototype = False
        instance.is_paid = False
        instance.save()
        for f in batch_files:
            models.ProjectBatchFile.objects.create(project=instance,
                                                   batch_file=f)

        for t in tasks:
            t.pk = None
            t.project = instance
        TaskSerializer.bulk_create(data=tasks)

        return instance
Exemple #2
0
    def create_task(project_id):
        task_data = {"project": project_id, "data": {}}

        task_serializer = TaskSerializer(data=task_data)

        if task_serializer.is_valid():
            task_serializer.create()
        else:
            raise ValidationError(task_serializer.errors)
    def create_task(project_id):
        task_data = {
            "project": project_id,
            "data": {}
        }

        task_serializer = TaskSerializer(data=task_data)

        if task_serializer.is_valid():
            task_serializer.create()
        else:
            raise ValidationError(task_serializer.errors)
Exemple #4
0
    def update(self, *args, **kwargs):
        status = self.validated_data.get('status', self.instance.status)
        num_rows = self.validated_data.get('num_rows', 0)
        if self.instance.status != status and status == 2:
            if self.instance.templates.all()[0].template_items.count() == 0:
                raise ValidationError('At least one template item is required')
            if self.instance.batch_files.count() == 0:
                task_data = {
                    "project": self.instance.id,
                    "status": 1,
                    "data": {}
                }
                task_serializer = TaskSerializer(data=task_data)
                if task_serializer.is_valid():
                    task_serializer.create()
                else:
                    raise ValidationError(task_serializer.errors)
            else:
                batch_file = self.instance.batch_files.first()
                data = batch_file.parse_csv()
                count = 0
                for row in data:
                    if count == num_rows:
                        break
                    task = {'project': self.instance.id, 'data': row}
                    task_serializer = TaskSerializer(data=task)
                    if task_serializer.is_valid():
                        task_serializer.create(**kwargs)
                        count += 1
                    else:
                        raise ValidationError(task_serializer.errors)
            self.instance.published_time = datetime.now()
            status += 1

        self.instance.name = self.validated_data.get('name',
                                                     self.instance.name)
        self.instance.price = self.validated_data.get('price',
                                                      self.instance.price)
        self.instance.repetition = self.validated_data.get(
            'repetition', self.instance.repetition)
        if status != self.instance.status \
            and status in (models.Project.STATUS_PAUSED, models.Project.STATUS_IN_PROGRESS) and \
                self.instance.status in (models.Project.STATUS_PAUSED, models.Project.STATUS_IN_PROGRESS):
            mturk_update_status.delay({
                'id': self.instance.id,
                'status': status
            })
        self.instance.status = status
        self.instance.save()
        return self.instance
    def create(self, **kwargs):
        templates = self.validated_data.pop('template')
        project = self.validated_data.pop('project')
        file_id = self.validated_data.pop('file_id')
        csv_data = []
        if file_id is not None:
            uploaded_file = models.RequesterInputFile.objects.get(id=file_id)
            csv_data = uploaded_file.parse_csv()
            uploaded_file.delete()

        # module_tasks = self.validated_data.pop('module_tasks')
        module = models.Module.objects.create(deleted=False,
                                              project=project,
                                              owner=kwargs['owner'].requester,
                                              **self.validated_data)
        '''
            experiment pool, default 6 ignored
        '''
        experimental_models.ModulePool.objects.create(module=module, pool=6)

        for template in templates:
            template_items = template.pop('template_items')
            t = models.Template.objects.get_or_create(owner=kwargs['owner'],
                                                      **template)
            models.ModuleTemplate.objects.get_or_create(module=module,
                                                        template=t[0])
            for item in template_items:
                models.TemplateItem.objects.get_or_create(template=t[0],
                                                          **item)
        if module.has_data_set:
            for row in csv_data:
                task = {'module': module.id, 'data': json.dumps(row)}
                task_serializer = TaskSerializer(data=task)
                if task_serializer.is_valid():
                    task_serializer.create(**kwargs)
                else:
                    raise ValidationError(task_serializer.errors)
        else:
            task = {'module': module.id, 'data': "{\"type\": \"static\"}"}
            task_serializer = TaskSerializer(data=task)
            if task_serializer.is_valid():
                task_serializer.create(**kwargs)
            else:
                raise ValidationError(task_serializer.errors)
        return module
    def create_revision(instance):
        models.Project.objects.filter(group_id=instance.group_id).update(status=models.Project.STATUS_PAUSED)
        template = TemplateSerializer.create_revision(instance=instance.template)
        # batch_files = copy.copy(instance.batch_files.all())
        tasks = copy.copy(instance.tasks.all())
        mturk_update_status.delay({'id': instance.id, 'status': models.Project.STATUS_PAUSED})
        instance.pk = None
        instance.template = template
        instance.status = models.Project.STATUS_DRAFT
        instance.is_prototype = False
        instance.is_paid = False
        instance.save()
        # for f in batch_files:
        #     models.ProjectBatchFile.objects.create(project=instance, batch_file=f)

        for t in tasks:
            t.pk = None
            t.project = instance
        TaskSerializer.bulk_create(data=tasks)

        return instance
    def update(self, *args, **kwargs):
        status = self.validated_data.get('status', self.instance.status)
        num_rows = self.validated_data.get('num_rows', 0)
        if self.instance.status != status and status == 2:
            if self.instance.templates.all()[0].template_items.count() == 0:
                raise ValidationError('At least one template item is required')
            if self.instance.batch_files.count() == 0:
                task_data = {
                    "project": self.instance.id,
                    "status": 1,
                    "data": {}
                }
                task_serializer = TaskSerializer(data=task_data)
                if task_serializer.is_valid():
                    task_serializer.create()
                else:
                    raise ValidationError(task_serializer.errors)
            else:
                batch_file = self.instance.batch_files.first()
                data = batch_file.parse_csv()
                count = 0
                for row in data:
                    if count == num_rows:
                        break
                    task = {
                        'project': self.instance.id,
                        'data': row
                    }
                    task_serializer = TaskSerializer(data=task)
                    if task_serializer.is_valid():
                        task_serializer.create(**kwargs)
                        count += 1
                    else:
                        raise ValidationError(task_serializer.errors)
            self.instance.published_time = datetime.now()
            status += 1

        self.instance.name = self.validated_data.get('name', self.instance.name)
        self.instance.price = self.validated_data.get('price', self.instance.price)
        self.instance.repetition = self.validated_data.get('repetition', self.instance.repetition)
        if status != self.instance.status \
            and status in (models.Project.STATUS_PAUSED, models.Project.STATUS_IN_PROGRESS) and \
                self.instance.status in (models.Project.STATUS_PAUSED, models.Project.STATUS_IN_PROGRESS):
            mturk_update_status.delay({'id': self.instance.id, 'status': status})
        self.instance.status = status
        self.instance.save()
        return self.instance
    def create(self, **kwargs):
        templates = self.validated_data.pop('template')
        project = self.validated_data.pop('project')
        file_id = self.validated_data.pop('file_id')
        csv_data = []
        if file_id is not None:
            uploaded_file = models.RequesterInputFile.objects.get(id=file_id)
            csv_data = uploaded_file.parse_csv()
            uploaded_file.delete()

        # module_tasks = self.validated_data.pop('module_tasks')
        module = models.Module.objects.create(deleted=False, project=project,
                                              owner=kwargs['owner'].requester, **self.validated_data)
        '''
            experiment pool, default 6 ignored
        '''
        experimental_models.ModulePool.objects.create(module=module, pool=6)

        for template in templates:
            template_items = template.pop('template_items')
            t = models.Template.objects.get_or_create(owner=kwargs['owner'], **template)
            models.ModuleTemplate.objects.get_or_create(module=module, template=t[0])
            for item in template_items:
                models.TemplateItem.objects.get_or_create(template=t[0], **item)
        if module.has_data_set:
            for row in csv_data:
                task = {
                    'module': module.id,
                    'data': json.dumps(row)
                }
                task_serializer = TaskSerializer(data=task)
                if task_serializer.is_valid():
                    task_serializer.create(**kwargs)
                else:
                    raise ValidationError(task_serializer.errors)
        else:
            task = {
                'module': module.id,
                'data': "{\"type\": \"static\"}"
            }
            task_serializer = TaskSerializer(data=task)
            if task_serializer.is_valid():
                task_serializer.create(**kwargs)
            else:
                raise ValidationError(task_serializer.errors)
        return module
 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 update(self, *args, **kwargs):
        status = self.validated_data.get("status", self.instance.status)
        num_rows = self.validated_data.get("num_rows", 0)
        if self.instance.status != status and status == 2:
            if self.instance.templates.all()[0].template_items.count() == 0:
                raise ValidationError("At least one template item is required")
            if self.instance.batch_files.count() == 0:
                task_data = {"project": self.instance.id, "status": 1, "data": {}}
                task_serializer = TaskSerializer(data=task_data)
                if task_serializer.is_valid():
                    task_serializer.create()
                else:
                    raise ValidationError(task_serializer.errors)
            else:
                batch_file = self.instance.batch_files.first()
                data = batch_file.parse_csv()
                count = 0
                for row in data:
                    if count == num_rows:
                        break
                    task = {"project": self.instance.id, "data": row}
                    task_serializer = TaskSerializer(data=task)
                    if task_serializer.is_valid():
                        task_serializer.create(**kwargs)
                        count += 1
                    else:
                        raise ValidationError(task_serializer.errors)
            self.instance.published_time = datetime.now()
            status += 1

        self.instance.name = self.validated_data.get("name", self.instance.name)
        self.instance.price = self.validated_data.get("price", self.instance.price)
        self.instance.repetition = self.validated_data.get("repetition", self.instance.repetition)
        self.instance.status = status
        self.instance.save()
        return self.instance
Exemple #11
0
 def download_results(self, request, *args, **kwargs):
     project_id = request.query_params.get('project_id')
     task = Task.objects.filter(project=project_id)
     task_serializer = TaskSerializer(task,
                                      many=True,
                                      fields=('data', 'task_workers',
                                              'comments'))
     tasks = task_serializer.data
     column_headers = [
         'task_status', 'worker_alias', 'created', 'last_updated',
         'feedback'
     ]
     data_keys = eval(tasks[0]['data']).keys()
     for key in data_keys:
         column_headers.append(key)
     data = []
     items = []
     for task in tasks:
         task_workers = task['task_workers']
         for task_worker in task_workers:
             task_worker_results = task_worker['task_worker_results']
             results = []
             for task_worker_result in task_worker_results:
                 results.append(task_worker_result['result'])
             item = {
                 'id':
                 task_worker['id'],
                 'data':
                 task['data'],
                 'worker_alias':
                 task_worker['worker_alias'],
                 'task_status':
                 task_worker['task_status'],
                 'results':
                 results,
                 'created':
                 task_worker['created_timestamp'],
                 'last_updated':
                 task_worker['last_updated'],
                 'feedback':
                 ', '.join(
                     map(lambda x: x['comment'].get('body', ''),
                         [comment for comment in task['comments']]))
             }
             items.append(item)
     max_results = 0
     for item in items:
         temp = [
             item['task_status'], item['worker_alias'], item['created'],
             item['last_updated'], item['feedback']
         ]
         for key in data_keys:
             temp.append(eval(item['data'])[key])
         num_results = 0
         for result in item['results']:
             num_results += 1
             temp.append(result)
         if num_results > max_results:
             max_results = num_results
         data.append(temp)
     for i in xrange(1, max_results + 1):
         column_headers.append('Output_' + str(i))
     df = pd.DataFrame(data)
     output = StringIO.StringIO()
     df.to_csv(output, header=column_headers, index=False, encoding="utf-8")
     data = output.getvalue()
     output.close()
     return Response(data, status.HTTP_200_OK)
Exemple #12
0
    def create(self, request, *args, **kwargs):
        worker = get_or_create_worker(worker_id=request.data.get('workerId'))
        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
        else:
            task_id = task_id[0]

        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
        provider = get_provider(mturk_hit.task.project.owner,
                                host='https://' + request.get_host())
        notify = True

        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)

            if not is_allowed_to_work(worker, task_id, assignment_id):
                return Response(data={
                    "message":
                    "You are not allowed to work on this HIT, please skip it."
                },
                                status=status.HTTP_403_FORBIDDEN)

            task_worker, created = TaskWorker.objects.get_or_create(
                worker=worker, task_id=task_id)

            if created:
                task_worker.status = TaskWorker.STATUS_IN_PROGRESS
                task_worker.save()

            # get or create notification preference
            preference, p_created = ProjectNotificationPreference.objects.get_or_create(
                project_group_id=mturk_hit.task.project.group_id,
                worker=worker)
            notify = preference.notify

            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,
            'is_review':
            mturk_hit.task.project.is_review,
            'is_rejected':
            task_worker.collective_rejection is not None
            if task_worker is not None else False,
            'notify':
            notify
        }
        return Response(data=response_data, status=status.HTTP_200_OK)