From ff1592dafd6c3ea7d3860a943df4d96503074299 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jul 19 2018 14:07:37 +0000 Subject: Ensure only project from the family accepting PR are listed on the new PR page Fixes https://pagure.io/pagure/issue/3413 Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index 9f2a7ed..0853793 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -726,6 +726,12 @@ def get_project_family(repo, namespace=None, username=None): ] } """ + + allows_pr = flask.request.form.get( + 'allows_pr', '').lower().strip() in ['1', 'true'] + allows_issues = flask.request.form.get( + 'allows_issues', '').lower().strip() in ['1', 'true'] + form = pagure.forms.ConfirmationForm() if not form.validate_on_submit(): response = flask.jsonify({ @@ -746,10 +752,23 @@ def get_project_family(repo, namespace=None, username=None): response.status_code = 404 return response - family = [ - p.url_path for p in - pagure.lib.get_project_family(flask.g.session, repo) - ] + if allows_pr: + family = [ + p.url_path for p in + pagure.lib.get_project_family(flask.g.session, repo) + if p.settings.get('pull_requests', True) + ] + elif allows_issues: + family = [ + p.url_path for p in + pagure.lib.get_project_family(flask.g.session, repo) + if p.settings.get('issue_tracker', True) + ] + else: + family = [ + p.url_path for p in + pagure.lib.get_project_family(flask.g.session, repo) + ] return flask.jsonify( { diff --git a/pagure/templates/repo_new_pull_request.html b/pagure/templates/repo_new_pull_request.html index f466870..a548a1d 100644 --- a/pagure/templates/repo_new_pull_request.html +++ b/pagure/templates/repo_new_pull_request.html @@ -409,6 +409,7 @@ $(document).ready(function() { dataType: 'json', data: { csrf_token: "{{ g.confirmationform.csrf_token.current_token }}", + 'allows_pr': '1', }, success: function(res) { $('#family-spinner').hide(); diff --git a/tests/test_pagure_flask_internal.py b/tests/test_pagure_flask_internal.py index 8569070..b17712f 100644 --- a/tests/test_pagure_flask_internal.py +++ b/tests/test_pagure_flask_internal.py @@ -1772,6 +1772,96 @@ class PagureFlaskInternaltests(tests.Modeltests): js_data['family'], ['test', 'fork/foo/test', 'fork/ralph/test']) + def test_get_project_larger_family_pr_only(self): + ''' Test the get_project_family from the internal API. ''' + tests.create_projects(self.session) + tests.create_projects_git( + os.path.join(self.path, 'repos'), bare=True) + + # Create a 3rd user + item = pagure.lib.model.User( + user='ralph', + fullname='Ralph bar', + password='ralph_foo', + default_email='ralph@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='ralph@bar.com') + self.session.add(item) + self.session.commit() + + # Create a couple of forks of the test project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test', + is_fork=True, + parent_id=1, # test + description='test project #1', + hook_token='aaabbbcccddd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed', 'Duplicate'] + # disable issues in this fork + default_repo_settings = item.settings + default_repo_settings['issue_tracker'] = False + item.settings = default_repo_settings + self.session.add(item) + + item = pagure.lib.model.Project( + user_id=3, # Ralph + name='test', + is_fork=True, + parent_id=1, # test + description='test project #1', + hook_token='aaabbbccceee', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed', 'Duplicate'] + # disable PRs in this fork + default_repo_settings = item.settings + default_repo_settings['pull_requests'] = False + item.settings = default_repo_settings + self.session.add(item) + self.session.commit() + + # Get on with testing + user = tests.FakeUser() + user.username = 'pingou' + with tests.user_set(self.app.application, user): + csrf_token = self.get_csrf() + + data = { + 'csrf_token': csrf_token, + 'allows_pr': '1', + } + output = self.app.post('/pv/test/family', data=data) + self.assertEqual(output.status_code, 200) + js_data = json.loads(output.get_data(as_text=True)) + self.assertEqual( + sorted(js_data.keys()), + ['code', 'family'] + ) + self.assertEqual(js_data['code'], 'OK') + self.assertEqual( + js_data['family'], + ['test', 'fork/foo/test']) + + data = { + 'csrf_token': csrf_token, + 'allows_issues': '1', + } + output = self.app.post('/pv/test/family', data=data) + self.assertEqual(output.status_code, 200) + js_data = json.loads(output.get_data(as_text=True)) + self.assertEqual( + sorted(js_data.keys()), + ['code', 'family'] + ) + self.assertEqual(js_data['code'], 'OK') + self.assertEqual( + js_data['family'], + ['test', 'fork/ralph/test']) + def test_get_pull_request_ready_branch_main_repo_no_branch(self): '''Test the get_pull_request_ready_branch from the internal API on the main repository