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',