Skip to content

Commit

Permalink
Add timezone info to timestamp columns
Browse files Browse the repository at this point in the history
  • Loading branch information
sultanofcardio committed Jun 5, 2024
1 parent 58c7182 commit 25f3851
Show file tree
Hide file tree
Showing 6 changed files with 245 additions and 3 deletions.
6 changes: 4 additions & 2 deletions src/apps/answers/tests/test_answers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1022,7 +1022,9 @@ async def test_get_activity_identifiers(
assert response.json()["count"] == 1
assert response.json()["result"][0]["identifier"] == answer_create.answer.identifier
assert response.json()["result"][0]["userPublicKey"] == answer_create.answer.user_public_key
assert datetime.datetime.fromisoformat(response.json()["result"][0]["lastAnswerDate"]) == created_at
assert datetime.datetime.fromisoformat(response.json()["result"][0]["lastAnswerDate"]) == created_at.replace(
tzinfo=datetime.timezone.utc
)

async def test_get_flow_identifiers(
self,
Expand Down Expand Up @@ -1689,7 +1691,7 @@ async def test_flow_submission(self, client, tom: User, applet_with_flow: Applet
assert data["flow"]["idVersion"] == tom_answer_activity_flow.flow_history_id

assert set(data["summary"].keys()) == {"identifier", "endDatetime", "version", "createdAt"}
assert data["summary"]["createdAt"] == tom_answer_activity_flow.created_at.strftime("%Y-%m-%dT%H:%M:%S.%f")
assert data["summary"]["createdAt"] == tom_answer_activity_flow.created_at.strftime("%Y-%m-%dT%H:%M:%S.%f+00:00")
assert data["summary"]["version"] == tom_answer_activity_flow.version

assert set(data["summary"]["identifier"]) == {"lastAnswerDate", "identifier", "userPublicKey"}
Expand Down
2 changes: 1 addition & 1 deletion src/apps/answers/tests/test_answers_arbitrary.py
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,7 @@ async def test_get_identifiers(
assert response.json()["count"] == 1
assert response.json()["result"][0]["identifier"] == answer_create.answer.identifier
assert response.json()["result"][0]["userPublicKey"] == answer_create.answer.user_public_key
assert datetime.datetime.fromisoformat(response.json()["result"][0]["lastAnswerDate"]) == created_at
assert datetime.datetime.fromisoformat(response.json()["result"][0]["lastAnswerDate"]) == created_at.replace(tzinfo=datetime.timezone.utc)

async def test_get_all_activity_versions_for_applet(
self, arbitrary_client: TestClient, tom: User, applet: AppletFull
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
"""Add timezone to datetime fields
Revision ID: 8095e19c1e8b
Revises: f099d463803a
Create Date: 2024-06-05 03:43:10.878950
"""
import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision = '8095e19c1e8b'
down_revision = 'f099d463803a'
branch_labels = None
depends_on = None

# Tables with `created_at` and `updated_at` columns
general_tables = [
'activities',
'activity_events',
'activity_histories',
'activity_item_histories',
'activity_items',
'alerts',
'answer_notes',
'answers',
'answers_items',
'applet_histories',
'applets',
'cart',
'events',
'flow_events',
'flow_histories',
'flow_item_histories',
'flow_items',
'flows',
'folder_applets',
'folders',
'invitations',
'jobs',
'library',
'notification_logs',
'notifications',
'periodicity',
'reminders',
'reusable_item_choices',
'subject_relations',
'subjects',
'themes',
'token_blacklist',
'transfer_ownership',
'user_applet_accesses',
'user_devices',
'user_events',
'user_pins',
'users',
'users_workspaces'
]

# Tables with other datetime columns
specific_tables_and_columns = [
('applets', [('pinned_at', False)]),
('token_blacklist', [('exp', False)]),
('folder_applets', [('pinned_at', False)]),
('users', [('last_seen_at', False)]),
]


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
for table_name in general_tables:
op.alter_column(
table_name,
'created_at',
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=False
)
op.alter_column(
table_name,
'updated_at',
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=False
)
op.alter_column(
table_name,
'migrated_date',
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=True
)
op.alter_column(
table_name,
'migrated_updated',
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=True
)

for table_name, column_names_and_nullability in specific_tables_and_columns:
for column_name, nullable in column_names_and_nullability:
op.alter_column(
table_name,
column_name,
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=nullable
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
for table_name in general_tables:
op.alter_column(
table_name,
'created_at',
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=False
)
op.alter_column(
table_name,
'updated_at',
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=False
)
op.alter_column(
table_name,
'migrated_date',
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=True
)
op.alter_column(
table_name,
'migrated_updated',
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=True
)

for table_name, column_names_and_nullability in specific_tables_and_columns:
for column_name, nullable in column_names_and_nullability:
op.alter_column(
table_name,
column_name,
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=nullable
)
# ### end Alembic commands ###
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
"""Add timezone to datetime fields in arbitrary database
Revision ID: 8095e19c1e8b
Revises: f099d463803a
Create Date: 2024-06-05 03:43:10.878950
"""
import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision = '8095e19c1e8b'
down_revision = '267dd5b56abf'
branch_labels = None
depends_on = None

# Tables with `created_at` and `updated_at` columns
general_tables = ['answers', 'answers_items']


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
for table_name in general_tables:
op.alter_column(
table_name,
'created_at',
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=False
)
op.alter_column(
table_name,
'updated_at',
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=False
)
op.alter_column(
table_name,
'migrated_date',
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=True
)
op.alter_column(
table_name,
'migrated_updated',
existing_type=sa.DateTime(),
type_=sa.DateTime(timezone=True),
existing_nullable=True
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
for table_name in general_tables:
op.alter_column(
table_name,
'created_at',
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=False
)
op.alter_column(
table_name,
'updated_at',
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=False
)
op.alter_column(
table_name,
'migrated_date',
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=True
)
op.alter_column(
table_name,
'migrated_updated',
existing_type=sa.DateTime(timezone=True),
type_=sa.DateTime(),
existing_nullable=True
)
# ### end Alembic commands ###
Empty file.

0 comments on commit 25f3851

Please sign in to comment.