diff --git a/pagure/lib/model.py b/pagure/lib/model.py index a9322ec..092a965 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -379,7 +379,8 @@ class Project(BASE): secondary="user_projects", primaryjoin="projects.c.id==user_projects.c.project_id", secondaryjoin="users.c.id==user_projects.c.user_id", - backref='co_projects' + backref='co_projects', + viewonly=True ) admins = relation( @@ -388,7 +389,8 @@ class Project(BASE): primaryjoin="projects.c.id==user_projects.c.project_id", secondaryjoin="and_(users.c.id==user_projects.c.user_id,\ user_projects.c.access=='admin')", - backref='co_projects_admins' + backref='co_projects_admins', + viewonly=True ) committers = relation( @@ -398,7 +400,8 @@ class Project(BASE): secondaryjoin="and_(users.c.id==user_projects.c.user_id,\ or_(user_projects.c.access=='commit',\ user_projects.c.access=='admin'))", - backref='co_projects_committers' + backref='co_projects_committers', + viewonly=True ) groups = relation( @@ -410,7 +413,8 @@ class Project(BASE): "projects", order_by="func.lower(projects.c.namespace).desc(), \ func.lower(projects.c.name)" - ) + ), + viewonly=True ) admin_groups = relation( @@ -420,6 +424,7 @@ class Project(BASE): secondaryjoin="and_(pagure_group.c.id==projects_groups.c.group_id,\ projects_groups.c.access=='admin')", backref="projects_admin_groups", + viewonly=True ) committer_groups = relation( @@ -430,6 +435,7 @@ class Project(BASE): or_(projects_groups.c.access=='admin',\ projects_groups.c.access=='commit'))", backref="projects_committer_groups", + viewonly=True ) unwatchers = relation( @@ -725,7 +731,11 @@ class ProjectUser(BASE): project = relation( 'Project', remote_side=[Project.id], - backref='user_projects') + backref=backref( + 'user_projects', cascade="delete,delete-orphan", + single_parent=True + ) + ) user = relation('User', backref='user_projects') @@ -826,8 +836,10 @@ class Issue(BASE): project = relation( 'Project', foreign_keys=[project_id], remote_side=[Project.id], backref=backref( - 'issues', cascade="delete, delete-orphan", single_parent=True) - ) + 'issues', cascade="delete, delete-orphan", + ), + single_parent=True + ) user = relation('User', foreign_keys=[user_id], remote_side=[User.id], backref='issues') @@ -847,6 +859,7 @@ class Issue(BASE): secondary="tags_issues_colored", primaryjoin="issues.c.uid==tags_issues_colored.c.issue_uid", secondaryjoin="tags_issues_colored.c.tag_id==tags_colored.c.id", + viewonly=True ) def __repr__(self): @@ -1262,7 +1275,10 @@ class TagColored(BASE): project = relation( 'Project', foreign_keys=[project_id], remote_side=[Project.id], - backref="tags_colored", + backref=backref( + 'tags_colored', cascade="delete,delete-orphan", + single_parent=True + ) ) def __repr__(self): @@ -1846,8 +1862,12 @@ class ProjectGroup(BASE): nullable=False) project = relation( - 'Project', remote_side=[Project.id], - backref='projects_groups') + 'Project', foreign_keys=[project_id], remote_side=[Project.id], + backref=backref( + 'projects_groups', cascade="delete,delete-orphan", + single_parent=True + ) + ) group = relation('PagureGroup', backref='projects_groups') diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 211614c..7eb6dd5 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -1485,14 +1485,8 @@ def delete_repo(repo, username=None, namespace=None): 'You are not allowed to change the settings for this project') try: - for issue in repo.issues: - for comment in issue.comments: - SESSION.delete(comment) - SESSION.commit() - SESSION.delete(issue) SESSION.delete(repo) SESSION.commit() - except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() APP.logger.exception(err) diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 5e36265..f37bdca 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -2714,7 +2714,6 @@ index 0000000..fb7093d pagure.APP.config['ENABLE_DEL_PROJECTS'] = True - @patch('pagure.lib.notify.send_email') @patch('pagure.ui.repo.admin_session_timedout') def test_delete_repo(self, ast, send_email): @@ -2976,6 +2975,274 @@ index 0000000..fb7093d 'Forks 0', output.data) + @patch('pagure.lib.notify.send_email') + @patch('pagure.ui.repo.admin_session_timedout') + def test_delete_repo_with_users(self, ast, send_email): + """ Test the delete_repo endpoint. """ + ast.return_value = False + send_email.return_value = True + + user = tests.FakeUser() + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + # Create new project + 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(self.path) + tests.create_projects_git( + os.path.join(self.path, 'docs'), bare=True) + tests.create_projects_git( + os.path.join(self.path, 'tickets'), bare=True) + tests.create_projects_git( + os.path.join(self.path, 'requests'), bare=True) + + # Check repo was created + output = self.app.get('/') + self.assertEqual(output.status_code, 200) + self.assertIn( + '