Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add workout description #623

Merged
merged 6 commits into from
Sep 8, 2024
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
4 changes: 2 additions & 2 deletions fittrackee/dist/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
<link rel="stylesheet" href="/static/css/fork-awesome.min.css"/>
<link rel="stylesheet" href="/static/css/leaflet.css"/>
<title>FitTrackee</title>
<script type="module" crossorigin src="/static/index-DW93bXec.js"></script>
<script type="module" crossorigin src="/static/index-G_tff9EL.js"></script>
<link rel="modulepreload" crossorigin href="/static/charts-lWJH0bM4.js">
<link rel="modulepreload" crossorigin href="/static/maps-BFpqWvfo.js">
<link rel="stylesheet" crossorigin href="/static/css/maps-HupOsEJb.css">
<link rel="stylesheet" crossorigin href="/static/css/index-G8D53qSs.css">
<link rel="stylesheet" crossorigin href="/static/css/index-x-giI9Hy.css">
</head>
<body>
<div id="app"></div>
Expand Down
1 change: 0 additions & 1 deletion fittrackee/dist/static/css/index-G8D53qSs.css

This file was deleted.

1 change: 1 addition & 0 deletions fittrackee/dist/static/css/index-x-giI9Hy.css

Large diffs are not rendered by default.

659 changes: 0 additions & 659 deletions fittrackee/dist/static/index-DW93bXec.js

This file was deleted.

659 changes: 659 additions & 0 deletions fittrackee/dist/static/index-G_tff9EL.js

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""add workout description

Revision ID: 6988082918f8
Revises: c9c6a5a4dd6d
Create Date: 2024-09-07 20:02:56.341637

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '6988082918f8'
down_revision = 'c9c6a5a4dd6d'
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('workouts', schema=None) as batch_op:
batch_op.add_column(sa.Column('description', sa.String(length=10000), nullable=True))

# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('workouts', schema=None) as batch_op:
batch_op.drop_column('description')

# ### end Alembic commands ###
124 changes: 123 additions & 1 deletion fittrackee/tests/fixtures/fixtures_workouts.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,16 @@
from werkzeug.datastructures import FileStorage

from fittrackee import db
from fittrackee.workouts.models import Sport, Workout, WorkoutSegment
from fittrackee.workouts.models import (
TITLE_MAX_CHARACTERS,
Sport,
Workout,
WorkoutSegment,
)
from fittrackee.workouts.utils.maps import StaticMap

from ..utils import random_string

byte_io = BytesIO()
Image.new('RGB', (256, 256)).save(byte_io, 'PNG')
byte_image = byte_io.getvalue()
Expand Down Expand Up @@ -703,6 +710,121 @@ def gpx_file_without_elevation() -> str:
)


@pytest.fixture()
def gpx_file_w_title_exceeding_limit() -> str:
return (
'<?xml version=\'1.0\' encoding=\'UTF-8\'?>'
'<gpx xmlns:gpxdata="http://www.cluetrust.com/XML/GPXDATA/1/0" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxext="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns="http://www.topografix.com/GPX/1/1">' # noqa
' <metadata/>'
' <trk>'
f' <name>{random_string(TITLE_MAX_CHARACTERS + 1)}</name>'
' <trkseg>'
' <trkpt lat="44.68095" lon="6.07367">'
' <ele>998</ele>'
' <time>2018-03-13T12:44:45Z</time>'
' </trkpt>'
' <trkpt lat="44.68091" lon="6.07367">'
' <ele>998</ele>'
' <time>2018-03-13T12:44:50Z</time>'
' </trkpt>'
' <trkpt lat="44.6808" lon="6.07364">'
' <ele>994</ele>'
' <time>2018-03-13T12:45:00Z</time>'
' </trkpt>'
' <trkpt lat="44.68075" lon="6.07364">'
' <ele>994</ele>'
' <time>2018-03-13T12:45:05Z</time>'
' </trkpt>'
' <trkpt lat="44.68071" lon="6.07364">'
' <ele>994</ele>'
' <time>2018-03-13T12:45:10Z</time>'
' </trkpt>'
' <trkpt lat="44.68049" lon="6.07361">'
' <ele>993</ele>'
' <time>2018-03-13T12:45:30Z</time>'
' </trkpt>'
' <trkpt lat="44.68019" lon="6.07356">'
' <ele>992</ele>'
' <time>2018-03-13T12:45:55Z</time>'
' </trkpt>'
' <trkpt lat="44.68014" lon="6.07355">'
' <ele>992</ele>'
' <time>2018-03-13T12:46:00Z</time>'
' </trkpt>'
' <trkpt lat="44.67995" lon="6.07358">'
' <ele>987</ele>'
' <time>2018-03-13T12:46:15Z</time>'
' </trkpt>'
' <trkpt lat="44.67977" lon="6.07364">'
' <ele>987</ele>'
' <time>2018-03-13T12:46:30Z</time>'
' </trkpt>'
' <trkpt lat="44.67972" lon="6.07367">'
' <ele>987</ele>'
' <time>2018-03-13T12:46:35Z</time>'
' </trkpt>'
' <trkpt lat="44.67966" lon="6.07368">'
' <ele>987</ele>'
' <time>2018-03-13T12:46:40Z</time>'
' </trkpt>'
' <trkpt lat="44.67961" lon="6.0737">'
' <ele>986</ele>'
' <time>2018-03-13T12:46:45Z</time>'
' </trkpt>'
' <trkpt lat="44.67938" lon="6.07377">'
' <ele>986</ele>'
' <time>2018-03-13T12:47:05Z</time>'
' </trkpt>'
' <trkpt lat="44.67933" lon="6.07381">'
' <ele>986</ele>'
' <time>2018-03-13T12:47:10Z</time>'
' </trkpt>'
' <trkpt lat="44.67922" lon="6.07385">'
' <ele>985</ele>'
' <time>2018-03-13T12:47:20Z</time>'
' </trkpt>'
' <trkpt lat="44.67911" lon="6.0739">'
' <ele>980</ele>'
' <time>2018-03-13T12:47:30Z</time>'
' </trkpt>'
' <trkpt lat="44.679" lon="6.07399">'
' <ele>980</ele>'
' <time>2018-03-13T12:47:40Z</time>'
' </trkpt>'
' <trkpt lat="44.67896" lon="6.07402">'
' <ele>980</ele>'
' <time>2018-03-13T12:47:45Z</time>'
' </trkpt>'
' <trkpt lat="44.67884" lon="6.07408">'
' <ele>979</ele>'
' <time>2018-03-13T12:47:55Z</time>'
' </trkpt>'
' <trkpt lat="44.67863" lon="6.07423">'
' <ele>981</ele>'
' <time>2018-03-13T12:48:15Z</time>'
' </trkpt>'
' <trkpt lat="44.67858" lon="6.07425">'
' <ele>980</ele>'
' <time>2018-03-13T12:48:20Z</time>'
' </trkpt>'
' <trkpt lat="44.67842" lon="6.07434">'
' <ele>979</ele>'
' <time>2018-03-13T12:48:35Z</time>'
' </trkpt>'
' <trkpt lat="44.67837" lon="6.07435">'
' <ele>979</ele>'
' <time>2018-03-13T12:48:40Z</time>'
' </trkpt>'
' <trkpt lat="44.67822" lon="6.07442">'
' <ele>975</ele>'
' <time>2018-03-13T12:48:55Z</time>'
' </trkpt>'
' </trkseg>'
' </trk>'
'</gpx>'
)


@pytest.fixture()
def gpx_file_wo_track() -> str:
return (
Expand Down
2 changes: 2 additions & 0 deletions fittrackee/tests/users/test_users_export_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ def test_it_returns_data_for_workout_without_gpx(
'weather_end': None,
'notes': workout_cycling_user_1.notes,
'equipments': [],
'description': None,
}
]

Expand Down Expand Up @@ -125,6 +126,7 @@ def test_it_returns_data_for_workout_with_gpx(
'weather_end': None,
'notes': workout.notes,
'equipments': [],
'description': None,
}
]

Expand Down
2 changes: 1 addition & 1 deletion fittrackee/tests/users/test_users_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ def test_it_returns_user_records(
) -> None:
serialized_user = user_1.serialize(user_1)
assert len(serialized_user['records']) == 4
assert serialized_user['records'][0]['record_type'] == 'AS'
assert serialized_user['records'][0]['record_type']
assert serialized_user['records'][0]['sport_id'] == sport_1_cycling.id
assert serialized_user['records'][0]['user'] == user_1.username
assert serialized_user['records'][0]['value'] > 0
Expand Down
61 changes: 61 additions & 0 deletions fittrackee/tests/workouts/test_workouts_api_0_get.py
Original file line number Diff line number Diff line change
Expand Up @@ -1134,6 +1134,67 @@ def test_it_returns_all_workouts_when_notes_filter_is_empty_string(
assert workouts[0]['id'] == workout_running_user_1.short_id
assert workouts[1]['id'] == workout_cycling_user_1.short_id

def test_it_gets_workouts_with_description_filter(
self,
app: Flask,
user_1: User,
user_2: User,
sport_1_cycling: Sport,
seven_workouts_user_1: List[Workout],
workout_cycling_user_2: Workout,
) -> None:
description = self.random_string()
seven_workouts_user_1[1].description = description
seven_workouts_user_1[3].description = self.random_string()
seven_workouts_user_1[5].description = (
f"{self.random_string()} {description.upper()} "
f"{self.random_string()}"
)
workout_cycling_user_2.description = description
client, auth_token = self.get_test_client_and_auth_token(
app, user_1.email
)

response = client.get(
f"/api/workouts?description={description}",
headers=dict(Authorization=f"Bearer {auth_token}"),
)

data = json.loads(response.data.decode())
assert response.status_code == 200
assert 'success' in data['status']
workouts = data['data']['workouts']
assert len(workouts) == 2
assert workouts[0]['id'] == seven_workouts_user_1[5].short_id
assert workouts[1]['id'] == seven_workouts_user_1[1].short_id

def test_it_returns_all_workouts_when_description_filter_is_empty_string(
self,
app: Flask,
user_1: User,
sport_1_cycling: Sport,
workout_cycling_user_1: Workout,
sport_2_running: Sport,
workout_running_user_1: Workout,
) -> None:
workout_running_user_1.description = self.random_string()
client, auth_token = self.get_test_client_and_auth_token(
app, user_1.email
)

response = client.get(
"/api/workouts?description=",
headers=dict(Authorization=f"Bearer {auth_token}"),
)

data = json.loads(response.data.decode())
assert response.status_code == 200
assert 'success' in data['status']
workouts = data['data']['workouts']
assert len(workouts) == 2
assert workouts[0]['id'] == workout_running_user_1.short_id
assert workouts[1]['id'] == workout_cycling_user_1.short_id


class TestGetWorkoutsWithFiltersAndPagination(ApiTestCaseMixin):
def test_it_gets_page_2_with_date_filter(
Expand Down
Loading