From 669c0010888b3835100b09e925f358228c29d982 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 15 2018 12:22:32 +0000 Subject: [PATCH 1/2] Add a date_updated field to both commit and PR flags This allow recording the last time the flag was changed which will allow us to show said time in the UI. Relates to: https://pagure.io/pagure/issue/3987 Signed-off-by: Pierre-Yves Chibon --- diff --git a/alembic/versions/9cb4580e269a_add_date_updated_to_commit_flags.py b/alembic/versions/9cb4580e269a_add_date_updated_to_commit_flags.py new file mode 100644 index 0000000..36d626c --- /dev/null +++ b/alembic/versions/9cb4580e269a_add_date_updated_to_commit_flags.py @@ -0,0 +1,39 @@ +"""Add date_updated to commit flags + +Revision ID: 9cb4580e269a +Revises: e3cc5aedb8bb +Create Date: 2018-11-14 11:48:47.436459 + +""" + +import datetime + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9cb4580e269a' +down_revision = 'e3cc5aedb8bb' + + +def upgrade(): + """ Add date_updated column to commit_flags table """ + op.add_column( + 'commit_flags', + sa.Column( + 'date_updated', + sa.DateTime, + nullable=True, + default=datetime.datetime.utcnow, + ) + ) + op.execute('UPDATE commit_flags SET date_updated=date_created') + op.alter_column( + 'commit_flags', 'date_updated', + nullable=False, existing_nullable=True) + + +def downgrade(): + """ Drop the date_updated column from the commit_flags table """ + op.drop_column('commit_flags', 'date_updated') diff --git a/alembic/versions/e3cc5aedb8bb_add_date_updated_to_pr_flags.py b/alembic/versions/e3cc5aedb8bb_add_date_updated_to_pr_flags.py new file mode 100644 index 0000000..0bbfb0b --- /dev/null +++ b/alembic/versions/e3cc5aedb8bb_add_date_updated_to_pr_flags.py @@ -0,0 +1,38 @@ +"""Add date_updated to PR flags + +Revision ID: e3cc5aedb8bb +Revises: f16ab75e4d32 +Create Date: 2018-11-14 11:45:48.519035 + +""" + +import datetime + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'e3cc5aedb8bb' +down_revision = 'f16ab75e4d32' + + +def upgrade(): + """ Add date_updated column to pull_request_flags table """ + op.add_column( + 'pull_request_flags', + sa.Column( + 'date_updated', + sa.DateTime, + nullable=True, + default=datetime.datetime.utcnow, + ) + ) + op.execute('UPDATE pull_request_flags SET date_updated=date_created') + op.alter_column( + 'pull_request_flags', 'date_updated', + nullable=False, existing_nullable=True) + + +def downgrade(): + """ Drop the date_updated column from the pull_request_flags table """ + op.drop_column('pull_request_flags', 'date_updated') diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 64a02fc..aaae389 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -2262,6 +2262,12 @@ class PullRequestFlag(BASE): date_created = sa.Column( sa.DateTime, nullable=False, default=datetime.datetime.utcnow ) + date_updated = sa.Column( + sa.DateTime, + nullable=False, + default=datetime.datetime.utcnow, + onupdate=datetime.datetime.utcnow, + ) __table_args__ = (sa.UniqueConstraint("uid", "pull_request_uid"),) @@ -2308,6 +2314,7 @@ class PullRequestFlag(BASE): "status": self.status, "url": self.url, "date_created": arrow_ts(self.date_created), + "date_updated": arrow_ts(self.date_updated), "user": self.user.to_json(public=public), } @@ -2349,6 +2356,12 @@ class CommitFlag(BASE): date_created = sa.Column( sa.DateTime, nullable=False, default=datetime.datetime.utcnow ) + date_updated = sa.Column( + sa.DateTime, + nullable=False, + default=datetime.datetime.utcnow, + onupdate=datetime.datetime.utcnow, + ) __table_args__ = (sa.UniqueConstraint("commit_hash", "uid"),) @@ -2397,6 +2410,7 @@ class CommitFlag(BASE): "status": self.status, "url": self.url, "date_created": arrow_ts(self.date_created), + "date_updated": arrow_ts(self.date_updated), "user": self.user.to_json(public=public), } diff --git a/tests/test_pagure_flask_api_pr_flag.py b/tests/test_pagure_flask_api_pr_flag.py index 2af91d9..20ff1fc 100644 --- a/tests/test_pagure_flask_api_pr_flag.py +++ b/tests/test_pagure_flask_api_pr_flag.py @@ -237,6 +237,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' pr_uid = data['flag']['pull_request_uid'] data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." @@ -246,6 +247,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): 'flag': { 'comment': 'Tests running', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': None, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'pending', @@ -304,6 +306,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." self.assertDictEqual( @@ -312,6 +315,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): 'flag': { 'comment': 'Tests running', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': None, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'pending', @@ -352,6 +356,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." self.assertDictEqual( @@ -360,6 +365,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): 'flag': { 'comment': 'Tests passed', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 100, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'success', @@ -405,6 +411,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." self.assertDictEqual( @@ -413,6 +420,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): 'flag': { 'comment': 'Tests passed', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 100, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'success', @@ -451,6 +459,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' self.assertNotEqual( data['uid'], 'jenkins_build_pagure_100+seed') @@ -462,6 +471,7 @@ class PagureFlaskApiPRFlagtests(tests.Modeltests): 'flag': { 'comment': 'Tests running again', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': None, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'pending', @@ -743,6 +753,7 @@ class PagureFlaskApiPRFlagUserTokentests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." self.assertDictEqual( @@ -751,6 +762,7 @@ class PagureFlaskApiPRFlagUserTokentests(tests.Modeltests): 'flag': { 'comment': 'Tests failed', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 0, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'failure', @@ -799,6 +811,7 @@ class PagureFlaskApiPRFlagUserTokentests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." self.assertDictEqual( @@ -807,6 +820,7 @@ class PagureFlaskApiPRFlagUserTokentests(tests.Modeltests): 'flag': { 'comment': 'Tests failed', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': None, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'failure', @@ -848,6 +862,7 @@ class PagureFlaskApiPRFlagUserTokentests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." self.assertDictEqual( @@ -856,6 +871,7 @@ class PagureFlaskApiPRFlagUserTokentests(tests.Modeltests): 'flag': { 'comment': 'Tests passed', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 100, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'success', @@ -1016,6 +1032,7 @@ class PagureFlaskApiGetPRFlagtests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flags'][0]['date_created'] = '1541413645' + data['flags'][0]['date_updated'] = '1541413645' data['flags'][0]['pull_request_uid'] = '72a61033c2fc464aa9ef514c057aa62c' self.assertDictEqual( data, @@ -1024,6 +1041,7 @@ class PagureFlaskApiGetPRFlagtests(tests.Modeltests): { 'comment': 'Build passes', 'date_created': '1541413645', + 'date_updated': '1541413645', 'percent': None, 'pull_request_uid': '72a61033c2fc464aa9ef514c057aa62c', 'status': 'success', @@ -1080,8 +1098,10 @@ class PagureFlaskApiGetPRFlagtests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flags'][0]['date_created'] = '1541413645' + data['flags'][0]['date_updated'] = '1541413645' data['flags'][0]['pull_request_uid'] = '72a61033c2fc464aa9ef514c057aa62c' data['flags'][1]['date_created'] = '1541413645' + data['flags'][1]['date_updated'] = '1541413645' data['flags'][1]['pull_request_uid'] = '72a61033c2fc464aa9ef514c057aa62c' self.assertDictEqual( data, @@ -1090,6 +1110,7 @@ class PagureFlaskApiGetPRFlagtests(tests.Modeltests): { 'comment': 'Build pending', 'date_created': '1541413645', + 'date_updated': '1541413645', 'percent': None, 'pull_request_uid': '72a61033c2fc464aa9ef514c057aa62c', 'status': 'pending', @@ -1100,6 +1121,7 @@ class PagureFlaskApiGetPRFlagtests(tests.Modeltests): { 'comment': 'Build passes', 'date_created': '1541413645', + 'date_updated': '1541413645', 'percent': None, 'pull_request_uid': '72a61033c2fc464aa9ef514c057aa62c', 'status': 'success', diff --git a/tests/test_pagure_flask_api_project.py b/tests/test_pagure_flask_api_project.py index 4b7ea28..16b5862 100644 --- a/tests/test_pagure_flask_api_project.py +++ b/tests/test_pagure_flask_api_project.py @@ -3024,12 +3024,14 @@ class PagureFlaskApiProjectFlagtests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['commit_hash'] = '62b49f00d489452994de5010565fab81' expected_output = { 'flag': { 'comment': 'Tests passed', 'commit_hash': '62b49f00d489452994de5010565fab81', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 100, 'status': 'success', 'url': 'http://jenkins.cloud.fedoraproject.org/', @@ -3073,12 +3075,14 @@ class PagureFlaskApiProjectFlagtests(tests.Modeltests): 'jenkins_build_pagure_100+seed' ) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['uid'] = 'b1de8f80defd4a81afe2e09f39678087' expected_output = { 'flag': { 'comment': 'Tests passed', 'commit_hash': commit.oid.hex, 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 100, 'status': 'success', 'url': 'http://jenkins.cloud.fedoraproject.org/', @@ -3129,12 +3133,14 @@ class PagureFlaskApiProjectFlagtests(tests.Modeltests): 'jenkins_build_pagure_100+seed' ) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['uid'] = 'b1de8f80defd4a81afe2e09f39678087' expected_output = { 'flag': { 'comment': 'Tests passed', 'commit_hash': commit.oid.hex, 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 100, 'status': 'success', 'url': 'http://jenkins.cloud.fedoraproject.org/', @@ -3259,6 +3265,7 @@ class PagureFlaskApiProjectFlagtests(tests.Modeltests): for f in data['flags']: f['date_created'] = '1510742565' + f['date_updated'] = '1510742565' f['commit_hash'] = '62b49f00d489452994de5010565fab81' expected_output = { "flags": [ @@ -3266,6 +3273,7 @@ class PagureFlaskApiProjectFlagtests(tests.Modeltests): "comment": "Build is running", "commit_hash": "62b49f00d489452994de5010565fab81", "date_created": "1510742565", + 'date_updated': '1510742565', "percent": None, "status": "pending", "url": "https://koji.fp.o/koji...", @@ -3279,6 +3287,7 @@ class PagureFlaskApiProjectFlagtests(tests.Modeltests): "comment": "Build succeeded", "commit_hash": "62b49f00d489452994de5010565fab81", "date_created": "1510742565", + 'date_updated': '1510742565', "percent": None, "status": "success", "url": "https://koji.fp.o/koji...", diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 0e4123e..c4511ad 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -1969,6 +1969,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." self.assertDictEqual( @@ -1977,6 +1978,7 @@ class PagurePrivateRepotest(tests.Modeltests): 'flag': { 'comment': 'Tests failed', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 0, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'failure', @@ -2016,6 +2018,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['flag']['date_created'] = '1510742565' + data['flag']['date_updated'] = '1510742565' data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81' data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." self.assertDictEqual( @@ -2024,6 +2027,7 @@ class PagurePrivateRepotest(tests.Modeltests): 'flag': { 'comment': 'Tests passed', 'date_created': '1510742565', + 'date_updated': '1510742565', 'percent': 100, 'pull_request_uid': '62b49f00d489452994de5010565fab81', 'status': 'success', From c01a85bb145e2dd8847d0f8ebf58a6317c349d76 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 15 2018 12:22:32 +0000 Subject: [PATCH 2/2] Show the update date/time rather than the creation one on flags However, when hovering over the time, it will show if the flag was created or updated at that time. Fixes https://pagure.io/pagure/issue/3987 Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/templates/commit.html b/pagure/templates/commit.html index 6f3149e..fed0887 100644 --- a/pagure/templates/commit.html +++ b/pagure/templates/commit.html @@ -238,8 +238,11 @@
{{ flag.comment }} -
- {{ flag.date_created | humanize }}
+
+ {{ flag.date_updated | humanize }}
diff --git a/pagure/templates/repo_pull_request.html b/pagure/templates/repo_pull_request.html index da8d9a2..3092dcc 100644 --- a/pagure/templates/repo_pull_request.html +++ b/pagure/templates/repo_pull_request.html @@ -574,8 +574,11 @@
{{ flag.comment }} -
- {{ flag.date_created | humanize }}
+
+ {{ flag.date_updated | humanize }}