From 7fe283799812e4ad32f182d8704064644dca3a11 Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Fri, 19 Aug 2022 10:18:01 -0400 Subject: [PATCH 01/10] Fix for assigned users empty. --- pybossa/view/projects.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pybossa/view/projects.py b/pybossa/view/projects.py index f344dd2338..d4755a1764 100644 --- a/pybossa/view/projects.py +++ b/pybossa/view/projects.py @@ -1873,7 +1873,11 @@ def bulk_update_assign_worker(short_name): if remove_user_email in assign_user: assign_user.remove(remove_user_email) - user_pref["assign_user"] = assign_user + if assign_user: + user_pref["assign_user"] = assign_user + elif "assign_user" in user_pref: + print('Deleted user_pref["assign_user"]') + del user_pref["assign_user"] t.user_pref = user_pref flag_modified(t, "user_pref") From cc29a39ddf83997cc60e3ba9d1de09f7851794a9 Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Fri, 19 Aug 2022 10:20:15 -0400 Subject: [PATCH 02/10] cleanup --- pybossa/view/projects.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pybossa/view/projects.py b/pybossa/view/projects.py index d4755a1764..f904ac82a9 100644 --- a/pybossa/view/projects.py +++ b/pybossa/view/projects.py @@ -1876,7 +1876,6 @@ def bulk_update_assign_worker(short_name): if assign_user: user_pref["assign_user"] = assign_user elif "assign_user" in user_pref: - print('Deleted user_pref["assign_user"]') del user_pref["assign_user"] t.user_pref = user_pref From 639ff276a752aeb66555519f8ebcdaddc446a303 Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Mon, 22 Aug 2022 11:51:58 -0400 Subject: [PATCH 03/10] Unit tests. --- pybossa/view/projects.py | 4 + test/test_view/test_assign_task_worker.py | 95 +++++++++++++++++++++-- 2 files changed, 92 insertions(+), 7 deletions(-) diff --git a/pybossa/view/projects.py b/pybossa/view/projects.py index f904ac82a9..e2090e7b8c 100644 --- a/pybossa/view/projects.py +++ b/pybossa/view/projects.py @@ -1844,6 +1844,7 @@ def bulk_update_assign_worker(short_name): # update tasks with assign worker values assign_workers = data.get('add', []) remove_workers = data.get('remove', []) + assign_users = [] assign_worker_emails = [w["email"] for w in assign_workers] remove_worker_emails = [w["email"] for w in remove_workers] @@ -1875,6 +1876,7 @@ def bulk_update_assign_worker(short_name): if assign_user: user_pref["assign_user"] = assign_user + assign_users.append({'taskId': int(task_id), 'assign_user': assign_user}) elif "assign_user" in user_pref: del user_pref["assign_user"] @@ -1882,6 +1884,8 @@ def bulk_update_assign_worker(short_name): flag_modified(t, "user_pref") task_repo.update(t) + response['assign_users'] = assign_users + return Response(json.dumps(response), 200, mimetype='application/json') @crossdomain(origin='*', headers=cors_headers) diff --git a/test/test_view/test_assign_task_worker.py b/test/test_view/test_assign_task_worker.py index 296f88e5de..3a63a85e70 100644 --- a/test/test_view/test_assign_task_worker.py +++ b/test/test_view/test_assign_task_worker.py @@ -5,6 +5,8 @@ from test import with_context from test.factories import ProjectFactory, TaskFactory, UserFactory from test.helper import web +from test.helper.gig_helper import make_subadmin_by +from unittest.mock import patch class TestAssignTaskWorker(web.Helper): @@ -103,24 +105,103 @@ def test_bulk_priority_update(self): assert task1.priority_0 == .5, task1.priority_0 + @with_context + def test_update_assign_workers_by_task_id(self): + """Test update assign worker.""" + admin = UserFactory.create(admin=True) + admin.set_password('1234') + user_repo.save(admin) + + csrf = self.get_csrf('/account/signin') + self.signin(email=admin.email_addr, csrf=csrf) + + project = ProjectFactory.create(published=True) + user = UserFactory.create(email_addr='a@a.com', fullname="test_user") + + task1 = TaskFactory.create(project=project) + task_repo.update(task1) + + # Assign user to task by task id. + req_data = dict(taskId=str(task1.id), add=[{'email':user.email_addr}]) + + url = '/project/%s/tasks/assign-workersupdate?api_key=%s' % (project.short_name, project.owner.api_key) + res = self.app.post(url, content_type='application/json', data=json.dumps(req_data), follow_redirects=True, headers={'X-CSRFToken': csrf}) + res_data = json.loads(res.data) + + # Verify the user has been assigned to this task. + assert res_data['assign_users'][0]['taskId'] == task1.id + assert res_data['assign_users'][0]['assign_user'][0] == user.email_addr + + task1_modified = task_repo.get_task(task1.id) + assert user.email_addr in task1_modified.user_pref.get('assign_user') @with_context - def test_update_assign_workers(self): + def test_update_assign_workers_by_filter(self): """Test update assign worker.""" + admin = UserFactory.create(admin=True) + admin.set_password('1234') + user_repo.save(admin) + + csrf = self.get_csrf('/account/signin') + self.signin(email=admin.email_addr, csrf=csrf) + + project = ProjectFactory.create(published=True) + user = UserFactory.create(email_addr='a@a.com', fullname="test_user") + + task1 = TaskFactory.create(project=project) + task_repo.update(task1) + + # Assign user to task by filter. + req_data = dict(filters='{"task_id": "' + str(task1.id) + '"}', add=[{'email':user.email_addr}]) + + url = '/project/%s/tasks/assign-workersupdate?api_key=%s' % (project.short_name, project.owner.api_key) + res = self.app.post(url, content_type='application/json', data=json.dumps(req_data), follow_redirects=True, headers={'X-CSRFToken': csrf}) + res_data = json.loads(res.data) + + # Verify the user has been assigned to this task. + assert res_data['assign_users'][0]['taskId'] == task1.id + assert res_data['assign_users'][0]['assign_user'][0] == user.email_addr + + task1_modified = task_repo.get_task(task1.id) + assert user.email_addr in task1_modified.user_pref.get('assign_user') + + @with_context + def test_update_assign_workers_remove(self): + """Test update unassign worker.""" + admin = UserFactory.create(admin=True) + admin.set_password('1234') + user_repo.save(admin) + + csrf = self.get_csrf('/account/signin') + self.signin(email=admin.email_addr, csrf=csrf) + project = ProjectFactory.create(published=True) user = UserFactory.create(email_addr='a@a.com', fullname="test_user") task1_user_pref = dict(assign_user=[user.email_addr]) + # Create a task with an assigned user. task1 = TaskFactory.create(project=project, user_pref=task1_user_pref) task_repo.update(task1) - req_data = dict(taskIds=str(task1.id), add=user) + # Verify the user has been assigned to the task. + assert user.email_addr in task1.user_pref.get('assign_user') + + # Load the task and verify the user has been assigned to the task. + task1_modified1 = task_repo.get_task(task1.id) + assert user.email_addr in task1_modified1.user_pref.get('assign_user') + + # Remove the user. + req_data = dict(taskId=str(task1.id), remove=[{'email':user.email_addr}]) url = '/project/%s/tasks/assign-workersupdate?api_key=%s' % (project.short_name, project.owner.api_key) - req_data = dict(taskId=None) - res = self.app.post(url, content_type='application/json', - data=json.dumps(req_data)) + res = self.app.post(url, content_type='application/json', data=json.dumps(req_data), follow_redirects=True, headers={'X-CSRFToken': csrf}) res_data = json.loads(res.data) - assert res_data['assign_users'][0]['fullname'] == user.fullname - assert res_data['assign_users'][0]['email'] == user.email_addr + + import pdb + pdb.set_trace() + assert not res_data['assign_users'] + + # Verify the assign_user parameter has been deleted from the user_pref. + task1_modified2 = task_repo.get_task(task1.id) + assert not task1_modified2.user_pref.get('assign_user') From 8e35d211255e4189baadf94f35adeaa37bc7c187 Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Mon, 22 Aug 2022 11:52:25 -0400 Subject: [PATCH 04/10] fix --- test/test_view/test_assign_task_worker.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/test_view/test_assign_task_worker.py b/test/test_view/test_assign_task_worker.py index 3a63a85e70..fbd43480da 100644 --- a/test/test_view/test_assign_task_worker.py +++ b/test/test_view/test_assign_task_worker.py @@ -198,8 +198,6 @@ def test_update_assign_workers_remove(self): res = self.app.post(url, content_type='application/json', data=json.dumps(req_data), follow_redirects=True, headers={'X-CSRFToken': csrf}) res_data = json.loads(res.data) - import pdb - pdb.set_trace() assert not res_data['assign_users'] # Verify the assign_user parameter has been deleted from the user_pref. From f27a34b8ebfaef6ac04821f3c3fd07f27c059202 Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Mon, 22 Aug 2022 11:53:46 -0400 Subject: [PATCH 05/10] cleanup --- test/test_view/test_assign_task_worker.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_view/test_assign_task_worker.py b/test/test_view/test_assign_task_worker.py index fbd43480da..305d59cebd 100644 --- a/test/test_view/test_assign_task_worker.py +++ b/test/test_view/test_assign_task_worker.py @@ -5,7 +5,6 @@ from test import with_context from test.factories import ProjectFactory, TaskFactory, UserFactory from test.helper import web -from test.helper.gig_helper import make_subadmin_by from unittest.mock import patch From 931d703de937ee446446500a8d7cc529f419974b Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Mon, 22 Aug 2022 11:54:24 -0400 Subject: [PATCH 06/10] cleanup --- test/test_view/test_assign_task_worker.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_view/test_assign_task_worker.py b/test/test_view/test_assign_task_worker.py index 305d59cebd..aad1f57d1c 100644 --- a/test/test_view/test_assign_task_worker.py +++ b/test/test_view/test_assign_task_worker.py @@ -5,7 +5,6 @@ from test import with_context from test.factories import ProjectFactory, TaskFactory, UserFactory from test.helper import web -from unittest.mock import patch class TestAssignTaskWorker(web.Helper): From 5f1bc8049fc0c85a0003f6f301b92963623ac661 Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Mon, 22 Aug 2022 15:51:34 -0400 Subject: [PATCH 07/10] Fix assign workers bulk. --- pybossa/view/projects.py | 4 +-- test/test_view/test_assign_task_worker.py | 37 +++++++++++++++++++++-- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/pybossa/view/projects.py b/pybossa/view/projects.py index e2090e7b8c..87c3416a9a 100644 --- a/pybossa/view/projects.py +++ b/pybossa/view/projects.py @@ -1784,7 +1784,6 @@ def bulk_priority_update(short_name): @blueprint.route('//tasks/assign-workersupdate', methods=['POST']) @login_required def bulk_update_assign_worker(short_name): - response = {} project, owner, ps = project_by_shortname(short_name) admin_or_project_owner(current_user, project) @@ -1792,7 +1791,6 @@ def bulk_update_assign_worker(short_name): if data.get("add") is None and data.get("remove") is None: # read data and return users - task_id = data.get("taskId") bulk_update = False assign_user_emails = [] @@ -1813,6 +1811,7 @@ def bulk_update_assign_worker(short_name): for task_id in task_ids: t = task_repo.get_task_by(project_id=project.id, id=int(task_id)) + t.user_pref = t.user_pref or {} assign_user_emails = assign_user_emails.union(set(t.user_pref.get("assign_user", []))) assign_users = [] for user_email in assign_user_emails: @@ -1831,7 +1830,6 @@ def bulk_update_assign_worker(short_name): all_users = user_repo.get_all() all_user_data = [] for user in all_users: - # Exclude currently assigned users in the candidate list ONLY for single task update if user.email_addr in assign_user_emails and not bulk_update: continue diff --git a/test/test_view/test_assign_task_worker.py b/test/test_view/test_assign_task_worker.py index aad1f57d1c..a87254dd6e 100644 --- a/test/test_view/test_assign_task_worker.py +++ b/test/test_view/test_assign_task_worker.py @@ -103,9 +103,40 @@ def test_bulk_priority_update(self): assert task1.priority_0 == .5, task1.priority_0 + @with_context + def test_get_assign_workers_by_bulk(self): + """Test get assign worker by bulk.""" + admin = UserFactory.create(admin=True) + admin.set_password('1234') + user_repo.save(admin) + + csrf = self.get_csrf('/account/signin') + self.signin(email=admin.email_addr, csrf=csrf) + + # Create a project with a worker assigned. + user1 = UserFactory.create(email_addr='a1@a.com', fullname="test_user1") + user2 = UserFactory.create(email_addr='a2@a.com', fullname="test_user2") + project = ProjectFactory.create(published=True, info={'project_users': [user1.id, user2.id]}) + + task1 = TaskFactory.create(project=project) + task_repo.update(task1) + task2 = TaskFactory.create(project=project) + task_repo.update(task2) + + # Assign user to all tasks by filter. + req_data = dict(filters='{"add":[{"fullname":"' + user1.fullname + '","email":"' + user1.email_addr + '"}],"remove":[]}') + + url = '/project/%s/tasks/assign-workersupdate?api_key=%s' % (project.short_name, project.owner.api_key) + res = self.app.post(url, content_type='application/json', data=json.dumps(req_data), follow_redirects=True, headers={'X-CSRFToken': csrf}) + res_data = json.loads(res.data) + + # Verify all users are returned. + assert res_data['all_users'][0]['email'] == user1.email_addr + assert res_data['all_users'][1]['email'] == user2.email_addr + @with_context def test_update_assign_workers_by_task_id(self): - """Test update assign worker.""" + """Test update assign worker by task id.""" admin = UserFactory.create(admin=True) admin.set_password('1234') user_repo.save(admin) @@ -135,7 +166,7 @@ def test_update_assign_workers_by_task_id(self): @with_context def test_update_assign_workers_by_filter(self): - """Test update assign worker.""" + """Test update assign worker by filter.""" admin = UserFactory.create(admin=True) admin.set_password('1234') user_repo.save(admin) @@ -165,7 +196,7 @@ def test_update_assign_workers_by_filter(self): @with_context def test_update_assign_workers_remove(self): - """Test update unassign worker.""" + """Test remove assigned worker.""" admin = UserFactory.create(admin=True) admin.set_password('1234') user_repo.save(admin) From a77b9b0b7bc7c6e9f32d4cfb8ce1538a406f68f8 Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Mon, 22 Aug 2022 16:23:18 -0400 Subject: [PATCH 08/10] fix --- test/test_view/test_assign_task_worker.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/test_view/test_assign_task_worker.py b/test/test_view/test_assign_task_worker.py index a87254dd6e..2de493c3bb 100644 --- a/test/test_view/test_assign_task_worker.py +++ b/test/test_view/test_assign_task_worker.py @@ -131,8 +131,9 @@ def test_get_assign_workers_by_bulk(self): res_data = json.loads(res.data) # Verify all users are returned. - assert res_data['all_users'][0]['email'] == user1.email_addr - assert res_data['all_users'][1]['email'] == user2.email_addr + assert res_data['all_users'][0]['email'] in [user1.email_addr, user2.email_addr] + assert res_data['all_users'][1]['email'] in [user1.email_addr, user2.email_addr] + assert res_data['all_users'][0]['email'] != res_data['all_users'][1]['email'] @with_context def test_update_assign_workers_by_task_id(self): From ca3ac85c81bd34034a5d99a91f5719453c335c9e Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Tue, 23 Aug 2022 10:18:44 -0400 Subject: [PATCH 09/10] touch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b19bb10c8a..7b8c9a024e 100644 --- a/README.md +++ b/README.md @@ -117,4 +117,4 @@ The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. -Documentation and media is under a Creative Commons Attribution License version 3. +Documentation and media is under a Creative Commons Attribution License version 3. \ No newline at end of file From 935c6e2cb7ab617b4b7cca2234da2fc03934ff6d Mon Sep 17 00:00:00 2001 From: Kory Becker Date: Tue, 23 Aug 2022 10:56:57 -0400 Subject: [PATCH 10/10] unit test --- test/test_view/test_assign_task_worker.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/test_view/test_assign_task_worker.py b/test/test_view/test_assign_task_worker.py index 2de493c3bb..d120c3d14b 100644 --- a/test/test_view/test_assign_task_worker.py +++ b/test/test_view/test_assign_task_worker.py @@ -130,10 +130,14 @@ def test_get_assign_workers_by_bulk(self): res = self.app.post(url, content_type='application/json', data=json.dumps(req_data), follow_redirects=True, headers={'X-CSRFToken': csrf}) res_data = json.loads(res.data) - # Verify all users are returned. - assert res_data['all_users'][0]['email'] in [user1.email_addr, user2.email_addr] - assert res_data['all_users'][1]['email'] in [user1.email_addr, user2.email_addr] - assert res_data['all_users'][0]['email'] != res_data['all_users'][1]['email'] + # Verify users are returned. + assert len(res_data['all_users']) > 1 + assert res_data['all_users'][0]['email'] + + # Verify emails are returned. + emails = [user['email'] for user in res_data['all_users']] + assert user1.email_addr in emails + assert user2.email_addr in emails @with_context def test_update_assign_workers_by_task_id(self):