Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions alembic/versions/0b3973dab5df_fix_moving_duration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""fix moving_duration

Revision ID: 0b3973dab5df
Revises: 226de10ca77b
Create Date: 2026-07-03 15:28:05.025344

"""

from typing import Sequence, Union

import sqlalchemy as sa

from alembic import op
from verve_backend.core.config import settings

# revision identifiers, used by Alembic.
revision: str = "0b3973dab5df"
down_revision: Union[str, Sequence[str], None] = "226de10ca77b"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
schema = settings.POSTGRES_SCHEMA
conn = op.get_bind()
conn.execute(
sa.text(
f"UPDATE {schema}.activities "
"SET moving_duration = NULL "
"WHERE distance IS NULL AND moving_duration IS NOT NULL"
)
)
# ### end Alembic commands ###


def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
17 changes: 12 additions & 5 deletions verve_backend/api/common/utils.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import datetime
import math
import uuid
from typing import Type, TypeVar

Expand Down Expand Up @@ -78,17 +79,23 @@ def check_distance_requirement(
def update_activity_with_track(activity: Activity, track: Track) -> None:
logger.debug("Getting actuivity infos from track ")
overview = track.get_track_overview()
is_stationary = math.isclose(overview.total_distance, 0)
first_point_time = track.track.segments[0].points[0].time
if first_point_time:
activity.start = first_point_time
activity.distance = overview.total_distance_km
activity.distance = None if is_stationary else overview.total_distance_km
activity.duration = datetime.timedelta(days=0, seconds=overview.total_time_seconds)
activity.elevation_change_up = overview.uphill_elevation
activity.elevation_change_down = overview.downhill_elevation
activity.moving_duration = datetime.timedelta(
days=0, seconds=overview.moving_time_seconds
)
if overview.velocity_kmh:
if not is_stationary:
activity.moving_duration = datetime.timedelta(
days=0, seconds=overview.moving_time_seconds
)
else:
activity.moving_duration = None
activity.avg_speed = None
activity.max_speed = None
if overview.velocity_kmh and not is_stationary:
activity.avg_speed = overview.velocity_kmh.avg
activity.max_speed = overview.velocity_kmh.max
if overview.power:
Expand Down
10 changes: 8 additions & 2 deletions verve_backend/schema/importer.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import math
from datetime import datetime, timedelta
from typing import Any
from uuid import UUID
Expand Down Expand Up @@ -176,7 +177,12 @@ def convert_verve_file_to_activity(
or data.properties.moving_duration is None
):
overview = track.get_track_overview()
if data.properties.stats.speed is None and overview.velocity_kmh:
is_stationary = math.isclose(overview.total_distance, 0)
if (
data.properties.stats.speed is None
and overview.velocity_kmh
and not is_stationary
):
activity.avg_speed = overview.velocity_kmh.avg
activity.max_speed = overview.velocity_kmh.max
if data.properties.stats.power is None and overview.power:
Expand All @@ -188,7 +194,7 @@ def convert_verve_file_to_activity(
if data.properties.elevation_gain is None:
activity.elevation_change_up = overview.uphill_elevation
activity.elevation_change_down = overview.downhill_elevation
if data.properties.moving_duration is None:
if data.properties.moving_duration is None and not is_stationary:
activity.moving_duration = timedelta(
days=0, seconds=overview.moving_time_seconds
)
Expand Down