diff --git a/pagure/templates/settings.html b/pagure/templates/settings.html index 2f28a29..0eafd21 100644 --- a/pagure/templates/settings.html +++ b/pagure/templates/settings.html @@ -1100,19 +1100,28 @@ Delete Project
-
+ +   Delete the {{ repo.fullname }} project + + {% else %} + - -
+ + + + {% endif %}
diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 3108d23..caf46f6 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -1425,6 +1425,15 @@ def delete_repo(repo, username=None, namespace=None): 403, 'You are not allowed to change the settings for this project') + if repo.read_only: + flask.flash( + 'The ACLs of this project are being refreshed in the backend ' + 'this prevents the project from being deleted. Please wait ' + 'for this task to finish before trying again. Thanks!') + return flask.redirect(flask.url_for( + 'view_settings', repo=repo.name, username=username, + namespace=namespace)) + try: SESSION.delete(repo) SESSION.commit() diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index d2f82a4..d8794e8 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -2625,6 +2625,12 @@ index 0000000..fb7093d output = self.app.post('/test/delete') self.assertEqual(output.status_code, 302) + # Ensure the project isn't read-only + repo = pagure.get_authorized_project(self.session, 'test') + repo.read_only = False + self.session.add(repo) + self.session.commit() + with tests.user_set(pagure.APP, user): # Only git repo item = pagure.lib.model.Project( @@ -2815,6 +2821,56 @@ index 0000000..fb7093d @patch('pagure.lib.notify.send_email') @patch('pagure.ui.repo.admin_session_timedout') + def test_delete_read_only_repo(self, ast, send_email): + """ Test the delete_repo endpoint when the repo is read_only """ + ast.return_value = False + send_email.return_value = True + + tests.create_projects(self.session) + tests.create_projects_git(os.path.join(self.path, 'repos')) + + # All repo there + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test', + description='test project #1', + hook_token='aaabbbiii', + ) + self.session.add(item) + self.session.commit() + + # Create all the git repos + tests.create_projects_git(os.path.join(self.path, 'repos')) + tests.create_projects_git(os.path.join(self.path, 'docs')) + tests.create_projects_git( + os.path.join(self.path, 'tickets'), bare=True) + tests.create_projects_git( + os.path.join(self.path, 'requests'), bare=True) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + + repo = pagure.get_authorized_project(self.session, 'test') + self.assertNotEqual(repo, None) + repo.read_only = True + self.session.add(repo) + self.session.commit() + + output = self.app.post('/test/delete', follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + u'Settings - test - Pagure', output.data) + self.assertIn( + u'The ACLs of this project are being refreshed in the ' + u'backend this prevents the project from being deleted. ' + u'Please wait for this task to finish before trying again. ' + u'Thanks!', output.data) + self.assertIn( + u'title="Action disabled while project\'s ACLs are being refreshed">', + output.data) + + @patch('pagure.lib.notify.send_email') + @patch('pagure.ui.repo.admin_session_timedout') def test_delete_repo(self, ast, send_email): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -2841,6 +2897,12 @@ index 0000000..fb7093d output = self.app.post('/test/delete') self.assertEqual(output.status_code, 302) + # Ensure the project isn't read-only + repo = pagure.get_authorized_project(self.session, 'test') + repo.read_only = False + self.session.add(repo) + self.session.commit() + user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): tests.create_projects_git(os.path.join(self.path, 'repos')) @@ -2865,6 +2927,7 @@ index 0000000..fb7093d name='test', description='test project #1', hook_token='aaabbbggg', + read_only=False, ) self.session.add(item) self.session.commit() @@ -2885,6 +2948,7 @@ index 0000000..fb7093d name='test', description='test project #1', hook_token='aaabbbhhh', + read_only=False, ) self.session.add(item) self.session.commit() @@ -2905,6 +2969,7 @@ index 0000000..fb7093d name='test', description='test project #1', hook_token='aaabbbiii', + read_only=False, ) self.session.add(item) self.session.commit() @@ -3041,6 +3106,7 @@ index 0000000..fb7093d is_fork=True, parent_id=2, hook_token='aaabbbjjj', + read_only=False, ) self.session.add(item) self.session.commit() @@ -3082,6 +3148,12 @@ index 0000000..fb7093d tests.create_projects(self.session) tests.create_projects_git(os.path.join(self.path, 'repos')) + # Ensure the project isn't read-only + repo = pagure.get_authorized_project(self.session, 'test') + repo.read_only = False + self.session.add(repo) + self.session.commit() + user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): # Check before deleting the project @@ -3122,6 +3194,7 @@ index 0000000..fb7093d name='test', description='test project #1', hook_token='aaabbbiii', + read_only=False, ) self.session.add(item) self.session.commit() @@ -3156,6 +3229,13 @@ index 0000000..fb7093d self.session.commit() self.assertEqual(msg, 'User added') + # Ensure the project isn't read-only (because adding an user + # will trigger an ACL refresh, thus read-only) + repo = pagure.get_authorized_project(self.session, 'test') + repo.read_only = False + self.session.add(repo) + self.session.commit() + # Check before deleting the project output = self.app.get('/') self.assertEqual(output.status_code, 200) @@ -3202,6 +3282,7 @@ index 0000000..fb7093d name='test', description='test project #1', hook_token='aaabbbiii', + read_only=False, ) self.session.add(item) self.session.commit() @@ -3250,6 +3331,13 @@ index 0000000..fb7093d self.session.commit() self.assertEqual(msg, 'Group added') + # Ensure the project isn't read-only (because adding a group + # will trigger an ACL refresh, thus read-only) + repo = pagure.get_authorized_project(self.session, 'test') + repo.read_only = False + self.session.add(repo) + self.session.commit() + # check if group where we expect it repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.projects_groups), 1) @@ -3296,6 +3384,7 @@ index 0000000..fb7093d name='test', description='test project #1', hook_token='aaabbbiii', + read_only=False, ) self.session.add(item) self.session.commit() diff --git a/tests/test_pagure_flask_ui_repo_delete_project.py b/tests/test_pagure_flask_ui_repo_delete_project.py index 902d1e5..95a61de 100644 --- a/tests/test_pagure_flask_ui_repo_delete_project.py +++ b/tests/test_pagure_flask_ui_repo_delete_project.py @@ -54,6 +54,10 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): project = pagure.get_authorized_project( self.session, project_name='test') self.assertIsNotNone(project) + # Ensure the project isn't read-only + project.read_only = False + self.session.add(project) + self.session.commit() # Create a fork task_id = pagure.lib.fork_project(