Beispiel #1
0
    def create_tasks(self, task_repo, project, importer=None, **form_data):
        """Create tasks."""
        from pybossa.model.task import Task
        from pybossa.cache import projects as cached_projects

        """Create tasks from a remote source using an importer object and
        avoiding the creation of repeated tasks"""
        n = 0
        importer = importer or self._create_importer_for(**form_data)
        tasks = importer.tasks()
        header_report = self._validate_headers(importer, project, **form_data)
        if header_report:
            return header_report
        msg = ''
        validator = TaskImportValidator(get_enrichment_output_fields(project))
        n_answers = project.get_default_n_answers()
        try:
            for task_data in tasks:

                self.upload_private_data(task_data, project.id)

                task = Task(project_id=project.id, n_answers=n_answers)
                [setattr(task, k, v) for k, v in task_data.iteritems()]

                gold_answers = task_data.pop('gold_answers', None)
                set_gold_answers(task, gold_answers)

                found = task_repo.find_duplicate(project_id=project.id,
                                                info=task.info)
                if found is not None:
                    continue
                if not validator.validate(task):
                    continue
                try:
                    n += 1
                    task_repo.save(task, clean_project=False)
                except Exception as e:
                    current_app.logger.exception(msg)
                    validator.add_error(str(e))
        finally:
            cached_projects.clean_project(project.id)

        if form_data.get('type') == 'localCSV':
            csv_filename = form_data.get('csv_filename')
            delete_import_csv_file(csv_filename)

        metadata = importer.import_metadata()
        if n==0:
            msg = gettext('It looks like there were no new records to import. ')
        elif n == 1:
            msg = str(n) + " " + gettext('new task was imported successfully ')
        else:
            msg = str(n) + " " + gettext('new tasks were imported successfully ')
        msg += str(validator)

        return ImportReport(message=msg, metadata=metadata, total=n)
Beispiel #2
0
def task_gold(project_id=None):
    """Make task gold"""
    try:
        if not current_user.is_authenticated:
            return abort(401)

        project = project_repo.get(project_id)

        # Allow project owner, sub-admin co-owners, and admins to update Gold tasks.
        is_gold_access = (current_user.subadmin and current_user.id
                          in project.owners_ids) or current_user.admin
        if project is None or not is_gold_access:
            raise Forbidden
        if request.method == 'POST':
            task_data = json.loads(
                request.form['request_json']
            ) if 'request_json' in request.form else request.json
            task_id = task_data['task_id']
            task = task_repo.get_task(task_id)
            if task.project_id != project_id:
                raise Forbidden
            preprocess_task_run(project_id, task_id, task_data)
            info = task_data['info']
            set_gold_answers(task, info)
            task_repo.update(task)

            response_body = json.dumps({'success': True})
        else:
            task = sched.select_task_for_gold_mode(project, current_user.id)
            if task:
                task = task.dictize()
                sign_task(task)
            response_body = json.dumps(task)
        return Response(response_body, 200, mimetype="application/json")
    except Exception as e:
        return error.format_exception(e,
                                      target='taskgold',
                                      action=request.method)
Beispiel #3
0
    def create_tasks(self, task_repo, project, **form_data):
        """Create tasks."""
        from pybossa.model.task import Task
        from pybossa.cache import projects as cached_projects
        """Create tasks from a remote source using an importer object and
        avoiding the creation of repeated tasks"""
        n = 0
        importer = self._create_importer_for(**form_data)
        tasks = importer.tasks()
        import_headers = importer.headers()
        mismatch_headers = []

        msg = ''
        if import_headers:
            if not project:
                msg = gettext('Could not load project info')
            else:
                task_presenter_headers = project.get_presenter_headers()
                mismatch_headers = [
                    header for header in task_presenter_headers
                    if header not in import_headers
                ]

            if mismatch_headers:
                msg = 'Imported columns do not match task presenter code. '
                additional_msg = 'Mismatched columns: {}'.format(
                    (', '.join(mismatch_headers))[:80])
                current_app.logger.error(msg)
                current_app.logger.error(', '.join(mismatch_headers))
                msg += additional_msg

            if msg:
                # Failed validation
                current_app.logger.error(msg)
                return ImportReport(message=msg, metadata=None, total=0)

        validator = TaskImportValidator()
        n_answers = project.get_default_n_answers()
        try:
            for task_data in tasks:

                self.upload_private_data(task_data, project.id)

                task = Task(project_id=project.id, n_answers=n_answers)
                [setattr(task, k, v) for k, v in task_data.iteritems()]

                gold_answers = task_data.pop('gold_answers', None)
                set_gold_answers(task, gold_answers)

                found = task_repo.find_duplicate(project_id=project.id,
                                                 info=task.info)
                if found is None:
                    if validator.validate(task):
                        try:
                            n += 1
                            task_repo.save(task, clean_project=False)
                        except Exception as e:
                            current_app.logger.exception(msg)
                            validator.add_error(str(e))
        finally:
            cached_projects.clean_project(project.id)

        if form_data.get('type') == 'localCSV':
            csv_filename = form_data.get('csv_filename')
            delete_import_csv_file(csv_filename)

        metadata = importer.import_metadata()
        if n == 0:
            msg = gettext(
                'It looks like there were no new records to import. ')
        elif n == 1:
            msg = str(n) + " " + gettext('new task was imported successfully ')
        else:
            msg = str(n) + " " + gettext(
                'new tasks were imported successfully ')
        msg += str(validator)

        return ImportReport(message=msg, metadata=metadata, total=n)