From c965acbba9378cdd216c3512adb05d1b18d8af81 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 28 2017 09:21:48 +0000 Subject: Let acting on the status potentially set the close_status and vice versa This way, making a closed ticket 'Open' will reset its close_status and giving a 'close_status' to an open ticket will close it. Fixes https://pagure.io/pagure/issue/2358 Fixes https://pagure.io/pagure/issue/2192 Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 5b8fdf4..c9e55db 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1593,6 +1593,7 @@ def edit_issue(session, issue, ticketfolder, user, repo=None, issue.closed_at = datetime.datetime.utcnow() elif issue.close_status: issue.close_status = None + close_status = -1 edit.append('close_status') edit.append('status') messages.append( @@ -1604,6 +1605,10 @@ def edit_issue(session, issue, ticketfolder, user, repo=None, msg = 'Issue close_status updated to: %s' % close_status if old_status: msg += ' (was: %s)' % old_status + if issue.status.lower() == 'open' and close_status: + issue.status = 'Closed' + issue.closed_at = datetime.datetime.utcnow() + edit.append('status') messages.append(msg) if priority != -1: priorities = issue.project.priorities @@ -1649,7 +1654,7 @@ def edit_issue(session, issue, ticketfolder, user, repo=None, issue, repo=issue.project, repofolder=ticketfolder) if 'status' in edit: - log_action(session, status.lower(), issue, user_obj) + log_action(session, issue.status.lower(), issue, user_obj) pagure.lib.notify.notify_status_change_issue(issue, user_obj) if not issue.private and edit: diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 3b8b5a9..d7eaf13 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -170,8 +170,6 @@ def update_issue(repo, issueid, username=None, namespace=None): assignee = form.assignee.data.strip() or None new_status = form.status.data.strip() or None close_status = form.close_status.data or None - if new_status != 'Closed': - close_status = None if close_status not in repo.close_status: close_status = None diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index f6df74e..acbf3a6 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -616,6 +616,64 @@ class PagureLibtests(tests.Modeltests): @patch('pagure.lib.git.update_git') @patch('pagure.lib.notify.send_email') + def test_edit_issue_close_status(self, p_send_email, p_ugt): + """ Test the edit_issue of pagure.lib. """ + p_send_email.return_value = True + p_ugt.return_value = True + + self.test_new_issue() + + repo = pagure.lib._get_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + self.assertEqual(issue.status, 'Open') + self.assertEqual(issue.close_status, None) + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 2) + + # Edit the issue, providing just a close_status should also close + # the ticket + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + close_status='Fixed', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, ['Issue close_status updated to: Fixed']) + + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + self.assertEqual(issue.status, 'Closed') + self.assertEqual(issue.close_status, 'Fixed') + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(repo.open_tickets, 1) + self.assertEqual(repo.open_tickets_public, 1) + + # Edit the issue, editing the status to open, should reset the + # close_status + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + status='Open', + ) + self.session.commit() + self.assertEqual( + msg, ['Issue status updated to: Open (was: Closed)']) + + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + self.assertEqual(issue.status, 'Open') + self.assertEqual(issue.close_status, None) + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 2) + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') def test_edit_issue_priority(self, p_send_email, p_ugt): """ Test the edit_issue of pagure.lib when changing the priority. """