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
-
+
+
+
+ {% 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(