diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 6c1975c..9ade9b1 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -4304,6 +4304,10 @@ def set_project_owner(session, project, user): :arg user: a User object representing the new owner of the project. :return: None ''' + for contributor in project.users: + if user.id == contributor.id: + project.users.remove(contributor) + break project.user = user session.add(project) diff --git a/tests/test_pagure_flask_api_project.py b/tests/test_pagure_flask_api_project.py index 9bb5081..e392c1e 100644 --- a/tests/test_pagure_flask_api_project.py +++ b/tests/test_pagure_flask_api_project.py @@ -1242,6 +1242,79 @@ class PagureFlaskApiProjecttests(tests.Modeltests): } self.assertEqual(data, expected_output) + def test_api_modify_project_main_admin_retain_access_already_user(self): + """ Test the api_modify_project method of the flask api when the + request is to change the main_admin of the project and retain_access + is true and the user becoming the main_admin already has access. """ + tests.create_projects(self.session) + tests.create_tokens(self.session, project_id=None) + tests.create_tokens_acl(self.session, 'aaabbbcccddd', 'modify_project') + headers = {'Authorization': 'token aaabbbcccddd'} + + project = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + self.session, project, + new_user='foo', + user='pingou', + access='commit' + ) + self.session.commit() + + user = pagure.lib.get_user(self.session, 'pingou') + user.cla_done = True + with tests.user_set(pagure.APP, user): + output = self.app.patch( + '/api/0/test', headers=headers, + data={'main_admin': 'foo', 'retain_access': True}) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['date_created'] = '1496338274' + data['date_modified'] = '1496338274' + expected_output = { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "pingou" + ], + "commit": [], + "owner": [ + "foo" + ], + "ticket": [] + }, + "close_status": [ + "Invalid", + "Insufficient data", + "Fixed", + "Duplicate" + ], + "custom_keys": [], + "date_created": "1496338274", + "date_modified": "1496338274", + "description": "test project #1", + "fullname": "test", + "id": 1, + "milestones": {}, + "name": "test", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "default_email": "foo@bar.com", + "emails": [ + "foo@bar.com" + ], + "fullname": "foo bar", + "name": "foo" + } + } + self.assertEqual(data, expected_output) + def test_api_modify_project_main_admin_json(self): """ Test the api_modify_project method of the flask api when the request is to change the main_admin of the project using JSON. """ diff --git a/tests/test_pagure_flask_ui_app_give_project.py b/tests/test_pagure_flask_ui_app_give_project.py index 068570c..1b07529 100644 --- a/tests/test_pagure_flask_ui_app_give_project.py +++ b/tests/test_pagure_flask_ui_app_give_project.py @@ -260,6 +260,47 @@ class PagureFlaskGiveRepotests(tests.SimplePagureTest): self.assertEqual(len(project.users), 1) self.assertEqual(project.users[0].user, 'pingou') + @patch.dict('pagure.APP.config', {'PAGURE_ADMIN_USERS': 'foo'}) + def test_give_project_already_user(self): + """ Test the give_project endpoint when the new main_admin is already + a committer on the project. """ + + project = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + self.session, project, + new_user='foo', + user='pingou', + access='commit' + ) + self.session.commit() + user = tests.FakeUser() + user.username = 'pingou' + with tests.user_set(pagure.APP, user): + csrf_token = self.get_csrf() + + self._check_user() + + # All good + data = { + 'user': 'foo', + 'csrf_token': csrf_token, + } + + output = self.app.post( + '/test/give', data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + '\n The project has been ' + 'transferred to foo\n', + output.data) + + self._check_user('foo') + # Make sure that the user giving the project is still an admin + project = pagure.get_authorized_project( + self.session, project_name='test') + self.assertEqual(len(project.users), 1) + self.assertEqual(project.users[0].user, 'pingou') + if __name__ == '__main__': unittest.main(verbosity=2)