From bd909f394db5d58b1c3d339b670534527baa7570 Mon Sep 17 00:00:00 2001 From: Ben Rog-Wilhelm Date: Sat, 17 Jun 2023 04:06:02 -0500 Subject: [PATCH] Convert to timezone-aware datetime and properly port over DB contents. --- files/classes/comment.py | 2 +- files/classes/submission.py | 2 +- ...f4f36_move_deleted_utc_into_state_user_.py | 78 +++++++++++++++---- 3 files changed, 64 insertions(+), 18 deletions(-) diff --git a/files/classes/comment.py b/files/classes/comment.py index b2de17581..b844aaaa1 100644 --- a/files/classes/comment.py +++ b/files/classes/comment.py @@ -52,7 +52,7 @@ class Comment(CreatedBase): volunteer_janitor_badness = Column(Float, default=0.5, nullable=False) # Visibility states here - state_user_deleted_utc = Column(DateTime, nullable=True) # null if it hasn't been deleted by the user + state_user_deleted_utc = Column(DateTime(timezone=True), nullable=True) # null if it hasn't been deleted by the user # TBD: state_mod # TBD: state_mod_set_by # TBD: state_report diff --git a/files/classes/submission.py b/files/classes/submission.py index c3cc7f881..85738e0f6 100644 --- a/files/classes/submission.py +++ b/files/classes/submission.py @@ -53,7 +53,7 @@ class Submission(CreatedBase): task_id = Column(Integer, ForeignKey("tasks_repeatable_scheduled_submissions.id")) # Visibility states here - state_user_deleted_utc = Column(DateTime, nullable=True) # null if it hasn't been deleted by the user + state_user_deleted_utc = Column(DateTime(timezone=True), nullable=True) # null if it hasn't been deleted by the user # TBD: state_mod # TBD: state_mod_set_by # TBD: state_report diff --git a/migrations/versions/2023_06_11_09_09_00_8337558f4f36_move_deleted_utc_into_state_user_.py b/migrations/versions/2023_06_11_09_09_00_8337558f4f36_move_deleted_utc_into_state_user_.py index 6e89579e2..8510a9f9f 100644 --- a/migrations/versions/2023_06_11_09_09_00_8337558f4f36_move_deleted_utc_into_state_user_.py +++ b/migrations/versions/2023_06_11_09_09_00_8337558f4f36_move_deleted_utc_into_state_user_.py @@ -17,30 +17,76 @@ depends_on = None def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('comments', sa.Column('state_user_deleted_utc', sa.DateTime(), nullable=True)) - op.drop_column('comments', 'deleted_utc') - op.add_column('submissions', sa.Column('state_user_deleted_utc', sa.DateTime(), nullable=True)) + op.add_column('comments', sa.Column('state_user_deleted_utc', sa.DateTime(timezone=True), nullable=True)) + op.add_column('submissions', sa.Column('state_user_deleted_utc', sa.DateTime(timezone=True), nullable=True)) + op.drop_index('subimssion_binary_group_idx', table_name='submissions') - op.create_index('subimssion_binary_group_idx', 'submissions', ['is_banned', 'state_user_deleted_utc', 'over_18'], unique=False) op.drop_index('submission_isdeleted_idx', table_name='submissions') - op.create_index('submission_isdeleted_idx', 'submissions', ['state_user_deleted_utc'], unique=False) op.drop_index('submission_new_sort_idx', table_name='submissions') - op.create_index('submission_new_sort_idx', 'submissions', ['is_banned', 'state_user_deleted_utc', sa.text('created_utc DESC'), 'over_18'], unique=False) + + op.execute(""" + UPDATE comments + SET state_user_deleted_utc = + CASE + WHEN deleted_utc > 0 THEN + (timestamp 'epoch' + deleted_utc * interval '1 second') at time zone 'utc' + ELSE NULL + END + """) + + op.execute(""" + UPDATE submissions + SET state_user_deleted_utc = + CASE + WHEN deleted_utc > 0 THEN + (timestamp 'epoch' + deleted_utc * interval '1 second') at time zone 'utc' + ELSE NULL + END + """) + + op.drop_column('comments', 'deleted_utc') op.drop_column('submissions', 'deleted_utc') - # ### end Alembic commands ### + + op.create_index('subimssion_binary_group_idx', 'submissions', ['is_banned', 'state_user_deleted_utc', 'over_18'], unique=False) + op.create_index('submission_isdeleted_idx', 'submissions', ['state_user_deleted_utc'], unique=False) + op.create_index('submission_new_sort_idx', 'submissions', ['is_banned', 'state_user_deleted_utc', sa.text('created_utc DESC'), 'over_18'], unique=False) + + def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('submissions', sa.Column('deleted_utc', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=False)) + op.add_column('comments', sa.Column('deleted_utc', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=True)) + op.add_column('submissions', sa.Column('deleted_utc', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=True)) + op.drop_index('submission_new_sort_idx', table_name='submissions') - op.create_index('submission_new_sort_idx', 'submissions', ['is_banned', 'deleted_utc', 'created_utc', 'over_18'], unique=False) op.drop_index('submission_isdeleted_idx', table_name='submissions') - op.create_index('submission_isdeleted_idx', 'submissions', ['deleted_utc'], unique=False) op.drop_index('subimssion_binary_group_idx', table_name='submissions') - op.create_index('subimssion_binary_group_idx', 'submissions', ['is_banned', 'deleted_utc', 'over_18'], unique=False) - op.drop_column('submissions', 'state_user_deleted_utc') - op.add_column('comments', sa.Column('deleted_utc', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=False)) + + op.execute(""" + UPDATE comments + SET deleted_utc = + COALESCE( + EXTRACT(EPOCH FROM state_user_deleted_utc)::integer, + 0 + ) + """) + + op.execute(""" + UPDATE submissions + SET deleted_utc = + COALESCE( + EXTRACT(EPOCH FROM state_user_deleted_utc)::integer, + 0 + ) + """) + + op.alter_column('comments', 'deleted_utc', nullable=False) + op.alter_column('submissions', 'deleted_utc', nullable=False) + op.drop_column('comments', 'state_user_deleted_utc') - # ### end Alembic commands ### + op.drop_column('submissions', 'state_user_deleted_utc') + + op.create_index('submission_new_sort_idx', 'submissions', ['is_banned', 'deleted_utc', 'created_utc', 'over_18'], unique=False) + op.create_index('submission_isdeleted_idx', 'submissions', ['deleted_utc'], unique=False) + op.create_index('subimssion_binary_group_idx', 'submissions', ['is_banned', 'deleted_utc', 'over_18'], unique=False) +