Exemple #1
0
    def setUp(self):
        """
        Sets up Project, Task objects, and saves them to the DB.
        The Project form HTML only displays the one input variable.
        The Task has inputs and answers and refers to the Project form.
        """
        admin = User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        project = Project(name='test', html_template="<p>${foo}</p><textarea>")
        project.created_by = admin
        project.updated_by = admin
        save_model(project)
        batch = Batch(name='test', project=project, filename='test.csv')
        batch.created_by = admin
        batch.updated_by = admin
        save_model(batch)

        task = Task(
            batch=batch,
            input_csv_fields={'foo': 'bar'},
            completed=True,
        )
        task.save()
        self.task = task

        self.task_assignment = TaskAssignment(
            answers={
                "comment": "\u221e", "userDisplayLanguage": "",
                "sentence_textbox_3_verb1": "", "city": "",
                "sentence_textbox_1_verb6": "",
                "sentence_textbox_1_verb7": "",
                "sentence_textbox_1_verb4": "",
                "sentence_textbox_1_verb5": "",
                "sentence_textbox_1_verb2": "",
                "sentence_textbox_1_verb3": "",
                "sentence_textbox_1_verb1": "",
                "sentence_textbox_2_verb4": "",
                "csrfmiddlewaretoken": "7zxQ9Yyug6Nsnm4nLky9p8ObJwNipdu8",
                "sentence_drop_2_verb3": "foo",
                "sentence_drop_2_verb2": "foo",
                "sentence_drop_2_verb1": "foo",
                "sentence_textbox_2_verb1": "",
                "sentence_textbox_2_verb3": "",
                "sentence_drop_2_verb4": "foo",
                "sentence_textbox_2_verb2": "",
                "submitit": "Submit", "browserInfo": "",
                "sentence_drop_1_verb1": "foo",
                "sentence_drop_1_verb2": "foo",
                "sentence_drop_1_verb3": "foo",
                "sentence_drop_1_verb4": "foo",
                "sentence_drop_1_verb5": "foo",
                "sentence_drop_1_verb6": "foo",
                "sentence_drop_1_verb7": "foo", "country": "",
                "sentence_drop_3_verb1": "foo",
                "ipAddress": "", "region": ""
            },
            assigned_to=None,
            completed=True,
            task=task
        )
        self.task_assignment.save()
Exemple #2
0
    def setUp(self):
        """
        Sets up Project, Task objects, and saves them to the DB.
        The Project form HTML only displays the one input variable.
        The Task has inputs and answers and refers to the Project form.
        """
        admin = User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        project = Project(name='test', html_template="<p>${foo}</p><textarea>")
        project.created_by = admin
        project.updated_by = admin
        save_model(project)
        batch = Batch(name='test', project=project, filename='test.csv')
        batch.created_by = admin
        batch.updated_by = admin
        save_model(batch)

        task = Task(
            batch=batch,
            input_csv_fields={'foo': 'bar'},
            completed=True,
        )
        task.save()
        self.task = task

        self.task_assignment = TaskAssignment(
            answers={
                "comment": "\u221e", "userDisplayLanguage": "",
                "sentence_textbox_3_verb1": "", "city": "",
                "sentence_textbox_1_verb6": "",
                "sentence_textbox_1_verb7": "",
                "sentence_textbox_1_verb4": "",
                "sentence_textbox_1_verb5": "",
                "sentence_textbox_1_verb2": "",
                "sentence_textbox_1_verb3": "",
                "sentence_textbox_1_verb1": "",
                "sentence_textbox_2_verb4": "",
                "csrfmiddlewaretoken": "7zxQ9Yyug6Nsnm4nLky9p8ObJwNipdu8",
                "sentence_drop_2_verb3": "foo",
                "sentence_drop_2_verb2": "foo",
                "sentence_drop_2_verb1": "foo",
                "sentence_textbox_2_verb1": "",
                "sentence_textbox_2_verb3": "",
                "sentence_drop_2_verb4": "foo",
                "sentence_textbox_2_verb2": "",
                "submitit": "Submit", "browserInfo": "",
                "sentence_drop_1_verb1": "foo",
                "sentence_drop_1_verb2": "foo",
                "sentence_drop_1_verb3": "foo",
                "sentence_drop_1_verb4": "foo",
                "sentence_drop_1_verb5": "foo",
                "sentence_drop_1_verb6": "foo",
                "sentence_drop_1_verb7": "foo", "country": "",
                "sentence_drop_3_verb1": "foo",
                "ipAddress": "", "region": ""
            },
            assigned_to=None,
            completed=True,
            task=task
        )
        self.task_assignment.save()
Exemple #3
0
    def test_task_marked_as_completed_two_way_redundancy(self):
        # When assignment_per_task==2, completing 2 Assignments marks Task as complete
        project = Project(name='test',
                          html_template='<p>${number} - ${letter}</p>')
        project.save()
        batch = Batch(project=project)
        batch.assignments_per_task = 2
        batch.save()

        task = Task(batch=batch,
                    input_csv_fields={
                        'number': '1',
                        'letter': 'a'
                    })
        task.save()

        self.assertFalse(task.completed)

        TaskAssignment(assigned_to=None, completed=True, task=task).save()
        task.refresh_from_db()
        self.assertFalse(task.completed)

        TaskAssignment(assigned_to=None, completed=True, task=task).save()
        task.refresh_from_db()
        self.assertTrue(task.completed)
Exemple #4
0
    def test_expire_abandoned_assignments(self):
        t = timezone.now()
        dt = datetime.timedelta(hours=2)
        past = t - dt

        project = Project(login_required=False)
        project.save()
        batch = Batch(
            allotted_assignment_time=1,
            project=project
        )
        batch.save()
        task = Task(batch=batch)
        task.save()
        ha = TaskAssignment(
            completed=False,
            expires_at=past,
            task=task,
        )
        # Bypass TaskAssignment's save(), which updates expires_at
        super(TaskAssignment, ha).save()
        self.assertEqual(TaskAssignment.objects.count(), 1)

        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('turkle_admin:expire_abandoned_assignments'))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], '/admin/')
        self.assertEqual(TaskAssignment.objects.count(), 0)
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]),
                         'All 1 abandoned Tasks have been expired')
Exemple #5
0
    def test_access_permitted_for_active_flag(self):
        user = User.objects.create_user('testuser', password='******')

        self.assertEqual(len(Batch.access_permitted_for(user)), 0)

        active_project = Project.objects.create()
        inactive_project = Project.objects.create(active=False)

        Batch.objects.create(
            active=False,
            project=active_project,
        )
        self.assertEqual(len(Batch.access_permitted_for(user)), 0)

        Batch.objects.create(active=False, project=inactive_project)
        self.assertEqual(len(Batch.access_permitted_for(user)), 0)

        Batch.objects.create(active=True, project=inactive_project)
        self.assertEqual(len(Batch.access_permitted_for(user)), 0)

        Batch.objects.create(
            active=True,
            project=active_project,
        )
        self.assertEqual(len(Batch.access_permitted_for(user)), 1)
Exemple #6
0
    def test_batches_available_for_anon(self):
        anonymous_user = AnonymousUser()

        project_protected = Project(
            active=True,
            login_required=True,
        )
        project_protected.save()
        self.assertEqual(
            len(project_protected.batches_available_for(anonymous_user)), 0)

        Batch(project=project_protected).save()
        self.assertEqual(
            len(project_protected.batches_available_for(anonymous_user)), 0)

        project_unprotected = Project(
            active=True,
            login_required=False,
        )
        project_unprotected.save()
        self.assertEqual(
            len(project_unprotected.batches_available_for(anonymous_user)), 0)

        Batch(project=project_unprotected).save()
        self.assertEqual(
            len(project_unprotected.batches_available_for(anonymous_user)), 1)
Exemple #7
0
 def setUp(self):
     project = Project(login_required=False)
     project.save()
     self.batch = Batch(project=project)
     self.batch.save()
     self.task = Task(batch=self.batch)
     self.task.save()
    def test_expire_abandoned_assignments(self):
        t = timezone.now()
        dt = datetime.timedelta(hours=2)
        past = t - dt

        project = Project(login_required=False)
        project.save()
        batch = Batch(allotted_assignment_time=1, project=project)
        batch.save()
        task = Task(batch=batch)
        task.save()
        ha = TaskAssignment(
            completed=False,
            expires_at=past,
            task=task,
        )
        # Bypass TaskAssignment's save(), which updates expires_at
        super(TaskAssignment, ha).save()
        self.assertEqual(TaskAssignment.objects.count(), 1)

        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(
            reverse('turkle_admin:expire_abandoned_assignments'))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], '/admin/')
        self.assertEqual(TaskAssignment.objects.count(), 0)
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]),
                         u'All 1 abandoned Tasks have been expired')
Exemple #9
0
    def test_index_unprotected_template(self):
        project_unprotected = Project(
            active=True,
            login_required=False,
            name='MY_TEMPLATE_NAME',
        )
        project_unprotected.save()
        batch = Batch(project=project_unprotected, name='MY_BATCH_NAME')
        batch.save()
        Task(batch=batch).save()

        anon_client = django.test.Client()
        response = anon_client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'No Tasks available' in response.content)
        self.assertTrue(b'MY_TEMPLATE_NAME' in response.content)
        self.assertTrue(b'MY_BATCH_NAME' in response.content)

        known_client = django.test.Client()
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        known_client.login(username='******', password='******')
        response = known_client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'No Tasks available' in response.content)
        self.assertTrue(b'MY_TEMPLATE_NAME' in response.content)
        self.assertTrue(b'MY_BATCH_NAME' in response.content)
Exemple #10
0
    def setUp(self):
        with open('turkle/tests/resources/form_0.html') as f:
            html_template = f.read()

        self.project = Project(name="filepath", html_template=html_template)
        self.project.save()
        self.batch = Batch(project=self.project)
        self.batch.save()
        field_names = "tweet0_id,tweet0_entity,tweet0_before_entity,tweet0_after_entity," + \
            "tweet0_word0,tweet0_word1,tweet0_word2,tweet1_id,tweet1_entity," + \
            "tweet1_before_entity,tweet1_after_entity,tweet1_word0,tweet1_word1,tweet1_word2," + \
            "tweet2_id,tweet2_entity,tweet2_before_entity,tweet2_after_entity,tweet2_word0," + \
            "tweet2_word1,tweet2_word2,tweet3_id,tweet3_entity,tweet3_before_entity," + \
            "tweet3_after_entity,tweet3_word0,tweet3_word1,tweet3_word2,tweet4_id," + \
            "tweet4_entity,tweet4_before_entity,tweet4_after_entity,tweet4_word0," + \
            "tweet4_word1,tweet4_word2,tweet5_id,tweet5_entity,tweet5_before_entity," + \
            "tweet5_after_entity,tweet5_word0,tweet5_word1,tweet5_word2",
        values = "268,SANTOS, Muy bien America ......... y lo siento mucho , un muy buen " + \
            "rival,mucho,&nbsp;,&nbsp;,2472,GREGORY, Ah bueno , tampoco andes pidiendo ese " +\
            "tipo de milagros . @jcabrerac @CarlosCabreraR,bueno,&nbsp;,&nbsp;,478,ALEJANDRO," + \
            " @aguillen19 &#44; un super abrazo mi querido , &#44; mis mejores deseos para " + \
            "este 2012 ... muakkk !,querido,&nbsp;,&nbsp;,906_control, PF, Acusan camioneros " + \
            "extorsiones de, : Transportistas acusaron que deben pagar entre 13 y 15 mil " + \
            "pesos a agentes que .. http://t.co/d8LUVvhP,acusaron,&nbsp;,&nbsp;,2793_control," + \
            " CHICARO, Me gusta cuando chicharo hace su oracion es lo que lo hace especial .," + \
            "&nbsp;,gusta,&nbsp;,&nbsp;,357,OSCAR WILDE&QUOT;, &quot; @ ifilosofia : Las " + \
            "pequeñas acciones de cada día son las que hacen o deshacen el carácter.&quot; , " + \
            "bueno !!!! Es así,bueno,&nbsp;,&nbsp;",
        self.task = Task(batch=self.batch,
                         input_csv_fields=dict(zip(field_names, values)))
        self.task.save()
Exemple #11
0
    def test_available_tasks_for_anon_user(self):
        anonymous_user = AnonymousUser()
        user = User.objects.create_user('user', password='******')

        project_protected = Project(
            active=True,
            login_required=True,
        )
        project_protected.save()
        self.assertEqual(len(Project.all_available_for(anonymous_user)), 0)
        self.assertEqual(len(Project.all_available_for(user)), 2)  # Project created by setUp
        batch_protected = Batch(project=project_protected)
        batch_protected.save()
        Task(batch=batch_protected).save()
        self.assertEqual(len(batch_protected.available_tasks_for(anonymous_user)), 0)
        self.assertEqual(len(batch_protected.available_tasks_for(user)), 1)

        project_unprotected = Project(
            active=True,
            login_required=False,
        )
        project_unprotected.save()
        batch_unprotected = Batch(project=project_unprotected)
        batch_unprotected.save()
        Task(batch=batch_unprotected).save()
        self.assertEqual(len(Project.all_available_for(anonymous_user)), 1)
        self.assertEqual(len(Project.all_available_for(user)), 3)
        self.assertEqual(len(project_unprotected.batches_available_for(anonymous_user)), 1)
        self.assertEqual(len(project_unprotected.batches_available_for(user)), 1)
        self.assertEqual(len(batch_unprotected.available_tasks_for(anonymous_user)), 1)
        self.assertEqual(len(batch_unprotected.available_tasks_for(user)), 1)
Exemple #12
0
    def test_index_unprotected_template(self):
        project_unprotected = Project(
            active=True,
            login_required=False,
            name='MY_TEMPLATE_NAME',
        )
        project_unprotected.save()
        batch = Batch(project=project_unprotected, name='MY_BATCH_NAME')
        batch.save()
        Task(batch=batch).save()

        anon_client = django.test.Client()
        response = anon_client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'No Tasks available' in response.content)
        self.assertTrue(b'MY_TEMPLATE_NAME' in response.content)
        self.assertTrue(b'MY_BATCH_NAME' in response.content)

        known_client = django.test.Client()
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        known_client.login(username='******', password='******')
        response = known_client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'No Tasks available' in response.content)
        self.assertTrue(b'MY_TEMPLATE_NAME' in response.content)
        self.assertTrue(b'MY_BATCH_NAME' in response.content)
Exemple #13
0
    def test_task_marked_as_completed_two_way_redundancy(self):
        # When assignment_per_task==2, completing 2 Assignments marks Task as complete
        project = Project(name='test', html_template='<p>${number} - ${letter}</p><textarea>')
        project.save()
        batch = Batch(name='test', project=project)
        batch.assignments_per_task = 2
        batch.save()

        task = Task(
            batch=batch,
            input_csv_fields={'number': '1', 'letter': 'a'}
        )
        task.save()

        self.assertFalse(task.completed)

        TaskAssignment(
            assigned_to=None,
            completed=True,
            task=task
        ).save()
        task.refresh_from_db()
        self.assertFalse(task.completed)

        TaskAssignment(
            assigned_to=None,
            completed=True,
            task=task
        ).save()
        task.refresh_from_db()
        self.assertTrue(task.completed)
Exemple #14
0
    def test_batch_to_input_csv(self):
        project = Project(name='test', html_template='<p>${letter}</p><textarea>')
        project.save()
        batch = Batch(project=project)
        batch.save()

        task1 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'letter': 'a', 'number': '1'},
        )
        task1.save()
        task2 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'letter': 'b', 'number': '2'},
        )
        task2.save()

        csv_output = StringIO()
        batch.to_input_csv(csv_output)
        rows = csv_output.getvalue().split()

        # Original column order not guaranteed
        if '"letter","number"' in rows[0]:
            self.assertTrue(any(['"a","1"' in row for row in rows[1:]]))
            self.assertTrue(any(['"b","2"' in row for row in rows[1:]]))
        elif '"number","letter"' in rows[0]:
            self.assertTrue(any(['"1","a"' in row for row in rows[1:]]))
            self.assertTrue(any(['"2","b"' in row for row in rows[1:]]))
        else:
            self.fail('Unexpected header value: %s' % rows[0])
Exemple #15
0
class TestAcceptTask(TestCase):
    def setUp(self):
        project = Project(login_required=False)
        project.save()
        self.batch = Batch(project=project)
        self.batch.save()
        self.task = Task(batch=self.batch)
        self.task.save()

    def test_accept_unclaimed_task(self):
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        self.assertEqual(self.task.taskassignment_set.count(), 0)

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('accept_task',
                                      kwargs={'batch_id': self.batch.id,
                                              'task_id': self.task.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(self.task.taskassignment_set.count(), 1)
        self.assertEqual(response['Location'],
                         reverse('task_assignment',
                                 kwargs={'task_id': self.task.id,
                                         'task_assignment_id':
                                         self.task.taskassignment_set.first().id}))

    def test_accept_unclaimed_task_as_anon(self):
        self.assertEqual(self.task.taskassignment_set.count(), 0)

        client = django.test.Client()
        response = client.get(reverse('accept_task',
                                      kwargs={'batch_id': self.batch.id,
                                              'task_id': self.task.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(self.task.taskassignment_set.count(), 1)
        self.assertEqual(response['Location'],
                         reverse('task_assignment',
                                 kwargs={'task_id': self.task.id,
                                         'task_assignment_id':
                                         self.task.taskassignment_set.first().id}))

    def test_accept_claimed_task(self):
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        other_user = User.objects.create_user('testuser', password='******')
        TaskAssignment(assigned_to=other_user, task=self.task).save()
        self.assertEqual(self.task.taskassignment_set.count(), 1)

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('accept_task',
                                      kwargs={'batch_id': self.batch.id,
                                              'task_id': self.task.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]),
                         'The Task with ID {} is no longer available'.format(self.task.id))
Exemple #16
0
    def setUp(self):
        """
        Sets up Project, Task objects, and saves them to the DB.
        The Project form HTML only displays the one input variable.
        The Task has inputs and answers and refers to the Project form.
        """
        project = Project(name='test', html_template="<p>${foo}</p>")
        project.save()
        batch = Batch(project=project)
        batch.save()

        task = Task(
            batch=batch,
            input_csv_fields={u'foo': u'bar'},
            completed=True,
        )
        task.save()
        self.task = task

        self.task_assignment = TaskAssignment(answers={
            u"comment": u"\u221e",
            u"userDisplayLanguage": u"",
            u"sentence_textbox_3_verb1": u"",
            u"city": u"",
            u"sentence_textbox_1_verb6": u"",
            u"sentence_textbox_1_verb7": u"",
            u"sentence_textbox_1_verb4": u"",
            u"sentence_textbox_1_verb5": u"",
            u"sentence_textbox_1_verb2": u"",
            u"sentence_textbox_1_verb3": u"",
            u"sentence_textbox_1_verb1": u"",
            u"sentence_textbox_2_verb4": u"",
            u"csrfmiddlewaretoken": u"7zxQ9Yyug6Nsnm4nLky9p8ObJwNipdu8",
            u"sentence_drop_2_verb3": u"foo",
            u"sentence_drop_2_verb2": u"foo",
            u"sentence_drop_2_verb1": u"foo",
            u"sentence_textbox_2_verb1": u"",
            u"sentence_textbox_2_verb3": u"",
            u"sentence_drop_2_verb4": u"foo",
            u"sentence_textbox_2_verb2": u"",
            u"submitit": u"Submit",
            u"browserInfo": u"",
            u"sentence_drop_1_verb1": u"foo",
            u"sentence_drop_1_verb2": u"foo",
            u"sentence_drop_1_verb3": u"foo",
            u"sentence_drop_1_verb4": u"foo",
            u"sentence_drop_1_verb5": u"foo",
            u"sentence_drop_1_verb6": u"foo",
            u"sentence_drop_1_verb7": u"foo",
            u"country": u"",
            u"sentence_drop_3_verb1": u"foo",
            u"ipAddress": u"",
            u"region": u""
        },
                                              assigned_to=None,
                                              completed=True,
                                              task=task)
        self.task_assignment.save()
Exemple #17
0
    def setUp(self):
        self.user = User.objects.create_user('testuser', password='******')

        project = Project()
        project.save()
        batch = Batch(project=project)
        batch.save()
        self.task = Task(batch=batch)
        self.task.save()
Exemple #18
0
    def setUp(self):
        project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>')
        project.save()

        batch = Batch(project=project, name='foo', filename='foo.csv')
        batch.save()

        self.task = Task(batch=batch)
        self.task.save()
Exemple #19
0
    def setUp(self):
        project = Project(name='foo', html_template='<p>${foo}: ${bar}</p>')
        project.save()

        batch = Batch(project=project, name='foo', filename='foo.csv')
        batch.save()

        self.task = Task(batch=batch)
        self.task.save()
Exemple #20
0
    def setUp(self):
        self.user = User.objects.create_user('testuser', password='******')

        self.project = Project()
        self.project.save()
        self.batch = Batch(project=self.project)
        self.batch.save()
        self.task = Task(batch=self.batch)
        self.task.save()
Exemple #21
0
 def setUp(self):
     self.project = Project(login_required=False)
     self.project.save()
     batch = Batch(project=self.project)
     batch.save()
     self.task = Task(input_csv_fields={}, batch=batch)
     self.task.save()
     self.task_assignment = TaskAssignment(task=self.task)
     self.task_assignment.save()
Exemple #22
0
 def setUp(self):
     User.objects.create_superuser('admin', '*****@*****.**', 'secret')
     project = Project(name='foo',
                       html_template='<p>${foo}: ${bar}</p><textarea>')
     project.save()
     self.batch = Batch(project=project,
                        name='MY_BATCH_NAME',
                        published=False)
     self.batch.save()
Exemple #23
0
    def test_available_tasks_for__aph_is_2(self):
        batch = Batch(assignments_per_task=2, project=self.project)
        batch.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)

        task = Task(batch=batch, )
        task.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 1)

        task_assignment = TaskAssignment(
            assigned_to=self.user,
            completed=False,
            task=task,
        )
        task_assignment.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)

        other_user = User.objects.create_user('other_user', password='******')
        self.assertEqual(batch.total_available_tasks_for(other_user), 1)

        task_assignment = TaskAssignment(
            assigned_to=other_user,
            completed=False,
            task=task,
        )
        task_assignment.save()
        self.assertEqual(batch.total_available_tasks_for(other_user), 0)
Exemple #24
0
    def test_available_tasks_for_anon_user(self):
        anon_user = AnonymousUser()
        user = User.objects.create_user('user', password='******')

        self.assertEqual(len(Batch.access_permitted_for(user)), 0)
        batch_protected = Batch.objects.create(
            active=True,
            login_required=True,
            project=self.project
        )
        self.assertEqual(len(Batch.access_permitted_for(anon_user)), 0)
        self.assertEqual(len(Batch.access_permitted_for(user)), 1)

        Task.objects.create(batch=batch_protected)
        self.assertEqual(len(batch_protected.available_tasks_for(anon_user)), 0)
        self.assertEqual(
            Batch.available_task_counts_for(self.batch_query, anon_user)[batch_protected.id], 0)
        self.assertEqual(len(batch_protected.available_tasks_for(user)), 1)
        self.assertEqual(
            Batch.available_task_counts_for(self.batch_query, user)[batch_protected.id], 1)

        batch_unprotected = Batch.objects.create(
            active=True,
            login_required=False,
            project=self.project
        )
        Task.objects.create(batch=batch_unprotected)
        self.assertEqual(len(Batch.access_permitted_for(anon_user)), 1)
        self.assertEqual(len(Batch.access_permitted_for(user)), 2)
        self.assertEqual(len(batch_unprotected.available_tasks_for(anon_user)), 1)
        self.assertEqual(
            Batch.available_task_counts_for(self.batch_query, anon_user)[batch_unprotected.id], 1)
        self.assertEqual(len(batch_unprotected.available_tasks_for(user)), 1)
        self.assertEqual(
            Batch.available_task_counts_for(self.batch_query, user)[batch_unprotected.id], 1)
Exemple #25
0
 def setUp(self):
     project = Project(login_required=False)
     project.save()
     self.batch = Batch(project=project)
     self.batch.save()
     self.task_one = Task(batch=self.batch)
     self.task_one.save()
     self.task_two = Task(batch=self.batch)
     self.task_two.save()
     self.task_three = Task(batch=self.batch)
     self.task_three.save()
Exemple #26
0
class TestCancelOrPublishBatch(django.test.TestCase):
    def setUp(self):
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>')
        project.save()
        self.batch = Batch(active=False, project=project, name='MY_BATCH_NAME')
        self.batch.save()

    def test_batch_cancel(self):
        batch_id = self.batch.id
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.post(reverse('turkle_admin:cancel_batch', kwargs={'batch_id': batch_id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 0)

    def test_batch_cancel_bad_batch_id(self):
        batch_id = 666
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.post(reverse('turkle_admin:cancel_batch', kwargs={'batch_id': batch_id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]), 'Cannot find Batch with ID 666')

    def test_batch_publish(self):
        batch_id = self.batch.id
        client = django.test.Client()
        self.assertFalse(self.batch.active)
        client.login(username='******', password='******')
        response = client.post(reverse('turkle_admin:publish_batch',
                                       kwargs={'batch_id': batch_id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 0)
        self.batch.refresh_from_db()
        self.assertTrue(self.batch.active)

    def test_batch_publish_bad_batch_id(self):
        batch_id = 666
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.post(reverse('turkle_admin:publish_batch',
                                       kwargs={'batch_id': batch_id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]), 'Cannot find Batch with ID 666')
Exemple #27
0
class TestCancelOrPublishBatch(django.test.TestCase):
    def setUp(self):
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        project = Project(name='foo', html_template='<p>${foo}: ${bar}</p>')
        project.save()
        self.batch = Batch(active=False, project=project, name='MY_BATCH_NAME')
        self.batch.save()

    def test_batch_cancel(self):
        batch_id = self.batch.id
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.post(reverse('turkle_admin:cancel_batch', kwargs={'batch_id': batch_id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 0)

    def test_batch_cancel_bad_batch_id(self):
        batch_id = 666
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.post(reverse('turkle_admin:cancel_batch', kwargs={'batch_id': batch_id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]), u'Cannot find Batch with ID 666')

    def test_batch_publish(self):
        batch_id = self.batch.id
        client = django.test.Client()
        self.assertFalse(self.batch.active)
        client.login(username='******', password='******')
        response = client.post(reverse('turkle_admin:publish_batch',
                                       kwargs={'batch_id': batch_id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 0)
        self.batch.refresh_from_db()
        self.assertTrue(self.batch.active)

    def test_batch_publish_bad_batch_id(self):
        batch_id = 666
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.post(reverse('turkle_admin:publish_batch',
                                       kwargs={'batch_id': batch_id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]), u'Cannot find Batch with ID 666')
Exemple #28
0
    def test_access_permitted_for_login_required(self):
        anonymous_user = AnonymousUser()

        self.assertEqual(len(Batch.access_permitted_for(anonymous_user)), 0)

        project = Project.objects.create()
        Batch.objects.create(login_required=True, project=project)
        self.assertEqual(len(Batch.access_permitted_for(anonymous_user)), 0)

        authenticated_user = User.objects.create_user('testuser', password='******')
        self.assertEqual(len(Batch.access_permitted_for(authenticated_user)), 1)
Exemple #29
0
    def test_batch_to_csv_variable_number_of_answers(self):
        project = Project(name='test', html_template='<p>${letter}</p><textarea>')
        project.save()
        batch = Batch(project=project)
        batch.save()

        task1 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'letter': 'a'},
        )
        task1.save()
        TaskAssignment(
            answers={'1': 1, '2': 2},
            assigned_to=None,
            completed=True,
            task=task1,
        ).save()

        task2 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'letter': 'b'},
        )
        task2.save()
        TaskAssignment(
            answers={'3': 3, '4': 4},
            assigned_to=None,
            completed=True,
            task=task2
        ).save()

        task3 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'letter': 'c'},
        )
        task3.save()
        TaskAssignment(
            answers={'3': 3, '2': 2},
            assigned_to=None,
            completed=True,
            task=task3
        ).save()

        csv_output = StringIO()
        batch.to_csv(csv_output)
        rows = csv_output.getvalue().split()
        self.assertTrue('"Input.letter","Answer.1","Answer.2","Answer.3","Answer.4"' in rows[0])
        self.assertTrue(any(['"a","1","2","",""' in row for row in rows[1:]]))
        self.assertTrue(any(['"b","","","3","4"' in row for row in rows[1:]]))
        self.assertTrue(any(['"c","","2","3",""' in row for row in rows[1:]]))
Exemple #30
0
 def setUp(self):
     self.user = User.objects.create_user('testuser', password='******')
     self.admin = User.objects.create_superuser('admin', '*****@*****.**', 'secret')
     self.project = Project(name="Test", login_required=False)
     self.project.created_by = self.admin
     self.project.updated_by = self.admin
     self.project.save()
     batch = Batch(project=self.project)
     batch.save()
     self.task = Task(input_csv_fields={}, batch=batch)
     self.task.save()
     self.task_assignment = TaskAssignment(task=self.task)
     self.task_assignment.save()
Exemple #31
0
 def setUp(self):
     project = Project(login_required=False, name='foo', html_template='<p></p><textarea>')
     project.save()
     batch = Batch(project=project)
     batch.save()
     self.task = Task(batch=batch, input_csv_fields='{}')
     self.task.save()
     self.task_assignment = TaskAssignment(
         assigned_to=None,
         completed=False,
         task=self.task
     )
     self.task_assignment.save()
Exemple #32
0
 def setUp(self):
     project = Project(login_required=False,
                       name='foo',
                       html_template='<p></p><textarea>')
     project.save()
     batch = Batch(project=project)
     batch.save()
     self.task = Task(batch=batch, input_csv_fields='{}')
     self.task.save()
     self.task_assignment = TaskAssignment(assigned_to=None,
                                           completed=False,
                                           task=self.task)
     self.task_assignment.save()
Exemple #33
0
    def test_available_tasks_for__aph_is_2(self):
        batch = Batch(
            assignments_per_task=2,
            project=self.project
        )
        batch.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)

        task = Task(
            batch=batch,
        )
        task.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 1)

        task_assignment = TaskAssignment(
            assigned_to=self.user,
            completed=False,
            task=task,
        )
        task_assignment.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)

        other_user = User.objects.create_user('other_user', password='******')
        self.assertEqual(batch.total_available_tasks_for(other_user), 1)

        task_assignment = TaskAssignment(
            assigned_to=other_user,
            completed=False,
            task=task,
        )
        task_assignment.save()
        self.assertEqual(batch.total_available_tasks_for(other_user), 0)
Exemple #34
0
 def setUp(self):
     self.user = User.objects.create_user('testuser', password='******')
     self.admin = User.objects.create_superuser('admin', '*****@*****.**',
                                                'secret')
     self.project = Project(name="Test", login_required=False)
     self.project.created_by = self.admin
     self.project.updated_by = self.admin
     self.project.save()
     batch = Batch(project=self.project)
     batch.save()
     self.task = Task(input_csv_fields={}, batch=batch)
     self.task.save()
     self.task_assignment = TaskAssignment(task=self.task)
     self.task_assignment.save()
Exemple #35
0
    def setUp(self):
        project = Project(login_required=False,
                          name='foo',
                          html_template='<p>${foo}: ${bar}</p>')
        project.save()

        self.batch = Batch(project=project, name='foo', filename='foo.csv')
        self.batch.save()

        self.task = Task(batch=self.batch,
                         input_csv_fields={
                             'foo': 'fufu',
                             'bar': 'baba'
                         })
        self.task.save()
Exemple #36
0
 def setUp(self):
     project = Project(login_required=False)
     project.save()
     self.batch = Batch(project=project)
     self.batch.save()
     self.task = Task(batch=self.batch)
     self.task.save()
Exemple #37
0
    def setUp(self):
        with open('turkle/tests/resources/form_0.html') as f:
            html_template = f.read()

        self.project = Project(name="filepath", html_template=html_template)
        self.project.save()
        self.batch = Batch(project=self.project)
        self.batch.save()
        field_names = "tweet0_id,tweet0_entity,tweet0_before_entity,tweet0_after_entity," + \
            "tweet0_word0,tweet0_word1,tweet0_word2,tweet1_id,tweet1_entity," + \
            "tweet1_before_entity,tweet1_after_entity,tweet1_word0,tweet1_word1,tweet1_word2," + \
            "tweet2_id,tweet2_entity,tweet2_before_entity,tweet2_after_entity,tweet2_word0," + \
            "tweet2_word1,tweet2_word2,tweet3_id,tweet3_entity,tweet3_before_entity," + \
            "tweet3_after_entity,tweet3_word0,tweet3_word1,tweet3_word2,tweet4_id," + \
            "tweet4_entity,tweet4_before_entity,tweet4_after_entity,tweet4_word0," + \
            "tweet4_word1,tweet4_word2,tweet5_id,tweet5_entity,tweet5_before_entity," + \
            "tweet5_after_entity,tweet5_word0,tweet5_word1,tweet5_word2",
        values = "268,SANTOS, Muy bien America ......... y lo siento mucho , un muy buen " + \
            "rival,mucho,&nbsp;,&nbsp;,2472,GREGORY, Ah bueno , tampoco andes pidiendo ese " +\
            "tipo de milagros . @jcabrerac @CarlosCabreraR,bueno,&nbsp;,&nbsp;,478,ALEJANDRO," + \
            " @aguillen19 &#44; un super abrazo mi querido , &#44; mis mejores deseos para " + \
            "este 2012 ... muakkk !,querido,&nbsp;,&nbsp;,906_control, PF, Acusan camioneros " + \
            "extorsiones de, : Transportistas acusaron que deben pagar entre 13 y 15 mil " + \
            "pesos a agentes que .. http://t.co/d8LUVvhP,acusaron,&nbsp;,&nbsp;,2793_control," + \
            " CHICARO, Me gusta cuando chicharo hace su oracion es lo que lo hace especial .," + \
            "&nbsp;,gusta,&nbsp;,&nbsp;,357,OSCAR WILDE&QUOT;, &quot; @ ifilosofia : Las " + \
            "pequeñas acciones de cada día son las que hacen o deshacen el carácter.&quot; , " + \
            "bueno !!!! Es así,bueno,&nbsp;,&nbsp;",
        self.task = Task(
            batch=self.batch,
            input_csv_fields=dict(zip(field_names, values))
        )
        self.task.save()
Exemple #38
0
 def test_login_required_validation_2(self):
     # No ValidationError thrown
     project = Project(login_required=True, )
     project.save()
     Batch(
         assignments_per_task=2,
         project=project,
     ).clean()
def index(request):
    """
    Security behavior:
    - Anyone can access the page, but the page only shows the user
      information they have access to.
    """
    abandoned_assignments = []
    if request.user.is_authenticated:
        for ha in TaskAssignment.objects.filter(
                assigned_to=request.user).filter(completed=False):
            abandoned_assignments.append({
                'task': ha.task,
                'task_assignment_id': ha.id
            })

    batch_list = Batch.access_permitted_for(request.user)
    batch_query = Batch.objects.filter(id__in=[b.id for b in batch_list])

    available_task_counts = Batch.available_task_counts_for(
        batch_query, request.user)

    batch_rows = []
    for batch in batch_query.values('created_at', 'id', 'name',
                                    'project__name'):
        total_tasks_available = available_task_counts[batch['id']]

        if total_tasks_available > 0:
            batch_rows.append({
                'project_name':
                batch['project__name'],
                'batch_name':
                batch['name'],
                'batch_published':
                batch['created_at'],
                'assignments_available':
                total_tasks_available,
                'preview_next_task_url':
                reverse('preview_next_task', kwargs={'batch_id': batch['id']}),
                'accept_next_task_url':
                reverse('accept_next_task', kwargs={'batch_id': batch['id']})
            })
    return render(request, 'index.html', {
        'abandoned_assignments': abandoned_assignments,
        'batch_rows': batch_rows
    })
Exemple #40
0
    def test_batches_available_for(self):
        user = User.objects.create_user('testuser', password='******')

        project = Project(active=True, )
        project.save()
        self.assertEqual(len(project.batches_available_for(user)), 0)

        Batch(
            active=False,
            project=project,
        ).save()
        self.assertEqual(len(project.batches_available_for(user)), 0)

        Batch(
            active=True,
            project=project,
        ).save()
        self.assertEqual(len(project.batches_available_for(user)), 1)
Exemple #41
0
 def test_login_required_validation_3(self):
     with self.assertRaisesMessage(ValidationError,
                                   'Assignments per Task must be 1'):
         project = Project(login_required=False, )
         project.save()
         Batch(
             assignments_per_task=2,
             project=project,
         ).clean()
Exemple #42
0
class TestDownloadBatchCSV(TestCase):
    def setUp(self):
        project = Project(name='foo',
                          html_template='<p>${foo}: ${bar}</p><textarea>')
        project.save()

        self.batch = Batch(project=project, name='foo', filename='foo.csv')
        self.batch.save()

        task = Task(batch=self.batch,
                    input_csv_fields={
                        'foo': 'fufu',
                        'bar': 'baba'
                    })
        task.save()
        TaskAssignment(answers={
            'a1': 'sauce'
        },
                       assigned_to=None,
                       completed=True,
                       task=task).save()

    def test_get_as_admin(self):
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')

        client = django.test.Client()
        client.login(username='******', password='******')
        download_url = reverse('turkle_admin:download_batch',
                               kwargs={'batch_id': self.batch.id})
        response = client.get(download_url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            response.get('Content-Disposition'),
            'attachment; filename="%s"' % self.batch.csv_results_filename())

    def test_get_as_rando(self):
        client = django.test.Client()
        client.login(username='******', password='******')
        download_url = reverse('turkle_admin:download_batch',
                               kwargs={'batch_id': self.batch.id})
        response = client.get(download_url)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'],
                         '/admin/login/?next=%s' % download_url)
Exemple #43
0
    def test_available_tasks_for__aph_is_1(self):
        batch = Batch(assignments_per_task=1, project=self.project)
        batch.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)
        self.assertEqual(batch.next_available_task_for(self.user), None)

        task = Task(batch=batch, )
        task.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 1)
        self.assertEqual(batch.next_available_task_for(self.user), task)

        task_assignment = TaskAssignment(
            assigned_to=self.user,
            completed=False,
            task=task,
        )
        task_assignment.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)
        self.assertEqual(batch.next_available_task_for(self.user), None)
Exemple #44
0
    def setUp(self):
        project = Project(name='foo', html_template='<p>${foo}: ${bar}</p>')
        project.save()

        self.batch = Batch(project=project, name='foo', filename='foo.csv')
        self.batch.save()

        task = Task(batch=self.batch,
                    input_csv_fields={
                        'foo': 'fufu',
                        'bar': 'baba'
                    })
        task.save()
        TaskAssignment(answers={
            'a1': 'sauce'
        },
                       assigned_to=None,
                       completed=True,
                       task=task).save()
Exemple #45
0
 def setUp(self):
     self.project = Project(html_template='<p>${foo}: ${bar}</p><textarea>',
                            login_required=False, name='foo')
     self.project.save()
     self.batch = Batch(filename='foo.csv', project=self.project, name='foo')
     self.batch.save()
     self.task = Task(
         batch=self.batch,
         input_csv_fields={'foo': 'fufu', 'bar': 'baba'},
     )
     self.task.save()
Exemple #46
0
 def setUp(self):
     project = Project(login_required=False)
     project.save()
     self.batch = Batch(project=project)
     self.batch.save()
     self.task_one = Task(batch=self.batch)
     self.task_one.save()
     self.task_two = Task(batch=self.batch)
     self.task_two.save()
     self.task_three = Task(batch=self.batch)
     self.task_three.save()
Exemple #47
0
    def test_expire_all_abandoned__dont_delete_completed(self):
        t = timezone.now()
        dt = datetime.timedelta(hours=2)
        past = t - dt

        project = Project(login_required=False)
        project.save()
        batch = Batch(allotted_assignment_time=1, project=project)
        batch.save()
        task = Task(batch=batch)
        task.save()
        ha = TaskAssignment(
            completed=True,
            expires_at=past,
            task=task,
        )
        # Bypass TaskAssignment's save(), which updates expires_at
        super(TaskAssignment, ha).save()
        self.assertEqual(TaskAssignment.objects.count(), 1)
        TaskAssignment.expire_all_abandoned()
        self.assertEqual(TaskAssignment.objects.count(), 1)
Exemple #48
0
    def test_batch_to_csv_variable_number_of_answers(self):
        project = Project(name='test',
                          html_template='<p>${letter}</p><textarea>')
        project.save()
        batch = Batch(project=project)
        batch.save()

        task1 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'letter': 'a'},
        )
        task1.save()
        TaskAssignment(
            answers={
                '1': 1,
                '2': 2
            },
            assigned_to=None,
            completed=True,
            task=task1,
        ).save()

        task2 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'letter': 'b'},
        )
        task2.save()
        TaskAssignment(answers={
            '3': 3,
            '4': 4
        },
                       assigned_to=None,
                       completed=True,
                       task=task2).save()

        task3 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'letter': 'c'},
        )
        task3.save()
        TaskAssignment(answers={
            '3': 3,
            '2': 2
        },
                       assigned_to=None,
                       completed=True,
                       task=task3).save()

        csv_output = StringIO()
        batch.to_csv(csv_output)
        rows = csv_output.getvalue().split()
        self.assertTrue(
            '"Input.letter","Answer.1","Answer.2","Answer.3","Answer.4"' in
            rows[0])
        self.assertTrue(any(['"a","1","2","",""' in row for row in rows[1:]]))
        self.assertTrue(any(['"b","","","3","4"' in row for row in rows[1:]]))
        self.assertTrue(any(['"c","","2","3",""' in row for row in rows[1:]]))
Exemple #49
0
class TestDownloadBatchCSV(TestCase):
    def setUp(self):
        project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>')
        project.save()

        self.batch = Batch(project=project, name='foo', filename='foo.csv')
        self.batch.save()

        task = Task(
            batch=self.batch,
            input_csv_fields={'foo': 'fufu', 'bar': 'baba'}
        )
        task.save()
        TaskAssignment(
            answers={'a1': 'sauce'},
            assigned_to=None,
            completed=True,
            task=task
        ).save()

    def test_get_as_admin(self):
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')

        client = django.test.Client()
        client.login(username='******', password='******')
        download_url = reverse('turkle_admin:download_batch', kwargs={'batch_id': self.batch.id})
        response = client.get(download_url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get('Content-Disposition'),
                         'attachment; filename="%s"' % self.batch.csv_results_filename())

    def test_get_as_rando(self):
        client = django.test.Client()
        client.login(username='******', password='******')
        download_url = reverse('turkle_admin:download_batch', kwargs={'batch_id': self.batch.id})
        response = client.get(download_url)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], '/admin/login/?next=%s' % download_url)
Exemple #50
0
 def test_map_fields_csv_row(self):
     project = Project(
         name='test',
         html_template="""</select> con relaci&oacute;n a """ +
         """<span style="color: rgb(0, 0, 255);">""" +
         """${tweet0_entity}</span> en este mensaje.</p><textarea>"""
     )
     project.save()
     batch = Batch(project=project)
     batch.save()
     task = Task(
         batch=batch,
         input_csv_fields=dict(
             zip(
                 ["tweet0_id", "tweet0_entity"],
                 ["268", "SANTOS"],
             )
         ),
     )
     task.save()
     expect = """</select> con relaci&oacute;n a <span style="color:""" + \
         """ rgb(0, 0, 255);">SANTOS</span> en este mensaje.</p><textarea>"""
     actual = task.populate_html_template()
     self.assertEqual(expect, actual)
Exemple #51
0
    def test_expire_all_abandoned(self):
        t = timezone.now()
        dt = datetime.timedelta(hours=2)
        past = t - dt

        project = Project(login_required=False)
        project.save()
        batch = Batch(
            allotted_assignment_time=1,
            project=project
        )
        batch.save()
        task = Task(batch=batch)
        task.save()
        ha = TaskAssignment(
            completed=False,
            expires_at=past,
            task=task,
        )
        # Bypass TaskAssignment's save(), which updates expires_at
        super(TaskAssignment, ha).save()
        self.assertEqual(TaskAssignment.objects.count(), 1)
        TaskAssignment.expire_all_abandoned()
        self.assertEqual(TaskAssignment.objects.count(), 0)
Exemple #52
0
    def setUp(self):
        project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>')
        project.save()

        self.batch = Batch(project=project, name='foo', filename='foo.csv')
        self.batch.save()

        task = Task(
            batch=self.batch,
            input_csv_fields={'foo': 'fufu', 'bar': 'baba'}
        )
        task.save()
        TaskAssignment(
            answers={'a1': 'sauce'},
            assigned_to=None,
            completed=True,
            task=task
        ).save()
Exemple #53
0
    def test_available_tasks_for__aph_is_1(self):
        batch = Batch(
            assignments_per_task=1,
            project=self.project
        )
        batch.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)
        self.assertEqual(batch.next_available_task_for(self.user), None)

        task = Task(
            batch=batch,
        )
        task.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 1)
        self.assertEqual(batch.next_available_task_for(self.user), task)

        task_assignment = TaskAssignment(
            assigned_to=self.user,
            completed=False,
            task=task,
        )
        task_assignment.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)
        self.assertEqual(batch.next_available_task_for(self.user), None)
Exemple #54
0
    def test_batch_from_emoji_csv(self):
        template = '<p>${emoji} - ${more_emoji}</p><textarea>'
        project = Project(name='test', html_template=template)
        project.save()
        batch = Batch(project=project)
        batch.save()

        csv_fh = open(os.path.abspath('turkle/tests/resources/emoji.csv'), 'r')
        batch.create_tasks_from_csv(csv_fh)

        self.assertEqual(batch.total_tasks(), 3)
        tasks = batch.task_set.all()
        self.assertEqual(tasks[0].input_csv_fields['emoji'], '😀')
        self.assertEqual(tasks[0].input_csv_fields['more_emoji'], '😃')
        self.assertEqual(tasks[2].input_csv_fields['emoji'], '🤔')
        self.assertEqual(tasks[2].input_csv_fields['more_emoji'], '🤭')
Exemple #55
0
    def test_project_to_csv_different_answers_per_batch(self):
        project = Project(name='test', html_template='<p>${letter}</p><textarea>')
        project.save()
        batch_one = Batch(project=project)
        batch_one.save()

        task1 = Task(
            batch=batch_one,
            completed=True,
            input_csv_fields={'letter': 'a'},
        )
        task1.save()
        TaskAssignment(
            answers={'1': 1, '2': 2},
            assigned_to=None,
            completed=True,
            task=task1
        ).save()

        batch_two = Batch(project=project)
        batch_two.save()
        task2 = Task(
            batch=batch_two,
            completed=True,
            input_csv_fields={'letter': 'b'},
        )
        task2.save()
        TaskAssignment(
            answers={'3': 3, '4': 4},
            assigned_to=None,
            completed=True,
            task=task2
        ).save()

        csv_output = StringIO()
        project.to_csv(csv_output)

        rows = csv_output.getvalue().split('\r\n')
        self.assertTrue(
            '"Input.letter","Answer.1","Answer.2","Answer.3","Answer.4"' in rows[0])
        self.assertTrue('"a","1","2","",""' in rows[1])
        self.assertTrue('"b","","","3","4"' in rows[2])
Exemple #56
0
    def test_project_to_csv(self):
        project = Project(name='test', html_template='<p>${number} - ${letter}</p><textarea>')
        project.save()
        batch_one = Batch(project=project)
        batch_one.save()

        task1 = Task(
            batch=batch_one,
            completed=True,
            input_csv_fields={'number': '1', 'letter': 'a'},
        )
        task1.save()
        TaskAssignment(
            answers={'combined': '1a'},
            assigned_to=None,
            completed=True,
            task=task1
        ).save()

        batch_two = Batch(project=project)
        batch_two.save()
        task2 = Task(
            batch=batch_two,
            completed=True,
            input_csv_fields={'number': '2', 'letter': 'b'}
        )
        task2.save()
        TaskAssignment(
            answers={'combined': '2b'},
            assigned_to=None,
            completed=True,
            task=task2
        ).save()

        csv_output = StringIO()
        project.to_csv(csv_output)

        rows = csv_output.getvalue().split('\r\n')
        self.assertTrue(
            '"Input.letter","Input.number","Answer.combined"' in rows[0])
        self.assertTrue(any(['"a","1","1a"' in row for row in rows[1:]]))
        self.assertTrue(any(['"b","2","2b"' in row for row in rows[1:]]))
Exemple #57
0
class TestAcceptNextTask(TestCase):
    def setUp(self):
        project = Project(login_required=False, name='foo',
                          html_template='<p>${foo}: ${bar}</p><textarea>')
        project.save()

        self.batch = Batch(project=project, name='foo', filename='foo.csv')
        self.batch.save()

        self.task = Task(
            batch=self.batch,
            input_csv_fields={'foo': 'fufu', 'bar': 'baba'}
        )
        self.task.save()

    def test_accept_next_task(self):
        user = User.objects.create_user('testuser', password='******')
        self.assertEqual(self.task.taskassignment_set.count(), 0)

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        # We are redirected to the task_assignment view, but we can't predict the
        # full task_assignment URL
        self.assertTrue('{}/assignment/'.format(self.task.id) in response['Location'])
        self.assertEqual(self.task.taskassignment_set.count(), 1)
        self.assertEqual(self.task.taskassignment_set.first().assigned_to, user)

    def test_accept_next_task_as_anon(self):
        client = django.test.Client()
        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        # We are redirected to the task_assignment view, but we can't predict the
        # full task_assignment URL
        self.assertTrue('{}/assignment/'.format(self.task.id) in response['Location'])

    def test_accept_next_task__bad_batch_id(self):
        User.objects.create_user('testuser', password='******')
        self.assertEqual(self.task.taskassignment_set.count(), 0)

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': 666}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))
        self.assertEqual(self.task.taskassignment_set.count(), 0)
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]),
                         'Cannot find Task Batch with ID {}'.format(666))

    def test_accept_next_task__no_more_tasks(self):
        User.objects.create_user('testuser', password='******')
        task_assignment = TaskAssignment(completed=True, task=self.task)
        task_assignment.save()
        self.assertEqual(self.task.taskassignment_set.count(), 1)

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))
        self.assertEqual(self.task.taskassignment_set.count(), 1)
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]),
                         'No more Tasks available for Batch {}'.format(self.batch.name))

    def test_accept_next_task__respect_skip(self):
        task_two = Task(batch=self.batch)
        task_two.save()

        User.objects.create_user('testuser', password='******')
        client = django.test.Client()
        client.login(username='******', password='******')

        # Per the Django docs:
        #   To modify the session and then save it, it must be stored in a variable first
        #   (because a new SessionStore is created every time this property is accessed
        #     https://docs.djangoproject.com/en/1.11/topics/testing/tools/#persistent-state
        s = client.session
        s.update({
            'skipped_tasks_in_batch': {str(self.batch.id): [str(self.task.id)]}
        })
        s.save()

        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertTrue('{}/assignment/'.format(task_two.id) in response['Location'])
Exemple #58
0
 def setUp(self):
     User.objects.create_superuser('admin', '*****@*****.**', 'secret')
     project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>')
     project.save()
     self.batch = Batch(active=False, project=project, name='MY_BATCH_NAME')
     self.batch.save()
Exemple #59
0
class TestSkipTask(TestCase):
    def setUp(self):
        project = Project(login_required=False)
        project.save()
        self.batch = Batch(project=project)
        self.batch.save()
        self.task_one = Task(batch=self.batch)
        self.task_one.save()
        self.task_two = Task(batch=self.batch)
        self.task_two.save()
        self.task_three = Task(batch=self.batch)
        self.task_three.save()

    def test_preview_next_task_order(self):
        client = django.test.Client()

        response = client.get(reverse('preview_next_task', kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview',
                                                       kwargs={'task_id': self.task_one.id}))

        # Since no Tasks have been completed or skipped, preview_next_task redirects to same Task
        response = client.get(reverse('preview_next_task', kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview',
                                                       kwargs={'task_id': self.task_one.id}))

    def test_skip_task(self):
        client = django.test.Client()

        # Skip task_one
        response = client.post(reverse('skip_task', kwargs={'batch_id': self.batch.id,
                                                            'task_id': self.task_one.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview_next_task',
                                                       kwargs={'batch_id': self.batch.id}))

        # Verify that task_one has been skipped
        response = client.get(reverse('preview_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview',
                                                       kwargs={'task_id': self.task_two.id}))

        # Skip task_two
        response = client.post(reverse('skip_task', kwargs={'batch_id': self.batch.id,
                                                            'task_id': self.task_two.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview_next_task',
                                                       kwargs={'batch_id': self.batch.id}))

        # Verify that task_two has been skipped
        response = client.get(reverse('preview_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview',
                                                       kwargs={'task_id': self.task_three.id}))

        # Skip task_three
        response = client.post(reverse('skip_task', kwargs={'batch_id': self.batch.id,
                                                            'task_id': self.task_three.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview_next_task',
                                                       kwargs={'batch_id': self.batch.id}))

        # Verify that, with all existing Tasks skipped, we have been redirected back to
        # task_one and that info message is displayed about only skipped Tasks remaining
        response = client.get(reverse('preview_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview',
                                                       kwargs={'task_id': self.task_one.id}))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]), 'Only previously skipped Tasks are available')

    def test_skip_and_accept_next_task(self):
        client = django.test.Client()

        ha_one = TaskAssignment(task=self.task_one)
        ha_one.save()

        # Skip task_one
        response = client.post(reverse('skip_and_accept_next_task',
                                       kwargs={'batch_id': self.batch.id,
                                               'task_id': self.task_one.id,
                                               'task_assignment_id': ha_one.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('accept_next_task',
                                                       kwargs={'batch_id': self.batch.id}))

        # Verify that task_one has been skipped
        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertTrue('{}/assignment/'.format(self.task_two.id) in response['Location'])

        # Skip task_two
        ha_two = self.task_two.taskassignment_set.first()
        response = client.post(reverse('skip_and_accept_next_task',
                                       kwargs={'batch_id': self.batch.id,
                                               'task_id': self.task_two.id,
                                               'task_assignment_id': ha_two.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('accept_next_task',
                                                       kwargs={'batch_id': self.batch.id}))

        # Verify that task_two has been skipped
        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertTrue('{}/assignment/'.format(self.task_three.id) in response['Location'])

        # Skip task_three
        ha_three = self.task_three.taskassignment_set.first()
        response = client.post(reverse('skip_and_accept_next_task',
                                       kwargs={'batch_id': self.batch.id,
                                               'task_id': self.task_three.id,
                                               'task_assignment_id': ha_three.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('accept_next_task',
                                                       kwargs={'batch_id': self.batch.id}))

        # Verify that, with all existing Tasks skipped, we have been redirected back to
        # task_one and that info message is displayed about only skipped Tasks remaining
        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertTrue('{}/assignment/'.format(self.task_one.id) in response['Location'])
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]), 'Only previously skipped Tasks are available')

        # Skip task_one for a second time
        ha_one = self.task_one.taskassignment_set.first()
        response = client.post(reverse('skip_and_accept_next_task',
                                       kwargs={'batch_id': self.batch.id,
                                               'task_id': self.task_one.id,
                                               'task_assignment_id': ha_one.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('accept_next_task',
                                                       kwargs={'batch_id': self.batch.id}))

        # Verify that task_one has been skipped for a second time
        response = client.get(reverse('accept_next_task',
                                      kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertTrue('{}/assignment/'.format(self.task_two.id) in response['Location'])
Exemple #60
0
class TestPreview(TestCase):
    def setUp(self):
        self.project = Project(html_template='<p>${foo}: ${bar}</p><textarea>',
                               login_required=False, name='foo')
        self.project.save()
        self.batch = Batch(filename='foo.csv', project=self.project, name='foo')
        self.batch.save()
        self.task = Task(
            batch=self.batch,
            input_csv_fields={'foo': 'fufu', 'bar': 'baba'},
        )
        self.task.save()

    def test_get_preview(self):
        client = django.test.Client()
        response = client.get(reverse('preview', kwargs={'task_id': self.task.id}))
        self.assertEqual(response.status_code, 200)

    def test_get_preview_as_anonymous_but_login_required(self):
        self.project.login_required = True
        self.project.save()

        client = django.test.Client()
        response = client.get(reverse('preview', kwargs={'task_id': self.task.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]), 'You do not have permission to view this Task')

    def test_get_preview_bad_task_id(self):
        client = django.test.Client()
        response = client.get(reverse('preview', kwargs={'task_id': 666}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]),
                         'Cannot find Task with ID {}'.format(666))

    def test_get_preview_iframe(self):
        client = django.test.Client()
        response = client.get(reverse('preview_iframe', kwargs={'task_id': self.task.id}))
        self.assertEqual(response.status_code, 200)

    def test_get_preview_iframe_bad_task_id(self):
        client = django.test.Client()
        response = client.get(reverse('preview_iframe', kwargs={'task_id': 666}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]),
                         'Cannot find Task with ID {}'.format(666))

    def test_get_preview_iframe_as_anonymous_but_login_required(self):
        self.project.login_required = True
        self.project.save()

        client = django.test.Client()

        response = client.get(reverse('preview_iframe', kwargs={'task_id': self.task.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]), 'You do not have permission to view this Task')

    def test_preview_next_task(self):
        client = django.test.Client()
        response = client.get(reverse('preview_next_task', kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('preview',
                                                       kwargs={'task_id': self.task.id}))

    def test_preview_next_task_no_more_tasks(self):
        self.task.completed = True
        self.task.save()
        client = django.test.Client()
        response = client.get(reverse('preview_next_task', kwargs={'batch_id': self.batch.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertTrue('No more Tasks are available for Batch' in str(messages[0]))