From 34b328583ca908052079c1ab5a1ba77589ea8cd5 Mon Sep 17 00:00:00 2001 From: Viet Than Date: Wed, 2 Aug 2023 17:37:38 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=A6=20Database=20Change:=20convert=20c?= =?UTF-8?q?reated=20utc=20to=20datetimez=20for=20modactions=20(#667)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/classes/mod_logs.py | 4 +- files/routes/admin/admin.py | 10 ++-- ...a8_change_to_datetimez_table_modactions.py | 52 +++++++++++++++++++ 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 migrations/versions/2023_07_30_01_08_22_84e02ade75a8_change_to_datetimez_table_modactions.py diff --git a/files/classes/mod_logs.py b/files/classes/mod_logs.py index 245bb98fc..f9e23a68b 100644 --- a/files/classes/mod_logs.py +++ b/files/classes/mod_logs.py @@ -4,12 +4,12 @@ from copy import deepcopy from sqlalchemy import * from sqlalchemy.orm import relationship -from files.classes.base import CreatedBase +from files.classes.base import CreatedDateTimeBase from files.helpers.config.const import * from files.helpers.lazy import lazy -class ModAction(CreatedBase): +class ModAction(CreatedDateTimeBase): __tablename__ = "modactions" id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey("users.id")) diff --git a/files/routes/admin/admin.py b/files/routes/admin/admin.py index 8fc7d3074..1dcca6815 100644 --- a/files/routes/admin/admin.py +++ b/files/routes/admin/admin.py @@ -1,6 +1,6 @@ import json import time -from datetime import datetime +from datetime import datetime, timedelta, timezone import requests @@ -128,12 +128,12 @@ def revert_actions(v, username): ) g.db.add(ma) - cutoff = int(time.time()) - 86400 + cutoff = datetime.now(tz=timezone.utc) - timedelta(1) - posts = [x[0] for x in g.db.query(ModAction.target_submission_id).filter(ModAction.user_id == user.id, ModAction.created_utc > cutoff, ModAction.kind == 'remove_post').all()] + posts = [x[0] for x in g.db.query(ModAction.target_submission_id).filter(ModAction.user_id == user.id, ModAction.created_datetimez > cutoff, ModAction.kind == 'remove_post').all()] posts = g.db.query(Submission).filter(Submission.id.in_(posts)).all() - comments = [x[0] for x in g.db.query(ModAction.target_comment_id).filter(ModAction.user_id == user.id, ModAction.created_utc > cutoff, ModAction.kind == 'remove_comment').all()] + comments = [x[0] for x in g.db.query(ModAction.target_comment_id).filter(ModAction.user_id == user.id, ModAction.created_datetimez > cutoff, ModAction.kind == 'remove_comment').all()] comments = g.db.query(Comment).filter(Comment.id.in_(comments)).all() for item in posts + comments: @@ -141,7 +141,7 @@ def revert_actions(v, username): item.state_mod_set_by = v.username g.db.add(item) - users = (x[0] for x in g.db.query(ModAction.target_user_id).filter(ModAction.user_id == user.id, ModAction.created_utc > cutoff, ModAction.kind.in_(('shadowban', 'ban_user'))).all()) + users = (x[0] for x in g.db.query(ModAction.target_user_id).filter(ModAction.user_id == user.id, ModAction.created_datetimez > cutoff, ModAction.kind.in_(('shadowban', 'ban_user'))).all()) users = g.db.query(User).filter(User.id.in_(users)).all() for user in users: diff --git a/migrations/versions/2023_07_30_01_08_22_84e02ade75a8_change_to_datetimez_table_modactions.py b/migrations/versions/2023_07_30_01_08_22_84e02ade75a8_change_to_datetimez_table_modactions.py new file mode 100644 index 000000000..9fcc6142f --- /dev/null +++ b/migrations/versions/2023_07_30_01_08_22_84e02ade75a8_change_to_datetimez_table_modactions.py @@ -0,0 +1,52 @@ +"""Change to datetimez table modactions + +Revision ID: 84e02ade75a8 +Revises: 1ffc63ebd8bc +Create Date: 2023-07-30 01:08:22.348150+00:00 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.sql.functions import now + + +# revision identifiers, used by Alembic. +revision = '84e02ade75a8' +down_revision = '1ffc63ebd8bc' +branch_labels = None +depends_on = None + +table_name = 'modactions' +from_column = 'created_utc' +to_column = 'created_datetimez' + +def upgrade(): + op.add_column(table_name, sa.Column(to_column, sa.DateTime(timezone=True), nullable=True, server_default=now())) + op.execute(f""" + UPDATE {table_name} + SET {to_column} = + CASE + WHEN {from_column} > 0 THEN + (timestamp 'epoch' + {from_column} * interval '1 second') at time zone 'utc' + ELSE NULL + END + """) + op.alter_column(table_name, to_column, nullable=False) + op.drop_column(table_name, from_column) + + +def downgrade(): + """ + Downgrade will truncate the milliseconds. + """ + op.add_column(table_name, sa.Column('created_utc', sa.Integer(), server_default=sa.text('0'), nullable=True)) + op.execute(f""" + UPDATE {table_name} + SET created_utc = + COALESCE( + EXTRACT(EPOCH FROM {to_column})::integer, + 0 + ) + """) + op.alter_column(table_name, from_column, nullable=False) + op.drop_column(table_name, to_column)