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)
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)