示例#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)
示例#2
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)