def test_task_form_save(self): """ Test task form save for new, human and machine tasks """ # Workflow steps are hard-coded on `choices` for `Project` models # regardless of `settings.py`. Once we move workflows back into the # database, we should use the test workflows rather than the production # ones in `settings.py.` Until then, the hack below suffices. workflows = get_workflows() test_workflow_slug = 'website_design' workflow = workflows[test_workflow_slug] human_steps = {step_slug: step for step_slug, step in workflow.steps.items() if step.worker_type == Step.WorkerType.HUMAN} step_slug, step = human_steps.popitem() project = ProjectFactory(workflow_slug=test_workflow_slug) for certification_slug in step.required_certifications: certification = CertificationFactory(slug=certification_slug) for uname in (0, 1, 3, 6): WorkerCertificationFactory( certification=certification, worker=self.workers[uname], role=WorkerCertification.Role.ENTRY_LEVEL) for uname in (3, 6): WorkerCertificationFactory( certification=certification, worker=self.workers[uname], role=WorkerCertification.Role.REVIEWER) # Add new task to project form = TaskForm({'project': project.id, 'status': Task.Status.AWAITING_PROCESSING, 'step_slug': step_slug}) form.is_valid() self.assertTrue(form.is_valid()) task = form.save() self.assertFalse(task.assignments.exists()) # Add new task to project and assign to entry_level worker (0) form = TaskForm({'project': project.id, 'status': Task.Status.AWAITING_PROCESSING, 'step_slug': step_slug}) self.assertTrue(form.is_valid()) form.cleaned_data['currently_assigned_to'] = self.workers[0].id task = form.save() self.assertTrue(is_worker_assigned_to_task(self.workers[0], task)) self.assertEquals(assignment_history(task).count(), 1) self.assertTrue(task.assignments.exists()) self.assertEquals(task.status, Task.Status.PROCESSING) # Render task with preexisting entry_level assignment (0) and reassign # to another entry_level worker (1) form = TaskForm(model_to_dict(task), instance=task) self.assertEquals(form.fields['currently_assigned_to'].initial, self.workers[0].id) form.is_valid() self.assertTrue(form.is_valid()) form.cleaned_data['currently_assigned_to'] = self.workers[1].id task = form.save() self.assertTrue(is_worker_assigned_to_task(self.workers[1], task)) self.assertEquals(assignment_history(task).count(), 1) self.assertEquals(task.status, Task.Status.PROCESSING) # Submit task with patch('orchestra.utils.task_lifecycle._is_review_needed', return_value=True): task = submit_task(task.id, {}, TaskAssignment.SnapshotType.SUBMIT, self.workers[1], 0) # Assign to reviewer (3) and reassign to another reviewer (6) task = assign_task(self.workers[3].id, task.id) self.assertTrue(task.status, Task.Status.REVIEWING) self.assertTrue(is_worker_assigned_to_task(self.workers[3], task)) task = Task.objects.get(id=task.id) form = TaskForm(model_to_dict(task), instance=task) self.assertEquals(form.fields['currently_assigned_to'].initial, self.workers[3].id) self.assertTrue(form.is_valid()) form.cleaned_data['currently_assigned_to'] = self.workers[6].id task = form.save() self.assertTrue(is_worker_assigned_to_task(self.workers[6], task)) self.assertEquals(assignment_history(task).count(), 2) self.assertEquals(task.status, Task.Status.REVIEWING) # Attempt to reassign to non-certified worker (2) form = TaskForm(model_to_dict(task), instance=task) self.assertTrue(form.is_valid()) form.cleaned_data['currently_assigned_to'] = self.workers[2].id with self.assertRaises(WorkerCertificationError): form.save()
def test_task_form_save(self): """ Test task form save for new, human and machine tasks """ workflow_version = self.workflow_versions['test_workflow'] human_step = self.workflow_steps[workflow_version.slug]['step1'] project = ProjectFactory(workflow_version=workflow_version) # Add new task to project form = TaskForm({'project': project.id, 'status': Task.Status.AWAITING_PROCESSING, 'step': human_step.id, 'start_datetime': timezone.now()}) form.is_valid() self.assertTrue(form.is_valid()) task = form.save() self.assertFalse(task.assignments.exists()) # Add new task to project and assign to entry_level worker (0) form = TaskForm({'project': project.id, 'status': Task.Status.AWAITING_PROCESSING, 'step': human_step.id, 'start_datetime': timezone.now()}) self.assertTrue(form.is_valid()) form.cleaned_data['currently_assigned_to'] = self.workers[0].id task = form.save() self.assertTrue(is_worker_assigned_to_task(self.workers[0], task)) self.assertEquals(assignment_history(task).count(), 1) self.assertTrue(task.assignments.exists()) self.assertEquals(task.status, Task.Status.PROCESSING) # Render task with preexisting entry_level assignment (0) and reassign # to another entry_level worker (4) form = TaskForm(model_to_dict(task), instance=task) self.assertEquals(form.fields['currently_assigned_to'].initial, self.workers[0].id) form.is_valid() self.assertTrue(form.is_valid()) form.cleaned_data['currently_assigned_to'] = self.workers[4].id task = form.save() self.assertTrue(is_worker_assigned_to_task(self.workers[4], task)) self.assertEquals(assignment_history(task).count(), 1) self.assertEquals(task.status, Task.Status.PROCESSING) # Submit task with patch('orchestra.utils.task_lifecycle._is_review_needed', return_value=True): task = submit_task(task.id, {}, TaskAssignment.SnapshotType.SUBMIT, self.workers[4], 0) # Assign to reviewer (1) and reassign to another reviewer (3) task = assign_task(self.workers[1].id, task.id) self.assertTrue(task.status, Task.Status.REVIEWING) self.assertTrue(is_worker_assigned_to_task(self.workers[1], task)) task = Task.objects.get(id=task.id) form = TaskForm(model_to_dict(task), instance=task) self.assertEquals(form.fields['currently_assigned_to'].initial, self.workers[1].id) self.assertTrue(form.is_valid()) form.cleaned_data['currently_assigned_to'] = self.workers[3].id task = form.save() self.assertTrue(is_worker_assigned_to_task(self.workers[3], task)) self.assertEquals(assignment_history(task).count(), 2) self.assertEquals(task.status, Task.Status.REVIEWING) # Attempt to reassign to non-certified worker (2) form = TaskForm(model_to_dict(task), instance=task) self.assertTrue(form.is_valid()) form.cleaned_data['currently_assigned_to'] = self.workers[2].id with self.assertRaises(WorkerCertificationError): form.save()