diff --git a/files/classes/follows.py b/files/classes/follows.py index 8bffa1e9d..54325c75d 100644 --- a/files/classes/follows.py +++ b/files/classes/follows.py @@ -1,8 +1,8 @@ from sqlalchemy import * from sqlalchemy.orm import relationship -from files.classes.base import CreatedBase +from files.classes.base import CreatedDateTimeBase -class Follow(CreatedBase): +class Follow(CreatedDateTimeBase): __tablename__ = "follows" target_id = Column(Integer, ForeignKey("users.id"), primary_key=True) user_id = Column(Integer, ForeignKey("users.id"), primary_key=True) diff --git a/files/routes/users.py b/files/routes/users.py index 88d1b3624..164273653 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -628,14 +628,14 @@ def redditor_moment_redirect(username:str): @auth_desired def followers(v, username): u = get_user(username, v=v) - users = g.db.query(User).join(Follow, Follow.target_id == u.id).filter(Follow.user_id == User.id).order_by(Follow.created_utc).all() + users = g.db.query(User).join(Follow, Follow.target_id == u.id).filter(Follow.user_id == User.id).order_by(Follow.created_datetimez).all() return render_template("followers.html", v=v, u=u, users=users) @app.get("/@/following") @auth_desired def following(v, username): u = get_user(username, v=v) - users = g.db.query(User).join(Follow, Follow.user_id == u.id).filter(Follow.target_id == User.id).order_by(Follow.created_utc).all() + users = g.db.query(User).join(Follow, Follow.user_id == u.id).filter(Follow.target_id == User.id).order_by(Follow.created_datetimez).all() return render_template("following.html", v=v, u=u, users=users) @app.get("/views") diff --git a/migrations/versions/2023_07_30_00_46_35_1ffc63ebd8bc_change_to_datetimez_table_follows.py b/migrations/versions/2023_07_30_00_46_35_1ffc63ebd8bc_change_to_datetimez_table_follows.py new file mode 100644 index 000000000..cd09cc7b7 --- /dev/null +++ b/migrations/versions/2023_07_30_00_46_35_1ffc63ebd8bc_change_to_datetimez_table_follows.py @@ -0,0 +1,53 @@ +"""Change to datetimez table follows + +Revision ID: 1ffc63ebd8bc +Revises: 7ae4658467d7 +Create Date: 2023-07-30 00:46:35.798549+00:00 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.sql.functions import now + + +# revision identifiers, used by Alembic. +revision = '1ffc63ebd8bc' +down_revision = 'bdb4b7a2e88b' +branch_labels = None +depends_on = None + +table_name = 'follows' +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)