diff --git a/pagure-loadjson/pagure_loadjson_server.py b/pagure-loadjson/pagure_loadjson_server.py index 32b5292..8799c98 100644 --- a/pagure-loadjson/pagure_loadjson_server.py +++ b/pagure-loadjson/pagure_loadjson_server.py @@ -200,7 +200,8 @@ def handle_messages(): namespace=namespace, username=username, issue_uid=filename, - json_data=json_data + json_data=json_data, + agent=agent, ) tmp += ' ... ... Done' except Exception as err: diff --git a/pagure/lib/git.py b/pagure/lib/git.py index b3ca0db..8e4348b 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -492,15 +492,20 @@ def update_custom_field_from_json(session, repo, issue, json_data): def update_ticket_from_git( - session, reponame, namespace, username, issue_uid, json_data): + session, reponame, namespace, username, issue_uid, json_data, agent): """ Update the specified issue (identified by its unique identifier) with the data present in the json blob provided. :arg session: the session to connect to the database with. :arg repo: the name of the project to update + :arg namespace: the namespace of the project to update + :arg username: the username of the project to update (if the project + is a fork) :arg issue_uid: the unique identifier of the issue to update :arg json_data: the json representation of the issue taken from the git and used to update the data in the database. + :arg agent: the username of the person who pushed the changes (and thus + is assumed did the action). """ @@ -514,6 +519,9 @@ def update_ticket_from_git( reponame, username, namespace)) user = get_user_from_json(session, json_data) + # rely on the agent provided, but if something goes wrong, behave as + # ticket creator + agent = pagure.lib.search_user(session, username=agent) or user issue = pagure.lib.get_issue_by_uid(session, issue_uid=issue_uid) messages = [] @@ -543,7 +551,7 @@ def update_ticket_from_git( session, issue=issue, ticketfolder=None, - user=user.username, + user=agent.username, title=json_data.get('title'), content=json_data.get('content'), priority=json_data.get('priority'), @@ -584,7 +592,7 @@ def update_ticket_from_git( session, issue=issue, ticketfolder=None, - user=user.username, + user=agent.username, milestone=milestone, title=json_data.get('title'), content=json_data.get('content'), @@ -621,7 +629,7 @@ def update_ticket_from_git( if assignee: msg = pagure.lib.add_issue_assignee( session, issue, assignee.username, - user=user.user, ticketfolder=None, notify=False) + user=agent.user, ticketfolder=None, notify=False) if msg: messages.append(msg) @@ -629,7 +637,7 @@ def update_ticket_from_git( depends = json_data.get('depends', []) msgs = pagure.lib.update_dependency_issue( session, issue.project, issue, depends, - username=user.user, ticketfolder=None) + username=agent.user, ticketfolder=None) if msgs: messages.extend(msgs) @@ -637,7 +645,7 @@ def update_ticket_from_git( blocks = json_data.get('blocks', []) msgs = pagure.lib.update_blocked_issue( session, issue.project, issue, blocks, - username=user.user, ticketfolder=None) + username=agent.user, ticketfolder=None) if msgs: messages.extend(msgs) @@ -662,7 +670,7 @@ def update_ticket_from_git( session=session, issue=issue, messages=messages, - user=user.username, + user=agent.username, ticketfolder=None ) session.commit() diff --git a/tests/test_pagure_flask_dump_load_ticket.py b/tests/test_pagure_flask_dump_load_ticket.py index cd9bd9e..fde473f 100644 --- a/tests/test_pagure_flask_dump_load_ticket.py +++ b/tests/test_pagure_flask_dump_load_ticket.py @@ -47,7 +47,6 @@ class PagureFlaskDumpLoadTicketTests(tests.Modeltests): pagure.ui.fork.SESSION = self.session pagure.ui.repo.SESSION = self.session - @patch('pagure.lib.notify.send_email') @patch('pagure.lib.git._maybe_wait') def test_dumping_reloading_ticket(self, mw, send_email): @@ -209,6 +208,7 @@ class PagureFlaskDumpLoadTicketTests(tests.Modeltests): username=None, issue_uid='foobar', json_data=jsondata, + agent='pingou', ) # Post loading @@ -223,6 +223,7 @@ class PagureFlaskDumpLoadTicketTests(tests.Modeltests): self.assertEqual(issue.assignee.username, 'pingou') self.assertEqual(issue.children, []) self.assertEqual(issue.parents, []) + self.assertEqual(issue.status, 'Open') if __name__ == '__main__': diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index d5a7716..4b0fc07 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -2048,7 +2048,8 @@ index 0000000..60f7480 namespace=None, username=None, issue_uid='foobar', - json_data=data + json_data=data, + agent='pingou', ) # Create the issue @@ -2062,7 +2063,7 @@ index 0000000..60f7480 pagure.lib.git.update_ticket_from_git( self.session, reponame='test', namespace=None, username=None, - issue_uid='foobar', json_data=data + issue_uid='foobar', json_data=data, agent='pingou', ) self.session.commit() @@ -2078,7 +2079,7 @@ index 0000000..60f7480 pagure.lib.git.update_ticket_from_git( self.session, reponame='test', namespace=None, username=None, - issue_uid='foobar', json_data=data + issue_uid='foobar', json_data=data, agent='pingou', ) self.session.commit() @@ -2093,6 +2094,76 @@ index 0000000..60f7480 self.assertEqual(repo.issues[0].priority, None) self.assertEqual(repo.milestones, {'Next Release': None}) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_update_ticket_from_git_close_ticket(self): + """ Test the update_ticket_from_git method from pagure.lib.git. """ + tests.create_projects(self.session) + + repo = pagure.get_authorized_project(self.session, 'test') + + # Before + self.assertEqual(len(repo.issues), 0) + self.assertEqual(repo.issues, []) + + # Create the issue + data = { + "status": "Open", + "title": "foo", + "comments": [], + "content": "bar", + "date_created": "1426500263", + "user": { + "name": "foo", + "emails": ["foo@fedoraproject.org"] + }, + "milestone": "Next Release", + } + + pagure.lib.git.update_ticket_from_git( + self.session, reponame='test', namespace=None, username=None, + issue_uid='foobar', json_data=data, agent='pingou', + ) + self.session.commit() + + # Edit the issue + data = { + "status": "Closed", + "close_status": "Fixed", + "title": "foo", + "comments": [], + "content": "bar", + "date_created": "1426500263", + "user": { + "name": "foo", + "emails": ["foo@fedoraproject.org"] + }, + "milestone": "Next Release", + } + + pagure.lib.git.update_ticket_from_git( + self.session, reponame='test', namespace=None, username=None, + issue_uid='foobar', json_data=data, agent='pingou', + ) + self.session.commit() + + self.assertEqual(len(repo.issues), 1) + self.assertEqual(repo.issues[0].id, 1) + self.assertEqual(repo.issues[0].uid, 'foobar') + self.assertEqual(repo.issues[0].title, 'foo') + self.assertEqual(repo.issues[0].depending_text, []) + self.assertEqual(repo.issues[0].blocking_text, []) + self.assertEqual(repo.issues[0].milestone, 'Next Release') + self.assertEqual(repo.issues[0].priority, None) + self.assertEqual(repo.milestones, {'Next Release': None}) + self.assertEqual(repo.issues[0].status, 'Closed') + self.assertEqual(repo.issues[0].close_status, 'Fixed') + self.assertEqual( + repo.issues[0].comments[-1].comment, + '**Metadata Update from @pingou**:\n' + '- Issue close_status updated to: Fixed\n' + '- Issue status updated to: Closed (was: Open)' + ) + def test_update_ticket_from_git(self): """ Test the update_ticket_from_git method from pagure.lib.git. """ tests.create_projects(self.session) @@ -2124,12 +2195,13 @@ index 0000000..60f7480 namespace=None, username=None, issue_uid='foobar', - json_data=data + json_data=data, + agent='pingou', ) pagure.lib.git.update_ticket_from_git( self.session, reponame='test', namespace=None, username=None, - issue_uid='foobar', json_data=data + issue_uid='foobar', json_data=data, agent='pingou', ) self.session.commit() @@ -2147,7 +2219,7 @@ index 0000000..60f7480 data["title"] = "fake issue for tests" pagure.lib.git.update_ticket_from_git( self.session, reponame='test', namespace=None, username=None, - issue_uid='foobar', json_data=data + issue_uid='foobar', json_data=data, agent='pingou', ) self.session.commit() @@ -2213,7 +2285,7 @@ index 0000000..60f7480 pagure.lib.git.update_ticket_from_git( self.session, reponame='test', namespace=None, username=None, - issue_uid='foobar2', json_data=data + issue_uid='foobar2', json_data=data, agent='pingou', ) # After second insertion