From bcd466234d90be50a6d68d9327a63b101030d486 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 30 2015 10:39:03 +0000 Subject: [PATCH 1/3] Add a column updated_on to the pull_requests table This will record the last time the Pull-Request was updated (ie the merge/close date) --- diff --git a/alembic/versions/6190226bed0_add_the_updated_on_column_to_pull_.py b/alembic/versions/6190226bed0_add_the_updated_on_column_to_pull_.py new file mode 100644 index 0000000..6a362b6 --- /dev/null +++ b/alembic/versions/6190226bed0_add_the_updated_on_column_to_pull_.py @@ -0,0 +1,43 @@ +"""Add the updated_on column to pull-requests + +Revision ID: 6190226bed0 +Revises: 257a7ce22682 +Create Date: 2015-09-29 15:32:58.229183 + +""" + +# revision identifiers, used by Alembic. +revision = '6190226bed0' +down_revision = '257a7ce22682' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ''' Add the column updated_on to the table pull_requests. + ''' + op.add_column( + 'pull_requests', + sa.Column( + 'updated_on', + sa.DateTime, + nullable=True, + default=sa.func.now(), + onupdate=sa.func.now() + ) + ) + + op.execute('''UPDATE "pull_requests" SET updated_on=date_created;''') + + op.alter_column( + 'pull_requests', + column_name='updated_on', + nullable=False, + existing_nullable=True) + + +def downgrade(): + ''' Remove the column updated_on from the table pull_requests. + ''' + op.drop_column('pull_requests', 'updated_on') diff --git a/pagure/lib/model.py b/pagure/lib/model.py index f357f8a..ce0a6e2 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -759,6 +759,11 @@ class PullRequest(BASE): date_created = sa.Column(sa.DateTime, nullable=False, default=datetime.datetime.utcnow) + updated_on = sa.Column( + sa.DateTime, + nullable=False, + default=sa.func.now(), + onupdate=sa.func.now()) __table_args__ = ( sa.CheckConstraint( @@ -849,6 +854,7 @@ class PullRequest(BASE): public=public, api=api) if self.project_from else None, 'remote_git': self.remote_git, 'date_created': self.date_created.strftime('%s'), + 'updated_on': self.updated_on.strftime('%s'), 'user': self.user.to_json(public=public), 'assignee': self.assignee.to_json( public=public) if self.assignee else None, From 44258a966b283745e3bccc231f8c94f05f0eab6f Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 30 2015 11:48:24 +0000 Subject: [PATCH 2/3] Adjust the unit-tests for the change in the JSON structure of Pull-Requests --- diff --git a/tests/test_progit_flask_api_fork.py b/tests/test_progit_flask_api_fork.py index b0bf0fb..d3e90cb 100644 --- a/tests/test_progit_flask_api_fork.py +++ b/tests/test_progit_flask_api_fork.py @@ -87,6 +87,7 @@ class PagureFlaskApiForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.data) data['requests'][0]['date_created'] = '1431414800' + data['requests'][0]['updated_on'] = '1431414800' data['requests'][0]['project']['date_created'] = '1431414800' data['requests'][0]['repo_from']['date_created'] = '1431414800' data['requests'][0]['uid'] = '1431414800' @@ -138,6 +139,7 @@ class PagureFlaskApiForktests(tests.Modeltests): "status": 'Open', "title": "test pull-request", "uid": "1431414800", + "updated_on": "1431414800", "user": { "fullname": "PY C", "name": "pingou" @@ -154,6 +156,7 @@ class PagureFlaskApiForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) data2 = json.loads(output.data) data2['requests'][0]['date_created'] = '1431414800' + data2['requests'][0]['updated_on'] = '1431414800' data2['requests'][0]['project']['date_created'] = '1431414800' data2['requests'][0]['repo_from']['date_created'] = '1431414800' data2['requests'][0]['uid'] = '1431414800' @@ -214,6 +217,7 @@ class PagureFlaskApiForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.data) data['date_created'] = '1431414800' + data['updated_on'] = '1431414800' data['project']['date_created'] = '1431414800' data['repo_from']['date_created'] = '1431414800' data['uid'] = '1431414800' @@ -257,6 +261,7 @@ class PagureFlaskApiForktests(tests.Modeltests): "status": 'Open', "title": "test pull-request", "uid": "1431414800", + "updated_on": "1431414800", "user": { "fullname": "PY C", "name": "pingou" @@ -275,6 +280,7 @@ class PagureFlaskApiForktests(tests.Modeltests): data2['repo_from']['date_created'] = '1431414800' data2['uid'] = '1431414800' data2['date_created'] = '1431414800' + data2['updated_on'] = '1431414800' self.assertDictEqual(data, data2) @patch('pagure.lib.notify.send_email') diff --git a/tests/test_progit_lib_git.py b/tests/test_progit_lib_git.py index f1ba0ab..a3c0697 100644 --- a/tests/test_progit_lib_git.py +++ b/tests/test_progit_lib_git.py @@ -689,7 +689,7 @@ new file mode 100644 index 0000000..60f7480 --- /dev/null +++ b/456 -@@ -0,0 +1,76 @@ +@@ -0,0 +1,77 @@ +{ + "assignee": null, + "branch": "master", @@ -756,6 +756,7 @@ index 0000000..60f7480 + "status": "Open", + "title": "test PR", + "uid": "foobar", ++ "updated_on": null, + "user": { + "default_email": "bar@pingou.com", + "emails": [ @@ -787,6 +788,9 @@ index 0000000..60f7480 elif 'date_created' in row: t = row.split(': ')[0] row = '%s: null,' % t + elif 'updated_on' in row: + t = row.split(': ')[0] + row = '%s: null,' % t elif row.startswith('index 00'): row = 'index 0000000..60f7480' elif row.startswith('+++ b/'): From e6898327b74d2d2cd377d4e5bc5cd794d89a7016 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 30 2015 11:55:35 +0000 Subject: [PATCH 3/3] Adjust the API documentation - Mention the newly added updated_on field - Adjust the information about the filter by status when listing PRs of a project - Adjust the way the status field is checked for closed PRs --- diff --git a/pagure/api/fork.py b/pagure/api/fork.py index a99a957..844aff9 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -42,10 +42,13 @@ def api_pull_request_views(repo, username=None): +---------------+----------+--------------+----------------------------+ | Key | Type | Optionality | Description | +===============+==========+==============+============================+ - | ``status`` | boolean | Optional | | Filter the status of | + | ``status`` | string | Optional | | Filter the status of | | | | | pull requests. Default: | | | | | ``True`` (opened pull | - | | | | requests) | + | | | | requests), can be ``0`` | + | | | | or ``closed`` for closed | + | | | | requests or ``Merged`` | + | | | | for merged requests. | +---------------+----------+--------------+----------------------------+ | ``assignee`` | string | Optional | | Filter the assignee of | | | | | pull requests | @@ -101,6 +104,7 @@ def api_pull_request_views(repo, username=None): "status": true, "title": "test pull-request", "uid": "1431414800", + "updated_on": "1431414800", "user": { "fullname": "PY C", "name": "pingou" @@ -125,7 +129,7 @@ def api_pull_request_views(repo, username=None): author = flask.request.args.get('author', None) requests = [] - if status is False or str(status).lower() == 'closed': + if str(status).lower() in ['0', 'false', 'closed']: requests = pagure.lib.search_pull_requests( SESSION, project_id=repo.id, @@ -210,6 +214,7 @@ def api_pull_request_view(repo, requestid, username=None): "status": true, "title": "test pull-request", "uid": "1431414800", + "updated_on": "1431414800", "user": { "fullname": "PY C", "name": "pingou"