From 038d1cc004d83beda6ae9bd06308139bfb9102cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20K=C3=B6pf?= Date: Thu, 19 Jan 2023 22:07:08 +0100 Subject: [PATCH] last_uddated for user_stats, swtich to timestamptz --- ...f0a28a156f4_switch_to_timestamp_with_tz.py | 47 +++++++++++++++++++ backend/oasst_backend/models/journal.py | 2 +- backend/oasst_backend/models/message.py | 4 +- .../oasst_backend/models/message_embedding.py | 2 +- .../oasst_backend/models/message_reaction.py | 4 +- .../oasst_backend/models/message_toxicity.py | 2 +- backend/oasst_backend/models/task.py | 4 +- backend/oasst_backend/models/text_labels.py | 4 +- backend/oasst_backend/models/user.py | 2 +- backend/oasst_backend/models/user_stats.py | 4 +- .../oasst_backend/user_stats_repository.py | 6 ++- oasst-shared/oasst_shared/schemas/protocol.py | 1 + 12 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 backend/alembic/versions/2023_01_19_2153-7f0a28a156f4_switch_to_timestamp_with_tz.py diff --git a/backend/alembic/versions/2023_01_19_2153-7f0a28a156f4_switch_to_timestamp_with_tz.py b/backend/alembic/versions/2023_01_19_2153-7f0a28a156f4_switch_to_timestamp_with_tz.py new file mode 100644 index 00000000..d3096b2f --- /dev/null +++ b/backend/alembic/versions/2023_01_19_2153-7f0a28a156f4_switch_to_timestamp_with_tz.py @@ -0,0 +1,47 @@ +"""switch to timestamp with tz + +Revision ID: 7f0a28a156f4 +Revises: 0964ac95170d +Create Date: 2023-01-19 21:53:01.107137 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "7f0a28a156f4" +down_revision = "0964ac95170d" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column(table_name="user_stats", column_name="modified_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="user_stats", column_name="base_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="journal_integration", column_name="last_run", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="message_embedding", column_name="created_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="message_reaction", column_name="created_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="message_toxicity", column_name="created_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="message", column_name="created_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="task", column_name="created_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="task", column_name="expiry_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="text_labels", column_name="created_date", type_=sa.DateTime(timezone=True)) + op.alter_column(table_name="user", column_name="created_date", type_=sa.DateTime(timezone=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column(table_name="user_stats", column_name="modified_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="user_stats", column_name="base_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="journal_integration", column_name="last_run", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="message_embedding", column_name="created_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="message_reaction", column_name="created_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="message_toxicity", column_name="created_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="message", column_name="created_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="task", column_name="created_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="task", column_name="expiry_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="text_labels", column_name="created_date", type_=sa.DateTime(timezone=False)) + op.alter_column(table_name="user", column_name="created_date", type_=sa.DateTime(timezone=False)) + # ### end Alembic commands ### diff --git a/backend/oasst_backend/models/journal.py b/backend/oasst_backend/models/journal.py index b5000add..46a72bdd 100644 --- a/backend/oasst_backend/models/journal.py +++ b/backend/oasst_backend/models/journal.py @@ -50,6 +50,6 @@ class JournalIntegration(SQLModel, table=True): ) description: str = Field(max_length=512, primary_key=True) last_journal_id: Optional[UUID] = Field(foreign_key="journal.id", nullable=True) - last_run: Optional[datetime] = Field(sa_column=sa.Column(sa.DateTime(), nullable=True)) + last_run: Optional[datetime] = Field(sa_column=sa.Column(sa.DateTime(timezone=True), nullable=True)) last_error: Optional[str] = Field(nullable=True) next_run: Optional[datetime] = Field(nullable=True) diff --git a/backend/oasst_backend/models/message.py b/backend/oasst_backend/models/message.py index 7c8b9f13..b03c8534 100644 --- a/backend/oasst_backend/models/message.py +++ b/backend/oasst_backend/models/message.py @@ -30,7 +30,9 @@ class Message(SQLModel, table=True): api_client_id: UUID = Field(nullable=False, foreign_key="api_client.id") frontend_message_id: str = Field(max_length=200, nullable=False) created_date: Optional[datetime] = Field( - sa_column=sa.Column(sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp(), index=True) + sa_column=sa.Column( + sa.DateTime(timezone=True), nullable=False, server_default=sa.func.current_timestamp(), index=True + ) ) payload_type: str = Field(nullable=False, max_length=200) payload: Optional[PayloadContainer] = Field( diff --git a/backend/oasst_backend/models/message_embedding.py b/backend/oasst_backend/models/message_embedding.py index 74da5004..e75f5398 100644 --- a/backend/oasst_backend/models/message_embedding.py +++ b/backend/oasst_backend/models/message_embedding.py @@ -17,5 +17,5 @@ class MessageEmbedding(SQLModel, table=True): # In the case that the Message Embedding is created afterwards created_date: Optional[datetime] = Field( - sa_column=sa.Column(sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()) + sa_column=sa.Column(sa.DateTime(timezone=True), nullable=False, server_default=sa.func.current_timestamp()) ) diff --git a/backend/oasst_backend/models/message_reaction.py b/backend/oasst_backend/models/message_reaction.py index 74e21a61..4c50143e 100644 --- a/backend/oasst_backend/models/message_reaction.py +++ b/backend/oasst_backend/models/message_reaction.py @@ -19,7 +19,9 @@ class MessageReaction(SQLModel, table=True): sa_column=sa.Column(pg.UUID(as_uuid=True), sa.ForeignKey("user.id"), nullable=False, primary_key=True) ) created_date: Optional[datetime] = Field( - sa_column=sa.Column(sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp(), index=True) + sa_column=sa.Column( + sa.DateTime(timezone=True), nullable=False, server_default=sa.func.current_timestamp(), index=True + ) ) payload_type: str = Field(nullable=False, max_length=200) payload: PayloadContainer = Field(sa_column=sa.Column(payload_column_type(PayloadContainer), nullable=False)) diff --git a/backend/oasst_backend/models/message_toxicity.py b/backend/oasst_backend/models/message_toxicity.py index 8a78e2dc..f8eb787b 100644 --- a/backend/oasst_backend/models/message_toxicity.py +++ b/backend/oasst_backend/models/message_toxicity.py @@ -20,5 +20,5 @@ class MessageToxicity(SQLModel, table=True): # In the case that the Message Embedding is created afterwards created_date: Optional[datetime] = Field( - sa_column=sa.Column(sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()) + sa_column=sa.Column(sa.DateTime(timezone=True), nullable=False, server_default=sa.func.current_timestamp()) ) diff --git a/backend/oasst_backend/models/task.py b/backend/oasst_backend/models/task.py index 5d0d7e73..a59f689e 100644 --- a/backend/oasst_backend/models/task.py +++ b/backend/oasst_backend/models/task.py @@ -20,9 +20,9 @@ class Task(SQLModel, table=True): ), ) created_date: Optional[datetime] = Field( - sa_column=sa.Column(sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()), + sa_column=sa.Column(sa.DateTime(timezone=True), nullable=False, server_default=sa.func.current_timestamp()), ) - expiry_date: Optional[datetime] = Field(sa_column=sa.Column(sa.DateTime(), nullable=True)) + expiry_date: Optional[datetime] = Field(sa_column=sa.Column(sa.DateTime(timezone=True), nullable=True)) user_id: Optional[UUID] = Field(nullable=True, foreign_key="user.id", index=True) payload_type: str = Field(nullable=False, max_length=200) payload: PayloadContainer = Field(sa_column=sa.Column(payload_column_type(PayloadContainer), nullable=False)) diff --git a/backend/oasst_backend/models/text_labels.py b/backend/oasst_backend/models/text_labels.py index 34831d6b..1d238ef2 100644 --- a/backend/oasst_backend/models/text_labels.py +++ b/backend/oasst_backend/models/text_labels.py @@ -17,7 +17,9 @@ class TextLabels(SQLModel, table=True): ) user_id: UUID = Field(sa_column=sa.Column(pg.UUID(as_uuid=True), sa.ForeignKey("user.id"), nullable=False)) created_date: Optional[datetime] = Field( - sa_column=sa.Column(sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp(), index=True), + sa_column=sa.Column( + sa.DateTime(timezone=True), nullable=False, server_default=sa.func.current_timestamp(), index=True + ), ) api_client_id: UUID = Field(nullable=False, foreign_key="api_client.id") text: str = Field(nullable=False, max_length=2**16) diff --git a/backend/oasst_backend/models/user.py b/backend/oasst_backend/models/user.py index 7ce914c6..0fb36c22 100644 --- a/backend/oasst_backend/models/user.py +++ b/backend/oasst_backend/models/user.py @@ -21,7 +21,7 @@ class User(SQLModel, table=True): auth_method: str = Field(nullable=False, max_length=128, default="local") display_name: str = Field(nullable=False, max_length=256) created_date: Optional[datetime] = Field( - sa_column=sa.Column(sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()) + sa_column=sa.Column(sa.DateTime(timezone=True), nullable=False, server_default=sa.func.current_timestamp()) ) api_client_id: UUID = Field(foreign_key="api_client.id") enabled: bool = Field(sa_column=sa.Column(sa.Boolean, nullable=False, server_default=sa.true())) diff --git a/backend/oasst_backend/models/user_stats.py b/backend/oasst_backend/models/user_stats.py index 5ba9dcdb..e8f5b450 100644 --- a/backend/oasst_backend/models/user_stats.py +++ b/backend/oasst_backend/models/user_stats.py @@ -26,11 +26,11 @@ class UserStats(SQLModel, table=True): user_id: Optional[UUID] = Field( sa_column=sa.Column(pg.UUID(as_uuid=True), sa.ForeignKey("user.id"), primary_key=True) ) - base_date: Optional[datetime] = Field(sa_column=sa.Column(sa.DateTime(), nullable=True)) + base_date: Optional[datetime] = Field(sa_column=sa.Column(sa.DateTime(timezone=True), nullable=True)) leader_score: int = 0 modified_date: Optional[datetime] = Field( - sa_column=sa.Column(sa.DateTime(), nullable=False, server_default=sa.func.current_timestamp()) + sa_column=sa.Column(sa.DateTime(timezone=True), nullable=False, server_default=sa.func.current_timestamp()) ) rank: int = Field(nullable=True) diff --git a/backend/oasst_backend/user_stats_repository.py b/backend/oasst_backend/user_stats_repository.py index 02cc28f4..8b0c17f0 100644 --- a/backend/oasst_backend/user_stats_repository.py +++ b/backend/oasst_backend/user_stats_repository.py @@ -45,7 +45,11 @@ class UserStatsRepository: ) leaderboard = [_create_user_score(r) for r in self.session.exec(qry)] - return LeaderboardStats(time_frame=time_frame.value, leaderboard=leaderboard) + if len(leaderboard) > 0: + last_update = max(x.modified_date for x in leaderboard) + else: + last_update = utcnow() + return LeaderboardStats(time_frame=time_frame.value, leaderboard=leaderboard, last_updated=last_update) def get_user_stats_all_time_frames(self, user_id: UUID) -> dict[str, UserScore | None]: qry = ( diff --git a/oasst-shared/oasst_shared/schemas/protocol.py b/oasst-shared/oasst_shared/schemas/protocol.py index 006a6026..388bd0d6 100644 --- a/oasst-shared/oasst_shared/schemas/protocol.py +++ b/oasst-shared/oasst_shared/schemas/protocol.py @@ -392,6 +392,7 @@ class UserScore(BaseModel): class LeaderboardStats(BaseModel): time_frame: str + last_updated: datetime leaderboard: List[UserScore]