added activity view

This commit is contained in:
2026-01-09 09:59:36 -08:00
parent c45e41b6a9
commit 55e37fbca8
168 changed files with 8799 additions and 2426 deletions

View File

@@ -0,0 +1,46 @@
"""create_jobs_table
Revision ID: 1e157f880117
Revises: bd21a0528865
Create Date: 2026-01-03 18:45:18.109625
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '1e157f880117'
down_revision: Union[str, None] = 'bd21a0528865'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('jobs',
sa.Column('id', sa.String(), nullable=False),
sa.Column('operation', sa.String(), nullable=False),
sa.Column('status', sa.String(), nullable=False),
sa.Column('start_time', sa.DateTime(timezone=True), nullable=False),
sa.Column('end_time', sa.DateTime(timezone=True), nullable=True),
sa.Column('progress', sa.Integer(), nullable=True),
sa.Column('message', sa.Text(), nullable=True),
sa.Column('result', sa.JSON(), nullable=True),
sa.Column('cancel_requested', sa.Boolean(), nullable=True),
sa.Column('paused', sa.Boolean(), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_jobs_id'), 'jobs', ['id'], unique=False)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_jobs_id'), table_name='jobs')
op.drop_table('jobs')
# ### end Alembic commands ###

View File

@@ -0,0 +1,32 @@
"""add bike setup to activity
Revision ID: 73e349ef1d88
Revises: 95af0e911216
Create Date: 2026-01-07 13:47:24.670293
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '73e349ef1d88'
down_revision: Union[str, None] = '95af0e911216'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('activities', sa.Column('bike_setup_id', sa.Integer(), nullable=True))
op.create_foreign_key(None, 'activities', 'bike_setups', ['bike_setup_id'], ['id'])
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'activities', type_='foreignkey')
op.drop_column('activities', 'bike_setup_id')
# ### end Alembic commands ###

View File

@@ -0,0 +1,53 @@
"""Add state tables
Revision ID: 85c60ed462bf
Revises: b5a6d7ef97a5
Create Date: 2026-01-01 17:01:04.348349
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '85c60ed462bf'
down_revision: Union[str, None] = 'b5a6d7ef97a5'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('garmin_activity_state',
sa.Column('garmin_activity_id', sa.String(), nullable=False),
sa.Column('activity_name', sa.String(), nullable=True),
sa.Column('activity_type', sa.String(), nullable=True),
sa.Column('start_time', sa.DateTime(), nullable=True),
sa.Column('sync_status', sa.String(), nullable=True),
sa.Column('last_seen', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
sa.PrimaryKeyConstraint('garmin_activity_id')
)
op.create_index(op.f('ix_garmin_activity_state_garmin_activity_id'), 'garmin_activity_state', ['garmin_activity_id'], unique=False)
op.create_table('health_sync_state',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('date', sa.Date(), nullable=False),
sa.Column('metric_type', sa.String(), nullable=False),
sa.Column('source', sa.String(), nullable=False),
sa.Column('sync_status', sa.String(), nullable=True),
sa.Column('last_seen', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('date', 'metric_type', 'source', name='uq_health_state')
)
op.create_index(op.f('ix_health_sync_state_id'), 'health_sync_state', ['id'], unique=False)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_health_sync_state_id'), table_name='health_sync_state')
op.drop_table('health_sync_state')
op.drop_index(op.f('ix_garmin_activity_state_garmin_activity_id'), table_name='garmin_activity_state')
op.drop_table('garmin_activity_state')
# ### end Alembic commands ###

View File

@@ -0,0 +1,41 @@
"""add bike setups table
Revision ID: 95af0e911216
Revises: 1e157f880117
Create Date: 2026-01-07 11:46:19.649500
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '95af0e911216'
down_revision: Union[str, None] = '1e157f880117'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('bike_setups',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('frame', sa.String(), nullable=False),
sa.Column('chainring', sa.Integer(), nullable=False),
sa.Column('rear_cog', sa.Integer(), nullable=False),
sa.Column('name', sa.String(), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_bike_setups_id'), 'bike_setups', ['id'], unique=False)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_bike_setups_id'), table_name='bike_setups')
op.drop_table('bike_setups')
# ### end Alembic commands ###

View File

@@ -0,0 +1,64 @@
"""expand_activity_schema_metrics
Revision ID: bd21a0528865
Revises: 85c60ed462bf
Create Date: 2026-01-01 22:53:14.358635
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = 'bd21a0528865'
down_revision: Union[str, None] = '85c60ed462bf'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('activities', sa.Column('distance', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('calories', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('avg_hr', sa.Integer(), nullable=True))
op.add_column('activities', sa.Column('max_hr', sa.Integer(), nullable=True))
op.add_column('activities', sa.Column('avg_speed', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('max_speed', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('elevation_gain', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('elevation_loss', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('avg_cadence', sa.Integer(), nullable=True))
op.add_column('activities', sa.Column('max_cadence', sa.Integer(), nullable=True))
op.add_column('activities', sa.Column('steps', sa.Integer(), nullable=True))
op.add_column('activities', sa.Column('aerobic_te', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('anaerobic_te', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('avg_power', sa.Integer(), nullable=True))
op.add_column('activities', sa.Column('max_power', sa.Integer(), nullable=True))
op.add_column('activities', sa.Column('norm_power', sa.Integer(), nullable=True))
op.add_column('activities', sa.Column('tss', sa.Float(), nullable=True))
op.add_column('activities', sa.Column('vo2_max', sa.Float(), nullable=True))
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('activities', 'vo2_max')
op.drop_column('activities', 'tss')
op.drop_column('activities', 'norm_power')
op.drop_column('activities', 'max_power')
op.drop_column('activities', 'avg_power')
op.drop_column('activities', 'anaerobic_te')
op.drop_column('activities', 'aerobic_te')
op.drop_column('activities', 'steps')
op.drop_column('activities', 'max_cadence')
op.drop_column('activities', 'avg_cadence')
op.drop_column('activities', 'elevation_loss')
op.drop_column('activities', 'elevation_gain')
op.drop_column('activities', 'max_speed')
op.drop_column('activities', 'avg_speed')
op.drop_column('activities', 'max_hr')
op.drop_column('activities', 'avg_hr')
op.drop_column('activities', 'calories')
op.drop_column('activities', 'distance')
# ### end Alembic commands ###