From 2b9873265eaa4cd575b90c00f3e2db8fe51ac9ea Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 27 Aug 2022 16:50:29 +0200 Subject: [PATCH] update documentation --- docs/_images/fittrackee_screenshot-07.png | Bin 0 -> 111668 bytes docs/_sources/api/index.rst.txt | 1 + docs/_sources/api/oauth2.rst.txt | 14 + docs/_sources/apps.rst.txt | 42 ++ docs/_sources/cli.rst.txt | 25 +- docs/_sources/features.rst.txt | 2 + docs/_sources/index.rst.txt | 1 + docs/_sources/installation.rst.txt | 4 + docs/api/auth.html | 43 +- docs/api/configuration.html | 14 +- docs/api/index.html | 2 + docs/api/oauth2.html | 700 ++++++++++++++++++++++ docs/api/records.html | 6 +- docs/api/sports.html | 10 +- docs/api/stats.html | 14 +- docs/api/users.html | 17 +- docs/api/workouts.html | 34 +- docs/apps.html | 192 ++++++ docs/changelog.html | 1 + docs/cli.html | 36 +- docs/features.html | 8 +- docs/genindex.html | 1 + docs/http-routingtable.html | 46 ++ docs/index.html | 2 + docs/installation.html | 11 +- docs/objects.inv | Bin 1354 -> 1502 bytes docs/search.html | 1 + docs/searchindex.js | 2 +- docs/troubleshooting/administrator.html | 1 + docs/troubleshooting/index.html | 1 + docs/troubleshooting/user.html | 1 + 31 files changed, 1173 insertions(+), 59 deletions(-) create mode 100644 docs/_images/fittrackee_screenshot-07.png create mode 100644 docs/_sources/api/oauth2.rst.txt create mode 100644 docs/_sources/apps.rst.txt create mode 100644 docs/api/oauth2.html create mode 100644 docs/apps.html diff --git a/docs/_images/fittrackee_screenshot-07.png b/docs/_images/fittrackee_screenshot-07.png new file mode 100644 index 0000000000000000000000000000000000000000..e33f00b5e6b384c94e6ad1653ad7e42bec9dabc7 GIT binary patch literal 111668 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∈ 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 literal 0 HcmV?d00001 diff --git a/docs/_sources/api/index.rst.txt b/docs/_sources/api/index.rst.txt index 560ffa3b..f0b2f064 100644 --- a/docs/_sources/api/index.rst.txt +++ b/docs/_sources/api/index.rst.txt @@ -7,6 +7,7 @@ API documentation auth configuration + oauth2 records sports stats diff --git a/docs/_sources/api/oauth2.rst.txt b/docs/_sources/api/oauth2.rst.txt new file mode 100644 index 00000000..161f0c32 --- /dev/null +++ b/docs/_sources/api/oauth2.rst.txt @@ -0,0 +1,14 @@ +OAuth2 +###### + +.. autoflask:: fittrackee:create_app() + :endpoints: + oauth2.get_clients, + oauth2.create_client, + oauth2.get_client_by_client_id, + oauth2.get_client_by_id, + oauth2.delete_client, + oauth2.revoke_client_tokens, + oauth2.authorize, + oauth2.issue_token, + oauth2.revoke_token diff --git a/docs/_sources/apps.rst.txt b/docs/_sources/apps.rst.txt new file mode 100644 index 00000000..2e0e9fef --- /dev/null +++ b/docs/_sources/apps.rst.txt @@ -0,0 +1,42 @@ +Third-party applications +######################## +(*new in 0.7.0*) + +FitTrackee provides a REST API (see `documentation `__) whose +most endpoints require authorization/authentication. + +To allow a third-party application to interact with API endpoints, an +`OAuth2 `_ client can be created +in user settings ('apps' tab). + +.. note:: + OAuth2 support is implemented with `Authlib `_ library. + +.. warning:: + OAuth2 endpoints requiring authentication are not accessible by third-party + applications (`documentation `__), only by FitTrackee + client (first-party application). + +FitTrackee supports only `Authorization Code `_ +flow (with PKCE support). +It allows to exchange an authorization code for an access token. +It is recommended to use `PKCE `_ +to provide a better security. + +The following scopes are available: + +- ``application:write``: grants write access to application configuration (only for users with administration rights), +- ``profile:read``: grants read access to auth endpoints, +- ``profile:write``: grants write access to auth endpoints, +- ``users:read``: grants read access to users endpoints, +- ``users:write``: grants write access to users endpoints, +- ``workouts:read``: grants read access to workouts-related endpoints, +- ``workouts:write``: grants write access to workouts-related endpoints. + +.. figure:: _images/fittrackee_screenshot-07.png + :alt: OAuth2 client creation on FitTrackee + +Some resources about OAuth 2.0: + +- `OAuth 2.0 Simplified `_ by `Aaron Parecki `_ +- `Web App Example of OAuth 2 web application flow `_ with Requests-OAuthlib diff --git a/docs/_sources/cli.rst.txt b/docs/_sources/cli.rst.txt index b65e4816..a9e17c40 100644 --- a/docs/_sources/cli.rst.txt +++ b/docs/_sources/cli.rst.txt @@ -14,8 +14,9 @@ A command line interface (CLI) is available to manage database and users. --help Show this message and exit. Commands: - db Manage database. - users Manage users. + db Manage database. + oauth2 Manage OAuth2 tokens. + users Manage users. .. warning:: | The following commands are now deprecated and will be removed in a next version: @@ -40,6 +41,26 @@ Apply migrations. Empty database and delete uploaded files, only on development environments. +OAuth2 +~~~~~~ + +``ftcli oauth2 clean`` +"""""""""""""""""""""" +.. versionadded:: 0.7.0 + +Remove tokens expired for more than provided number of days + +.. cssclass:: table-bordered +.. list-table:: + :widths: 25 50 + :header-rows: 1 + + * - Options + - Description + * - ``--days`` + - Number of days. + + Users ~~~~~ diff --git a/docs/_sources/features.rst.txt b/docs/_sources/features.rst.txt index 9fd6209d..afb3c8b5 100644 --- a/docs/_sources/features.rst.txt +++ b/docs/_sources/features.rst.txt @@ -83,6 +83,8 @@ Account & preferences | A disabled sport (by admin or user) will not appear in dropdown when **adding a workout**. | A workout with a disabled sport will still be displayed in the application. +- A user can create `clients `__ for third-party applications (*new in 0.7.0*). + Administration ^^^^^^^^^^^^^^ diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt index fe760149..e60cb0bc 100644 --- a/docs/_sources/index.rst.txt +++ b/docs/_sources/index.rst.txt @@ -33,6 +33,7 @@ Table of contents :maxdepth: 1 features + apps installation cli api/index diff --git a/docs/_sources/installation.rst.txt b/docs/_sources/installation.rst.txt index 5917cb4f..76f7abef 100644 --- a/docs/_sources/installation.rst.txt +++ b/docs/_sources/installation.rst.txt @@ -9,6 +9,7 @@ This application is written in Python (API) and Typescript (client): - `staticmap `_ to generate a static map image from gpx coordinates - `python-forecast.io `_ to fetch weather data from `Dark Sky `__ (former forecast.io) - `dramatiq `_ for task queue + - `Authlib `_ for OAuth 2.0 Authorization support - Client: - Vue3/Vuex - `Leaflet `__ to display map @@ -76,6 +77,8 @@ deployment method. **FitTrackee** secret key, must be initialized in production environment. + .. warning:: + Use a strong secret key. This key is used in JWT generation. .. envvar:: APP_WORKERS @@ -685,6 +688,7 @@ Examples (to update depending on your application configuration and given distri proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; + proxy_set_header X-Forwarded-Proto $scheme; } } diff --git a/docs/api/auth.html b/docs/api/auth.html index 38cc4b76..2f313f1b 100644 --- a/docs/api/auth.html +++ b/docs/api/auth.html @@ -61,6 +61,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
  • Features
  • +
  • Third-party applications
  • Installation
  • Command line interface
  • API documentation
  • @@ -132,7 +133,7 @@
    POST /api/auth/registerΒΆ
    -

    register a user and send confirmation email.

    +

    Register a user and send confirmation email.

    The newly created account is inactive. The user must confirm his email to activate it.

    Example request:

    @@ -204,7 +205,7 @@ character β€œ_” allowed

    POST /api/auth/account/confirmΒΆ
    -

    activate user account after registration

    +

    Activate user account after registration.

    Example request:

    POST /api/auth/account/confirm HTTP/1.1
     Content-Type: application/json
    @@ -240,8 +241,8 @@ character β€œ_” allowed

    POST /api/auth/account/resend-confirmationΒΆ
    -

    resend email with instructions to confirm account

    -

    If email sending is disabled, this endpoint is not available

    +

    Resend email with instructions to confirm account.

    +

    If email sending is disabled, this endpoint is not available.

    Example request:

    POST /api/auth/account/resend-confirmation HTTP/1.1
     Content-Type: application/json
    @@ -277,7 +278,7 @@ character β€œ_” allowed

    POST /api/auth/loginΒΆ
    -

    user login

    +

    User login.

    Only user with an active account can log in.

    Example request:

    POST /api/auth/login HTTP/1.1
    @@ -331,7 +332,8 @@ character β€œ_” allowed

    GET /api/auth/profileΒΆ
    -

    get authenticated user info (profile, account, preferences)

    +

    Get authenticated user info (profile, account, preferences).

    +

    Scope: profile:read

    Example request:

    GET /api/auth/profile HTTP/1.1
     Content-Type: application/json
    @@ -443,7 +445,8 @@ character β€œ_” allowed

    POST /api/auth/profile/editΒΆ
    -

    edit authenticated user profile

    +

    Edit authenticated user profile.

    +

    Scope: profile:write

    Example request:

    POST /api/auth/profile/edit HTTP/1.1
     Content-Type: application/json
    @@ -570,7 +573,8 @@ character β€œ_” allowed

    POST /api/auth/profile/edit/preferencesΒΆ
    -

    edit authenticated user preferences

    +

    Edit authenticated user preferences.

    +

    Scope: profile:write

    Example request:

    POST /api/auth/profile/edit/preferences HTTP/1.1
     Content-Type: application/json
    @@ -698,7 +702,8 @@ character β€œ_” allowed

    POST /api/auth/profile/edit/sportsΒΆ
    -

    edit authenticated user sport preferences

    +

    Edit authenticated user sport preferences.

    +

    Scope: profile:write

    Example request:

    POST /api/auth/profile/edit/sports HTTP/1.1
     Content-Type: application/json
    @@ -761,7 +766,8 @@ character β€œ_” allowed

    DELETE /api/auth/profile/reset/sports/(sport_id)ΒΆ
    -

    reset authenticated user preferences for a given sport

    +

    Reset authenticated user preferences for a given sport.

    +

    Scope: profile:write

    Example request:

    DELETE /api/auth/profile/reset/sports/1 HTTP/1.1
     Content-Type: application/json
    @@ -805,7 +811,8 @@ character β€œ_” allowed

    POST /api/auth/pictureΒΆ
    -

    update authenticated user picture

    +

    Update authenticated user picture.

    +

    Scope: profile:write

    Example request:

    POST /api/auth/picture HTTP/1.1
     Content-Type: multipart/form-data
    @@ -858,7 +865,8 @@ character β€œ_” allowed

    DELETE /api/auth/pictureΒΆ
    -

    delete authenticated user picture

    +

    Delete authenticated user picture.

    +

    Scope: profile:write

    Example request:

    DELETE /api/auth/picture HTTP/1.1
     Content-Type: application/json
    @@ -893,7 +901,7 @@ character β€œ_” allowed

    POST /api/auth/password/reset-requestΒΆ
    -

    handle password reset request

    +

    Handle password reset request.

    If email sending is disabled, this endpoint is not available

    Example request:

    POST /api/auth/password/reset-request HTTP/1.1
    @@ -929,7 +937,7 @@ character β€œ_” allowed

    PATCH /api/auth/profile/edit/accountΒΆ
    -

    update authenticated user email and password

    +

    Update authenticated user email and password.

    It sends emails if sending is enabled:

    • Password change

    • @@ -940,6 +948,7 @@ character β€œ_” allowed

+

Scope: profile:write

Example request:

PATCH /api/auth/profile/edit/account HTTP/1.1
 Content-Type: application/json
@@ -1069,8 +1078,8 @@ character β€œ_” allowed

POST /api/auth/password/updateΒΆ
-

update user password after password reset request

-

It sends emails if sending is enabled

+

Update user password after password reset request.

+

It sends emails if sending is enabled.

Example request:

POST /api/auth/password/update HTTP/1.1
 Content-Type: application/json
@@ -1107,7 +1116,7 @@ character β€œ_” allowed

POST /api/auth/email/updateΒΆ
-

update user email after confirmation

+

Update user email after confirmation.

Example request:

POST /api/auth/email/update HTTP/1.1
 Content-Type: application/json
diff --git a/docs/api/configuration.html b/docs/api/configuration.html
index 76b8b29f..95acd7c9 100644
--- a/docs/api/configuration.html
+++ b/docs/api/configuration.html
@@ -17,7 +17,7 @@
     
     
     
-    
+    
     
 
 
@@ -61,6 +61,7 @@
       role="menu"
       aria-labelledby="dLabelGlobalToc">
  • Features
  • +
  • Third-party applications
  • Installation
  • Command line interface
  • API documentation
  • @@ -93,7 +94,7 @@
  • - +
  • @@ -132,7 +133,7 @@
    GET /api/configΒΆ
    -

    Get Application config

    +

    Get Application configuration.

    Example request:

    GET /api/config HTTP/1.1
     Content-Type: application/json
    @@ -171,8 +172,9 @@
     
    PATCH /api/configΒΆ
    -

    Update Application config

    -

    Authenticated user must be an admin

    +

    Update Application configuration.

    +

    Authenticated user must be an admin.

    +

    Scope: application:write

    Example request:

    GET /api/config HTTP/1.1
     Content-Type: application/json
    @@ -203,7 +205,7 @@
     
    • admin_contact (string) – email to contact the administrator

    • gpx_limit_import (integer) – max number of files in zip archive

    • -
    • is_registration_enabled (boolean) – is registration enabled ?

    • +
    • is_registration_enabled (boolean) – is registration enabled?

    • max_single_file_size (integer) – max size of a single file

    • max_users (integer) – max users allowed to register on instance

    • max_zip_file_size (integer) – max size of a zip archive

    • diff --git a/docs/api/index.html b/docs/api/index.html index 6518e131..d2bc9019 100644 --- a/docs/api/index.html +++ b/docs/api/index.html @@ -61,6 +61,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
      • Features
      • +
      • Third-party applications
      • Installation
      • Command line interface
      • API documentation
      • @@ -134,6 +135,7 @@
        • Authentication
        • Configuration
        • +
        • OAuth2
        • Records
        • Sports
        • Statistics
        • diff --git a/docs/api/oauth2.html b/docs/api/oauth2.html new file mode 100644 index 00000000..619b5bea --- /dev/null +++ b/docs/api/oauth2.html @@ -0,0 +1,700 @@ + + + + + + + + OAuth2 — FitTrackee 0.6.11 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          +
          + +
          +

          OAuth2ΒΆ

          +
          +
          +GET /api/oauth/appsΒΆ
          +

          Get OAuth2 clients (apps) for authenticated user with pagination +(5 clients/page).

          +

          This endpoint is only accessible by FitTrackee client (first-party +application).

          +

          Example request:

          +
            +
          • without parameters

          • +
          +
          GET /api/oauth/apps HTTP/1.1
          +Content-Type: application/json
          +
          +
          +
            +
          • with β€˜page’ parameter

          • +
          +
          GET /api/oauth/apps?page=2 HTTP/1.1
          +Content-Type: application/json
          +
          +
          +

          Example response:

          +
          HTTP/1.1 200 SUCCESS
          +Content-Type: application/json
          +
          +{
          +  "data": {
          +    "clients": [
          +      {
          +        "client_description": "",
          +        "client_id": "o22a27s2aBPUoxJbxV3UjDOx",
          +        "id": 1,
          +        "issued_at": "Thu, 14 July 2022 06:27:53 GMT",
          +        "name": "GPX Importer",
          +        "redirect_uris": [
          +          " https://example.com/callback"
          +        ],
          +        "scope": "profile:read workouts:write",
          +        "website": "https://example.com"
          +      }
          +    ]
          +  },
          +  "pagination": {
          +    "has_next": false,
          +    "has_prev": false,
          +    "page": 1,
          +    "pages": 1,
          +    "total": 1
          +  },
          +  "status": "success"
          +}
          +
          +
          +
          +
          Query Parameters:
          +
            +
          • page (integer) – page for pagination (default: 1)

          • +
          +
          +
          Request Headers:
          +
          +
          +
          Status Codes:
          +
            +
          • 200 OK – success

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          +
          +
          +
          + +
          +
          +POST /api/oauth/appsΒΆ
          +

          Create an OAuth2 client (app) for the authenticated user.

          +

          This endpoint is only accessible by FitTrackee client (first-party +application).

          +

          Example request:

          +
          POST /api/oauth/apps HTTP/1.1
          +Content-Type: application/json
          +
          +
          +

          Example response:

          +
          HTTP/1.1 200 SUCCESS
          +Content-Type: application/json
          +
          +{
          +  "data": {
          +    "client": {
          +      "client_description": "",
          +      "client_id": "o22a27s2aBPUoxJbxV3UjDOx",
          +      "client_secret": "<CLIENT SECRET>",
          +      "id": 1,
          +      "issued_at": "Thu, 14 July 2022 06:27:53 GMT",
          +      "name": "GPX Importer",
          +      "redirect_uris": [
          +        "https://example.com/callback"
          +      ],
          +      "scope": "profile:read workouts:write",
          +      "website": "https://example.com"
          +    }
          +  },
          +  "status": "created"
          +}
          +
          +
          +
          +
          JSON Parameters:
          +
            +
          • client_name (string) – client name

          • +
          • client_uri (string) – client URL

          • +
          • redirect_uri (array) – list of client redirect URLs (string)

          • +
          • scope (string) – client scopes

          • +
          • client_description (string) – client description (OPTIONAL)

          • +
          +
          +
          Request Headers:
          +
          +
          +
          Status Codes:
          +
            +
          • 200 OK – success

          • +
          • 400 Bad Request –

              +
            • invalid payload

            • +
            +

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          +
          +
          +
          + +
          +
          +GET /api/oauth/apps/(string: client_client_id)ΒΆ
          +

          Get an OAuth2 client (app) by β€˜client_id’.

          +

          This endpoint is only accessible by FitTrackee client (first-party +application).

          +

          Example request:

          +
          GET /api/oauth/apps/o22a27s2aBPUoxJbxV3UjDOx HTTP/1.1
          +Content-Type: application/json
          +
          +
          +

          Example responses:

          +
            +
          • success

          • +
          +
          HTTP/1.1 200 SUCCESS
          +Content-Type: application/json
          +
          +{
          +  "data": {
          +    "client": {
          +      "client_description": "",
          +      "client_id": "o22a27s2aBPUoxJbxV3UjDOx",
          +      "id": 1,
          +      "issued_at": "Thu, 14 July 2022 06:27:53 GMT",
          +      "name": "GPX Importer",
          +      "redirect_uris": [
          +        "https://example.com/callback"
          +      ],
          +      "scope": "profile:read workouts:write",
          +      "website": "https://example.com"
          +    }
          +  },
          +  "status": "success"
          +}
          +
          +
          +
            +
          • not found

          • +
          +
          HTTP/1.1 404 NOT FOUND
          +Content-Type: application/json
          +
          +{
          +  "status": "not found",
          +  "message": "OAuth2 client not found"
          +}
          +
          +
          +
          +
          Parameters:
          +
            +
          • client_client_id (string) – OAuth2 client client_id

          • +
          +
          +
          Request Headers:
          +
          +
          +
          Status Codes:
          +
            +
          • 200 OK – success

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          • 404 Not Found – OAuth2 client not found

          • +
          +
          +
          +
          + +
          +
          +GET /api/oauth/apps/(int: client_id)/by_idΒΆ
          +

          Get an OAuth2 client (app) by id (integer value).

          +

          This endpoint is only accessible by FitTrackee client (first-party +application).

          +

          Example request:

          +
          GET /api/oauth/apps/1/by_id HTTP/1.1
          +Content-Type: application/json
          +
          +
          +

          Example responses:

          +
            +
          • success

          • +
          +
          HTTP/1.1 200 SUCCESS
          +Content-Type: application/json
          +
          +{
          +  "data": {
          +    "client": {
          +      "client_description": "",
          +      "client_id": "o22a27s2aBPUoxJbxV3UjDOx",
          +      "id": 1,
          +      "issued_at": "Thu, 14 July 2022 06:27:53 GMT",
          +      "name": "GPX Importer",
          +      "redirect_uris": [
          +        "https://example.com/callback"
          +      ],
          +      "scope": "profile:read workouts:write",
          +      "website": "https://example.com"
          +    }
          +  },
          +  "status": "success"
          +}
          +
          +
          +
            +
          • not found

          • +
          +
          HTTP/1.1 404 NOT FOUND
          +Content-Type: application/json
          +
          +{
          +  "status": "not found",
          +  "message": "OAuth2 client not found"
          +}
          +
          +
          +
          +
          Parameters:
          +
            +
          • client_id (integer) – OAuth2 client id

          • +
          +
          +
          Request Headers:
          +
          +
          +
          Status Codes:
          +
            +
          • 200 OK – success

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          • 404 Not Found – OAuth2 client not found

          • +
          +
          +
          +
          + +
          +
          +DELETE /api/oauth/apps/(int: client_id)ΒΆ
          +

          Delete an OAuth2 client (app).

          +

          This endpoint is only accessible by FitTrackee client (first-party +application).

          +

          Example request:

          +
          DELETE /api/oauth/apps/1 HTTP/1.1
          +Content-Type: application/json
          +
          +
          +

          Example response:

          +
          HTTP/1.1 204 NO CONTENT
          +Content-Type: application/json
          +
          +
          +
          +
          Parameters:
          +
            +
          • client_id (integer) – OAuth2 client id

          • +
          +
          +
          Request Headers:
          +
          +
          +
          Status Codes:
          +
            +
          • 204 No Content – OAuth2 client deleted

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          • 404 Not Found – OAuth2 client not found

          • +
          +
          +
          +
          + +
          +
          +POST /api/oauth/apps/(int: client_id)/revokeΒΆ
          +

          Revoke all tokens associated to an OAuth2 client (app).

          +

          This endpoint is only accessible by FitTrackee client (first-party +application).

          +

          Example request:

          +
          POST /api/oauth/apps/1/revoke HTTP/1.1
          +Content-Type: application/json
          +
          +
          +

          Example response:

          +
          HTTP/1.1 200 SUCCESS
          +Content-Type: application/json
          +
          +{
          +  "status": "success"
          +}
          +
          +
          +
          +
          Parameters:
          +
            +
          • client_id (integer) – OAuth2 client id

          • +
          +
          +
          Request Headers:
          +
          +
          +
          Status Codes:
          +
            +
          • 200 OK – success

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          • 404 Not Found – OAuth2 client not found

          • +
          +
          +
          +
          + +
          +
          +POST /api/oauth/authorizeΒΆ
          +

          Authorize an OAuth2 client (app). +If successful, it redirects to the client callback URL with the code to +issue a token.

          +

          This endpoint is only accessible by FitTrackee client (first-party +application).

          +

          Example request:

          +
          POST /api/oauth/authorize HTTP/1.1
          +Content-Type: multipart/form-data
          +
          +
          +

          Example response:

          +
          HTTP/1.1 200 SUCCESS
          +Content-Type: application/json
          +
          +{
          +  "status": "success"
          +}
          +
          +
          +
          +
          Form Parameters:
          +
            +
          • string client_id – OAuth2 client β€˜client_id’

          • +
          • string response_type – client response type (only β€˜code’ is supported +by FitTrackee)

          • +
          • string scopes – OAuth2 client scopes

          • +
          • boolean confirm – confirmation (must be β€˜true’)

          • +
          • string state – unique value to prevent cross-site request forgery +(not mandatory but recommended)

          • +
          • string code_challenge – string generated from a code verifier +(for PKCE, not mandatory but recommended)

          • +
          • string code_challenge_method – method used to create challenge, +for instance β€œS256” (mandatory if code_challenge +provided)

          • +
          +
          +
          Request Headers:
          +
          +
          +
          Status Codes:
          +
            +
          • 200 OK – success

          • +
          • 400 Bad Request –

              +
            • invalid payload

            • +
            • errors returned by Authlib library

            • +
            +

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          +
          +
          +
          + +
          +
          +POST /api/oauth/tokenΒΆ
          +

          Issue or refresh token for a given OAuth2 client (app).

          +

          Example request:

          +
          POST /api/oauth/token HTTP/1.1
          +Content-Type: multipart/form-data
          +
          +
          +

          Example response:

          +
          HTTP/1.1 200 SUCCESS
          +Content-Type: application/json
          +
          +{
          +  "access_token": "rOEHv64THCG28WcewZHRnVLUsOdUvw8NVnHKCmL57e",
          +  "expires_in": 864000,
          +  "refresh_token": "NuV9cY8VQOnrQKHTZ5pQAq2Zw7mSH0MorNPJr14AmSwD6f6I",
          +  "scope": ["profile:read", "workouts:write"],
          +  "token_type": "Bearer",
          +  "expires_at": 1658660147.0667062
          +}
          +
          +
          +
          +
          Form Parameters:
          +
            +
          • string client_id – OAuth2 client β€˜client_id’

          • +
          • string client_secret – OAuth2 client secret

          • +
          • string grant_type – OAuth2 client grant type +(only β€˜authorization_code’ (for token issue) +and β€˜refresh_token’ (for token refresh) +are supported by FitTrackee)

          • +
          • string code – code generated after authorizing the client +(for token issue)

          • +
          • string code_verifier – code verifier +(for token issue with PKCE, not mandatory)

          • +
          • string refresh_token – refresh token (for token refresh)

          • +
          +
          +
          Status Codes:
          +
            +
          • 200 OK – success

          • +
          • 400 Bad Request –

              +
            • errors returned by Authlib library

            • +
            +

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          +
          +
          +
          + +
          +
          +POST /api/oauth/revokeΒΆ
          +

          Revoke a token for a given OAuth2 client (app).

          +

          Example request:

          +
          POST /api/oauth/revoke HTTP/1.1
          +Content-Type: multipart/form-data
          +
          +
          +

          Example response:

          +
          HTTP/1.1 200 SUCCESS
          +Content-Type: application/json
          +
          +{}
          +
          +
          +
          +
          Form Parameters:
          +
            +
          • string client_id – OAuth2 client β€˜client_id’

          • +
          • string client_secret – OAuth2 client secret

          • +
          • string token – access token to revoke

          • +
          +
          +
          Status Codes:
          +
            +
          • 200 OK – success

          • +
          • 400 Bad Request –

              +
            • errors returned by Authlib library

            • +
            +

          • +
          • 401 Unauthorized –

              +
            • provide a valid auth token

            • +
            • signature expired, please log in again

            • +
            • invalid token, please log in again

            • +
            +

          • +
          +
          +
          +
          + +
          + + +
          + +
          +
          +
          +
          +

          + Back to top + +

          +

          + © Copyright 2018 - 2022, SamR1.
          + Created using Sphinx 5.1.1.
          +

          +
          +
          + + \ No newline at end of file diff --git a/docs/api/records.html b/docs/api/records.html index 677a5a1a..92321008 100644 --- a/docs/api/records.html +++ b/docs/api/records.html @@ -18,7 +18,7 @@ - + @@ -61,6 +61,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
    +

    Scope: workouts:read

    Example request:

    GET /api/records HTTP/1.1
     Content-Type: application/json
    diff --git a/docs/api/sports.html b/docs/api/sports.html
    index faec6322..d1bfe816 100644
    --- a/docs/api/sports.html
    +++ b/docs/api/sports.html
    @@ -61,6 +61,7 @@
           role="menu"
           aria-labelledby="dLabelGlobalToc">
    • Features
    • +
    • Third-party applications
    • Installation
    • Command line interface
    • API documentation
    • @@ -133,6 +134,7 @@
      GET /api/sportsΒΆ

      Get all sports

      +

      Scope: workouts:read

      Example request:

      GET /api/sports HTTP/1.1
       Content-Type: application/json
      @@ -295,6 +297,7 @@
       
      GET /api/sports/(int: sport_id)ΒΆ

      Get a sport

      +

      Scope: workouts:read

      Example request:

      GET /api/sports/1 HTTP/1.1
       Content-Type: application/json
      @@ -391,14 +394,15 @@
       
      PATCH /api/sports/(int: sport_id)ΒΆ
      -

      Update a sport -Authenticated user must be an admin

      +

      Update a sport.

      +

      Authenticated user must be an admin.

      +

      Scope: workouts:write

      Example request:

      PATCH /api/sports/1 HTTP/1.1
       Content-Type: application/json
       
      -

      Example response:

      +

      Example responses:

      • success

      diff --git a/docs/api/stats.html b/docs/api/stats.html index 29a6cfdb..0ffbad26 100644 --- a/docs/api/stats.html +++ b/docs/api/stats.html @@ -61,6 +61,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
      • Features
      • +
      • Third-party applications
      • Installation
      • Command line interface
      • API documentation
      • @@ -132,7 +133,8 @@
        GET /api/stats/(user_name)/by_timeΒΆ
        -

        Get workouts statistics for a user by time

        +

        Get workouts statistics for a user by time.

        +

        Scope: workouts:read

        Example requests:

        • without parameters

        • @@ -208,7 +210,7 @@
          Parameters:
            -
          • user_name (integer) – user name

          • +
          • user_name (integer) – username

          Query Parameters:
          @@ -251,7 +253,8 @@
          GET /api/stats/(user_name)/by_sportΒΆ
          -

          Get workouts statistics for a user by sport

          +

          Get workouts statistics for a user by sport.

          +

          Scope: workouts:read

          Example requests:

          • without parameters (get stats for all sports with workouts)

          • @@ -322,7 +325,7 @@
            Parameters:
              -
            • user_name (integer) – user name

            • +
            • user_name (integer) – username

            Query Parameters:
            @@ -357,7 +360,8 @@
            GET /api/stats/allΒΆ
            -

            Get all application statistics

            +

            Get all application statistics.

            +

            Scope: workouts:read

            Example requests:

            GET /api/stats/all HTTP/1.1
             
            diff --git a/docs/api/users.html b/docs/api/users.html index 2ffbd007..e7eb089e 100644 --- a/docs/api/users.html +++ b/docs/api/users.html @@ -61,6 +61,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
            • Features
            • +
            • Third-party applications
            • Installation
            • Command line interface
            • API documentation
            • @@ -133,8 +134,9 @@
              GET /api/usersΒΆ

              Get all users (regardless their account status), if authenticated user -has admin rights

              +has admin rights.

              It returns user preferences only for authenticated user.

              +

              Scope: users:read

              Example request:

              • without parameters

              • @@ -293,6 +295,7 @@ has admin rights

                Get single user details. Only user with admin rights can get other users details.

                It returns user preferences only for authenticated user.

                +

                Scope: users:read

                Example request:

                GET /api/users/admin HTTP/1.1
                 Content-Type: application/json
                @@ -446,7 +449,7 @@ details.

                PATCH /api/users/(user_name)ΒΆ
                -

                Update user account

                +

                Update user account.

                • add/remove admin rights (regardless user account status)

                • reset password (and send email to update user password, @@ -454,7 +457,8 @@ if sending enabled)

                • update user email (and send email to new user email, if sending enabled)

                • activate account for an inactive user

                -

                Only user with admin rights can modify another user

                +

                Only user with admin rights can modify another user.

                +

                Scope: users:write

                Example request:

                PATCH /api/users/<user_name> HTTP/1.1
                 Content-Type: application/json
                @@ -591,10 +595,11 @@ if sending enabled)

                DELETE /api/users/(user_name)ΒΆ
                -

                Delete a user account

                -

                A user can only delete his own account

                +

                Delete a user account.

                +

                A user can only delete his own account.

                An admin can delete all accounts except his account if he’s the only -one admin

                +one admin.

                +

                Scope: users:write

                Example request:

                DELETE /api/users/john_doe HTTP/1.1
                 Content-Type: application/json
                diff --git a/docs/api/workouts.html b/docs/api/workouts.html
                index 992d35d9..1e573e0c 100644
                --- a/docs/api/workouts.html
                +++ b/docs/api/workouts.html
                @@ -61,6 +61,7 @@
                       role="menu"
                       aria-labelledby="dLabelGlobalToc">
                  -
                • acitivity not found:

                • +
                • workout not found:

                HTTP/1.1 404 NOT FOUND
                 Content-Type: application/json
                @@ -388,7 +391,8 @@
                 
                GET /api/workouts/(string: workout_short_id)/gpxΒΆ
                -

                Get gpx file for a workout displayed on map with Leaflet

                +

                Get gpx file for a workout displayed on map with Leaflet.

                +

                Scope: workouts:read

                Example request:

                GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx HTTP/1.1
                 Content-Type: application/json
                @@ -441,7 +445,8 @@
                 
                GET /api/workouts/(string: workout_short_id)/chart_dataΒΆ
                -

                Get chart data from a workout gpx file, to display it with Recharts

                +

                Get chart data from a workout gpx file, to display it with Chart.js.

                +

                Scope: workouts:read

                Example request:

                GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/chart HTTP/1.1
                 Content-Type: application/json
                @@ -514,6 +519,7 @@
                 
                GET /api/workouts/(string: workout_short_id)/chart_data/segment/(int: segment_id)ΒΆ

                Get chart data from a workout gpx file, to display it with Recharts

                +

                Scope: workouts:read

                Example request:

                GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/chart/segment/0 HTTP/1.1
                 Content-Type: application/json
                @@ -583,7 +589,8 @@
                 
                GET /api/workouts/(string: workout_short_id)/gpx/segment/(int: segment_id)ΒΆ
                -

                Get gpx file for a workout segment displayed on map with Leaflet

                +

                Get gpx file for a workout segment displayed on map with Leaflet.

                +

                Scope: workouts:read

                Example request:

                GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx/segment/0 HTTP/1.1
                 Content-Type: application/json
                @@ -634,7 +641,7 @@
                 
                GET /api/workouts/map/(map_id)ΒΆ
                -

                Get map image for workouts with gpx

                +

                Get map image for workouts with gpx.

                Example request:

                GET /api/workouts/map/fa33f4d996844a5c73ecd1ae24456ab8?1563529507772
                   HTTP/1.1
                @@ -696,7 +703,8 @@
                 
                GET /api/workouts/(string: workout_short_id)/gpx/downloadΒΆ
                -

                Download gpx file

                +

                Download gpx file.

                +

                Scope: workouts:read

                Example request:

                GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx/download HTTP/1.1
                 
                @@ -734,7 +742,8 @@
                POST /api/workoutsΒΆ
                -

                Post a workout with a gpx file

                +

                Post a workout with a gpx file.

                +

                Scope: workouts:write

                Example request:

                POST /api/workouts/ HTTP/1.1
                 Content-Type: multipart/form-data
                @@ -857,7 +866,8 @@
                 
                POST /api/workouts/no_gpxΒΆ
                -

                Post a workout without gpx file

                +

                Post a workout without gpx file.

                +

                Scope: workouts:write

                Example request:

                POST /api/workouts/no_gpx HTTP/1.1
                 Content-Type: application/json
                @@ -978,7 +988,8 @@
                 
                PATCH /api/workouts/(string: workout_short_id)ΒΆ
                -

                Update a workout

                +

                Update a workout.

                +

                Scope: workouts:write

                Example request:

                PATCH /api/workouts/1 HTTP/1.1
                 Content-Type: application/json
                @@ -1108,7 +1119,8 @@
                 
                DELETE /api/workouts/(string: workout_short_id)ΒΆ
                -

                Delete a workout

                +

                Delete a workout.

                +

                Scope: workouts:write

                Example request:

                DELETE /api/workouts/kjxavSTUrJvoAh2wvCeGEF HTTP/1.1
                 Content-Type: application/json
                diff --git a/docs/apps.html b/docs/apps.html
                new file mode 100644
                index 00000000..40978d5f
                --- /dev/null
                +++ b/docs/apps.html
                @@ -0,0 +1,192 @@
                +
                +
                +
                +  
                +    
                +    
                +
                +    Third-party applications — FitTrackee 0.6.11
                + documentation
                +    
                +    
                +    
                +    
                +    
                +    
                +    
                +    
                +    
                +    
                +    
                +    
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +  
                +
                +  
                +
                +
                +
                +
                + +
                +

                Third-party applicationsΒΆ

                +

                (new in 0.7.0)

                +

                FitTrackee provides a REST API (see documentation) whose +most endpoints require authorization/authentication.

                +

                To allow a third-party application to interact with API endpoints, an +OAuth2 client can be created +in user settings (β€˜apps’ tab).

                +
                +

                Note

                +

                OAuth2 support is implemented with Authlib library.

                +
                +
                +

                Warning

                +

                OAuth2 endpoints requiring authentication are not accessible by third-party +applications (documentation), only by FitTrackee +client (first-party application).

                +
                +

                FitTrackee supports only Authorization Code +flow (with PKCE support). +It allows to exchange an authorization code for an access token. +It is recommended to use PKCE +to provide a better security.

                +

                The following scopes are available:

                +
                  +
                • application:write: grants write access to application configuration (only for users with administration rights),

                • +
                • profile:read: grants read access to auth endpoints,

                • +
                • profile:write: grants write access to auth endpoints,

                • +
                • users:read: grants read access to users endpoints,

                • +
                • users:write: grants write access to users endpoints,

                • +
                • workouts:read: grants read access to workouts-related endpoints,

                • +
                • workouts:write: grants write access to workouts-related endpoints.

                • +
                +
                +OAuth2 client creation on FitTrackee +
                +

                Some resources about OAuth 2.0:

                + +
                + + +
                + +
                +
                +
                +
                +

                + Back to top + +

                +

                + © Copyright 2018 - 2022, SamR1.
                + Created using Sphinx 5.1.1.
                +

                +
                +
                + + \ No newline at end of file diff --git a/docs/changelog.html b/docs/changelog.html index 0644d08e..b0dea0c8 100644 --- a/docs/changelog.html +++ b/docs/changelog.html @@ -60,6 +60,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
                @@ -179,6 +185,32 @@ Commands:

                Empty database and delete uploaded files, only on development environments.

                +
                +

                OAuth2ΒΆ

                +
                +

                ftcli oauth2 cleanΒΆ

                +
                +

                New in version 0.7.0.

                +
                +

                Remove tokens expired for more than provided number of days

                + ++++ + + + + + + + + + + +

                Options

                Description

                --days

                Number of days.

                +
                +

                UsersΒΆ

                diff --git a/docs/features.html b/docs/features.html index f3d7a630..96a2c472 100644 --- a/docs/features.html +++ b/docs/features.html @@ -17,7 +17,7 @@ - + @@ -61,6 +61,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
                +
                  +
                • A user can create clients for third-party applications (new in 0.7.0).

                • +

                AdministrationΒΆ

                diff --git a/docs/genindex.html b/docs/genindex.html index aba8a986..9d4db64d 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -58,6 +58,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
                @@ -266,6 +268,10 @@ deployment method.

                APP_SECRET_KEYΒΆ

                FitTrackee secret key, must be initialized in production environment.

                +
                +

                Warning

                +

                Use a strong secret key. This key is used in JWT generation.

                +
                @@ -970,6 +976,7 @@ One way is to use a systemd services and Nginx proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; + proxy_set_header X-Forwarded-Proto $scheme; } } diff --git a/docs/objects.inv b/docs/objects.inv index 28ef5b281b62485861a4970b7ff41ff37513b687..63e23fd27276751de2ac2388b5f5948131f5ee16 100644 GIT binary patch delta 1391 zcmV-#1(5p63f>ElfPa|Ha-%p9$L~A^RlA4eprLk-xsjMmTycU6@TB%cDWKS@U|<1f zl6ioAgFWvn&LeE=11tn~kjr~;Vp{$GbxUdq$qp{5gLlow!AVl=^2SMu{DoFqd($-K zRaw-H{fFH;ec3eI>^Eja2yBSikQAa;h%9FStw>Gsv~|G^Eq`+J0Amm}7};W)IlD5& z4Vg~oDkN1ZE-Tj5AWPw{0!m!hKZ+{ly=UqFwIjfpOlJYB2aEZlDvKexj z^#Hgn?!y7fihsP2isT8YPs<&tgo9z~vZ$I?j8zG?{+ zVxwg42LQ@IsD%Ac978x4G;gkwjFSA&?5R+7{`OeJAb&`Kd>Y1i{(ygm1E7aN0`hsV zio6xC#CWs@@g!#?VBJ(SU$-&!;WX%>0HGnM9~Ax+75!=0r%u&_oiI9M1JQsbH=+oI zgp|;2lZDCsrM4moyzmC=Nt!ib>nyeE?zoo>1{%AN=5C`daLU3$C?m zyv}`8uIw{?{eGu81n9PGX^891;qyx$uFi7X(tmB-L!4pY$wP9!kZQ4LrS*JzG5J|q=sFh&TQ(u?w=Sz*jj6yqU@gvU) zoSroY)KSfn`TysRB{zA}wzzaI;Lj;3fDCoo5iq+Q0t&`=5!7Q9ZJvIn-L{1>Yehvwp1R zrh?_dcW3dfzkvQ5=)SK!Rxa={jriob(H(S*Db3ctT)^=%@Nc{@^h}m=`%4m+q<=+X zBkk8E+l6ni=hK7(ticskR}Sy5_Kj-d1e&MhT~~6W47!}#(6VE1o4rcht96-j+qQj{ z?N>{^A8X#~{n!q~gQeVwHFxF8X@~r~)m^^^zTKV74q4VU44QBk_bbhPf0eLT?5ou~ z>ub)vmyZ1;pDh0SR?oGRF42ZoDSs;A@b$s0nVi4cf&*E;CRwpob)8X87=N_k*-A3n zbIfQvr`s*gQ#+$Mff8#-^@0;(y%5Z9KE0$`n-Jd0Cu>deeHmo7s`)aW_ zFsh)#a7=0Nb4L1-L9@`_MbXj@gxQXm-5Qjg66%&VQH7IN!rb;Nrtht-BxuNQZ?U#T zI?|!?1GNo8^H8Ka=z{2)()x*P`O$13ou2v}V^R}bC7Zrl*kmb-_9b2us{tZt;DlH( xf`ij7&7sa=Wfzq?Qb!%-5?4(F@?fS$9b~EZn+7bl(2k*4`+gl-{{al29ChpH&(8n= delta 1242 zcmV<01SR|43(5+RfPa_Ga-%p9$L~A^RlA4yprPiP8%fB-6(>-DC$%R^0ohg!UjynUhxKhBk%0W30Ze ztCrcH?cV9rjurWD+=vj^5Vs*IM7oQCDixPkTWXM{a905}Zrh(#lXbo4>3`o7;LIlWdNkBehA{2*fj!ajnx<^uNLWU4 z0_{3Zm{p(@odnIwY6{X+8=6bVmW&x-QxVdA0^yL1nhd{Cp-y!Q*H^g2VwUd4Ty8x9 z?u+|$fVv?Y(tnULCGB~+Bb9J6Oj}nCJ2!$9Pr{gdc zvnK4FrB*G2qf}Tm<#5vb8Kxz>)@FGY2XQ4DP3Z?%b$@78urj6}qZ#JpeM_38#06P6 zukT6cHAREFeQq<_6{)o?LLC(f^;sG7!`Ft98mTJx&&2nedl)_O}sXdxl#R^1S z#+_O1&o7uWvNE8lrK0eZN|{d_e$@=~)W2}>3I0~?#|y5vYrKQ|q+HqShWg`vcM1SI zGizWAxqp_1q}`p~sE2TMmirbYacGP)3_N>CE*DZQ7Hu4l^>WFuPP)VJ1m`e(u}&j} zc}^luOST1ple^e?#mhyfMad9JzTBvlVDnSo)^C?fjl+yWJ6ZL!%qyH-GzWB`nkDo9 z&mB*0_M{cKcCO&hIVpe)9kdf*_$I<3^Qv7qSAT!P?+t$Mi%<3V@H8V($AV5T5U>!i zP|wl>msN78H-lXlNgcA>AV^mJ7rSNIH7S4mzzra13E$~FSB`h03H>e=k#`$ zVJwW}<@1-wQ1;@7k6vh^x^rXq#*Mt>ZW*~ZD=!Ire+7}xL9D}-iOjoq*Q+>*VmDsi zK7YA^f!2F+mn*|~_bWGgOkk7@G!K3h8@NL!5;u;+<;^-?`p*W+zzbwZ`_Es0&ty#MkrgkY)*>(b3MrZOW4$yL1S{XYOYZ#@ z^xr`Db?xzTfuCu_7tf6!pkrKVw)W)$PJe>XzxATXGg-?0mAR8-Rca&c8g0Aq1baSB zJAgI1qUy@={nfrzO&x)j8F|x{olyo2mNvBP`Pb&C>Tj`{PQCKlp?I;BYp&+5+#>C$ zd$tZYs*&&Enq@~kkru{5xQi>3=6<{#*lYf14UX@c^WZyTzsNTW4ou~i?mE_#H zw+iPaf3)})5;c%L93vQh&B;(QY8KjuI1cPknC+O`tx;Jhq3$V*8=QV4-0fJ=LvO9p zA-|)=DynRvL-jlA8-(Vm%J$F&(Ni_0^%t_>o$VlPkLr1v;Rnv$(nyE<#L5hb>BNksZAE9{raZy?S0hjUO EPS8qip#T5? diff --git a/docs/search.html b/docs/search.html index 80ddee20..bb0771b2 100644 --- a/docs/search.html +++ b/docs/search.html @@ -65,6 +65,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">
                • Features
                • +
                • Third-party applications
                • Installation
                • Command line interface
                • API documentation
                • diff --git a/docs/searchindex.js b/docs/searchindex.js index 82354779..980dbefc 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["api/auth", "api/configuration", "api/index", "api/records", "api/sports", "api/stats", "api/users", "api/workouts", "changelog", "cli", "features", "index", "installation", "troubleshooting/administrator", "troubleshooting/index", "troubleshooting/user"], "filenames": ["api/auth.rst", "api/configuration.rst", "api/index.rst", "api/records.rst", "api/sports.rst", "api/stats.rst", "api/users.rst", "api/workouts.rst", "changelog.md", "cli.rst", "features.rst", "index.rst", "installation.rst", "troubleshooting/administrator.rst", "troubleshooting/index.rst", "troubleshooting/user.rst"], "titles": ["Authentication", "Configuration", "API documentation", "Records", "Sports", "Statistics", "Users", "Workouts", "Change log", "Command line interface", "Features", "FitTrackee", "Installation", "Administrator", "Troubleshooting", "User"], "terms": {"post": [0, 7], "api": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12], "auth": [0, 1, 3, 4, 5, 6, 7, 12], "regist": [0, 1, 12], "user": [0, 1, 2, 3, 4, 5, 7, 8, 10, 12, 14], "send": [0, 6, 8, 10, 12], "confirm": [0, 8, 10, 12], "email": [0, 1, 6, 8, 9, 10, 13], "The": [0, 8, 9, 10, 12], "newli": [0, 12], "creat": [0, 7, 8, 10, 12], "account": [0, 6, 8, 9, 12], "i": [0, 1, 8, 9, 10, 11, 12, 14], "inact": [0, 6, 10, 12], "must": [0, 1, 4, 6, 8, 10, 12, 13], "hi": [0, 6, 8, 10], "activ": [0, 4, 6, 8, 9, 10, 11, 12], "exampl": [0, 1, 3, 4, 5, 6, 7, 11, 12], "request": [0, 1, 3, 4, 5, 6, 7, 12], "http": [0, 1, 3, 4, 5, 6, 7, 12], "1": [0, 1, 3, 4, 5, 6, 7, 10, 12], "content": [0, 1, 3, 4, 5, 6, 7], "type": [0, 1, 3, 4, 5, 6, 7, 12], "applic": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12], "json": [0, 1, 3, 4, 5, 6, 7], "respons": [0, 1, 3, 4, 5, 6, 7], "success": [0, 1, 3, 4, 5, 6, 7], "200": [0, 1, 3, 4, 5, 6, 7, 8], "statu": [0, 1, 3, 4, 5, 6, 7, 9], "error": [0, 1, 4, 6, 7, 8, 10, 12, 13], "registr": [0, 1, 8, 10, 12], "400": [0, 1, 4, 6, 7], "bad": [0, 1, 4, 6, 7], "messag": [0, 1, 7, 8, 9], "valid": [0, 1, 3, 4, 5, 6, 7, 8, 12, 13], "provid": [0, 1, 3, 4, 5, 6, 7, 8, 10, 12, 13], "n": 0, "object": [0, 1, 4, 6, 7], "usernam": [0, 6, 8, 12], "string": [0, 1, 4, 5, 6, 7, 12], "3": [0, 4, 5, 6, 7, 10, 12], "30": [0, 5], "charact": [0, 8], "requir": [0, 8, 12], "password": [0, 6, 8, 9, 10, 12], "8": [0, 7], "lang": [0, 8], "languag": [0, 6, 8, 10], "prefer": [0, 6, 8], "invalid": [0, 1, 3, 4, 5, 6, 7, 8, 12], "fallback": 0, "en": [0, 6], "english": 0, "code": [0, 1, 3, 4, 5, 6, 7, 8], "ok": [0, 1, 3, 4, 5, 6, 7], "payload": [0, 1, 4, 6, 7], "sorri": 0, "alreadi": 0, "taken": 0, "onli": [0, 6, 7, 8, 9, 10, 12], "alphanumer": [0, 8], "underscor": 0, "_": [0, 8], "allow": [0, 1, 7, 8, 10, 11], "403": [0, 1, 4, 5, 6, 7], "forbidden": [0, 1, 4, 5, 6, 7], "disabl": [0, 8, 10, 12], "500": [0, 1, 4, 6, 7, 8], "intern": [0, 1, 4, 6, 7], "server": [0, 1, 4, 6, 7, 8, 10, 11], "pleas": [0, 1, 3, 4, 5, 6, 7, 8], "try": [0, 6, 7], "again": [0, 1, 3, 4, 5, 6, 7], "contact": [0, 1, 6, 7, 10], "administr": [0, 1, 6, 7, 14], "after": [0, 8, 10, 12], "auth_token": 0, "web": [0, 11, 12], "token": [0, 1, 3, 4, 5, 6, 7], "resend": 0, "instruct": [0, 8, 10, 12], "If": [0, 10, 12], "thi": [0, 7, 8, 9, 10, 11, 12], "endpoint": [0, 1, 8], "avail": [0, 3, 9, 10, 12], "resent": 0, "404": [0, 4, 5, 6, 7, 8], "Not": [0, 4, 5, 6, 7], "found": [0, 4, 5, 6, 7, 8], "url": [0, 8, 12, 13], "wa": [0, 8], "login": 0, "an": [0, 1, 4, 6, 8, 10, 12, 13], "can": [0, 6, 8, 10, 11, 12, 13], "log": [0, 1, 3, 4, 5, 6, 7, 10, 11, 12, 13], "successfulli": 0, "401": [0, 1, 3, 4, 5, 6, 7], "unauthor": [0, 1, 3, 4, 5, 6, 7], "credenti": [0, 12], "get": [0, 1, 3, 4, 5, 6, 7], "profil": [0, 8], "info": 0, "data": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12], "admin": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 12], "fals": [0, 1, 4, 6, 7, 12], "bio": [0, 6], "null": [0, 4, 6, 7], "birth_dat": [0, 6], "created_at": [0, 6], "sun": [0, 3, 6, 7], "14": [0, 6, 7], "jul": [0, 3, 6, 7], "2019": [0, 3, 5, 6, 7], "09": [0, 6], "58": [0, 6, 8], "gmt": [0, 3, 6, 7], "display_asc": 0, "true": [0, 1, 4, 6, 8, 12], "sam": [0, 3, 6, 7], "com": [0, 1, 6, 12], "first_nam": [0, 6], "imperial_unit": [0, 6], "is_act": [0, 4, 6], "last_nam": [0, 6], "locat": [0, 6, 12], "nb_sport": [0, 6], "nb_workout": [0, 5, 6], "6": [0, 1, 4, 6, 7, 9, 10, 12], "pictur": [0, 6, 7, 8], "record": [0, 2, 6, 7, 8, 10], "id": [0, 3, 4, 5, 6, 7], "9": [0, 3, 6, 10, 12], "record_typ": [0, 3, 6, 7], "AS": [0, 3, 6, 7], "sport_id": [0, 3, 4, 5, 6, 7], "valu": [0, 3, 6, 7, 12], "18": [0, 3, 6, 7, 8], "workout_d": [0, 3, 6, 7], "07": [0, 3, 6, 7], "08": [0, 3, 6, 7], "00": [0, 3, 6, 7], "workout_id": [0, 3, 6, 7], "hvybqybra7wwxpastwr4v2": [0, 3, 6, 7], "10": [0, 1, 3, 6, 7, 12], "fd": [0, 3, 6, 7], "13": [0, 3, 6, 7], "ha": [0, 3, 6, 7, 10, 11], "43": [0, 3, 6, 7, 8], "97": [0, 3, 6, 7], "11": [0, 1, 3, 6, 10, 12], "ld": [0, 3, 6, 7], "01": [0, 3, 5, 6, 7], "12": [0, 3, 6, 7], "m": [0, 3, 5, 6, 7], "sports_list": [0, 6], "4": [0, 4, 5, 6, 7, 12], "timezon": [0, 6, 7, 8, 10], "europ": [0, 6], "pari": [0, 6], "total_dist": [0, 5, 6], "67": [0, 6], "895": [0, 6], "total_dur": [0, 5, 6], "50": [0, 6, 8], "27": [0, 6], "weekm": [0, 5, 6], "header": [0, 1, 3, 4, 5, 6, 7], "author": [0, 1, 3, 4, 5, 6, 7], "oauth": [0, 1, 3, 4, 5, 6, 7], "2": [0, 1, 3, 4, 5, 6, 7, 10, 12], "0": [0, 1, 3, 4, 5, 6, 7, 9, 10, 12], "bearer": [0, 1, 3, 4, 5, 6, 7], "signatur": [0, 1, 3, 4, 5, 6, 7], "expir": [0, 1, 3, 4, 5, 6, 7], "edit": [0, 8, 10], "updat": [0, 1, 4, 6, 7, 8, 10, 12], "first": [0, 10], "name": [0, 5, 6, 8, 12], "last": [0, 12], "biographi": 0, "birth": [0, 8], "date": [0, 5, 7, 8, 10], "format": [0, 5, 7], "y": [0, 5, 7, 12], "d": [0, 5, 7], "boolean": [0, 1, 6, 9], "displai": [0, 7, 8, 9, 10, 11, 12, 14], "highest": [0, 3, 10], "ascent": [0, 3, 7, 8, 10], "total": [0, 8, 10], "distanc": [0, 3, 7, 8, 10], "imperi": [0, 8, 10], "unit": [0, 8, 12], "time": [0, 5, 7, 8, 10], "zone": 0, "doe": [0, 5, 6, 7, 8], "week": [0, 5, 8, 10], "start": [0, 5, 7, 8, 10, 12, 14], "mondai": [0, 5, 10], "don": 0, "t": [0, 8, 13], "match": [0, 8], "sport": [0, 2, 5, 7, 8, 10, 12], "color": [0, 4, 8, 10], "000000": 0, "stopped_speed_threshold": [0, 4], "user_id": 0, "hexadecim": 0, "when": [0, 1, 8, 9, 10, 12], "ad": [0, 8, 9, 10], "workout": [0, 2, 5, 8, 11, 14], "float": [0, 7], "stop": [0, 8, 10, 12], "speed": [0, 3, 7, 8, 10, 12], "threshold": [0, 8, 10], "us": [0, 6, 7, 8, 10, 11, 12], "gpxpy": [0, 10, 12], "exist": [0, 5, 6, 7, 10, 11, 12], "delet": [0, 6, 7, 8, 9, 10], "reset": [0, 6, 8, 9, 10, 12], "given": [0, 12], "204": [0, 6, 7], "paramet": [0, 4, 5, 6, 7, 8, 10], "No": [0, 6, 7, 8, 11], "multipart": [0, 7], "form": [0, 7], "file": [0, 1, 7, 8, 9, 10, 11, 12], "imag": [0, 6, 7, 8, 10, 12, 14], "extens": [0, 7], "jpg": 0, "png": [0, 7, 12], "gif": 0, "part": [0, 7], "select": [0, 7, 10], "413": [0, 7], "entiti": [0, 7], "too": [0, 7], "larg": [0, 7, 10], "dure": [0, 7], "size": [0, 1, 7, 8, 10], "exce": [0, 7], "0mb": [0, 7], "NO": [0, 6, 7], "handl": [0, 10, 12], "process": [0, 8, 10, 12], "patch": [0, 1, 4, 6, 7], "It": [0, 6, 8, 10, 11, 13], "enabl": [0, 1, 6, 10, 12], "chang": [0, 10, 11, 12], "one": [0, 6, 7, 10], "current": [0, 8], "address": [0, 10, 12], "inform": [0, 8, 11, 12], "anoth": [0, 6, 12], "new": [0, 6, 9, 10, 12], "new_password": 0, "miss": [0, 8], "config": [1, 8, 12], "admin_contact": 1, "gpx_limit_import": 1, "is_email_sending_en": 1, "is_registration_en": 1, "max_single_file_s": 1, "1048576": 1, "max_us": 1, "max_zip_file_s": 1, "10485760": 1, "map_attribut": [1, 12], "copi": [1, 12], "href": [1, 12], "www": [1, 12], "openstreetmap": [1, 8, 12], "org": [1, 12], "copyright": [1, 12], "contributor": [1, 8, 12], "version": [1, 9, 12], "authent": [1, 2, 3, 4, 6, 7], "integ": [1, 4, 5, 6, 7], "max": [1, 6, 7, 8], "number": [1, 6, 7, 8, 10, 12], "zip": [1, 7, 8, 10], "archiv": [1, 8, 10, 12], "singl": [1, 6, 8, 12], "instanc": [1, 8, 10, 12], "you": [1, 4, 5, 6, 7, 11], "do": [1, 4, 5, 6, 7], "have": [1, 4, 5, 6, 7, 8], "permiss": [1, 4, 5, 6, 7], "ping": 1, "health": 1, "check": [1, 8, 12, 13], "pong": 1, "configur": [2, 8, 10, 12], "statist": 2, "all": [3, 4, 5, 6, 12], "follow": [3, 9, 10, 12, 13], "ar": [3, 7, 8, 9, 10, 11, 12, 14], "averag": [3, 7, 8, 10], "farthest": [3, 8, 10], "longest": [3, 8, 10], "durat": [3, 7, 8, 10], "maximum": [3, 8, 10], "return": [3, 6, 7, 8, 12], "non": [4, 11], "is_active_for_us": 4, "label": [4, 8], "cycl": [4, 8, 10], "transport": [4, 8, 10], "hike": [4, 8, 10], "mountain": [4, 10], "bike": [4, 7, 8, 10], "5": [4, 5, 6, 7, 9, 10, 12], "run": [4, 8, 10, 12], "walk": [4, 8, 10], "has_workout": 4, "int": [4, 7], "NOT": [4, 7], "stat": [5, 8], "user_nam": [5, 6], "by_tim": 5, "without": [5, 6, 7, 8, 10, 11], "from": [5, 7, 8, 10, 11], "2018": [5, 7], "06": 5, "2017": [5, 7], "average_spe": 5, "48": 5, "total_asc": 5, "203": 5, "156": [5, 8], "15": [5, 7], "282": 5, "12341": 5, "16": [5, 7], "99": [5, 8], "150": 5, "178": [5, 8], "47": [5, 7, 8], "9960": 5, "95": [5, 8], "46": [5, 8], "78": 5, "613": 5, "1267": 5, "queri": [5, 6, 7], "end": [5, 7], "frame": 5, "sundai": [5, 7, 10], "month": [5, 8, 10], "year": [5, 10], "default": [5, 6, 7, 8, 10, 12], "by_sport": 5, "uploads_dir_s": 5, "1000": 5, "regardless": 6, "right": [6, 8, 9, 10, 12], "some": [6, 7, 8, 11, 12], "order_bi": 6, "workouts_count": 6, "par_pag": 6, "is_admin": 6, "sat": 6, "20": 6, "03": [6, 7], "fr": [6, 12], "page": [6, 7, 8], "pagin": [6, 7], "per_pag": [6, 7], "per": [6, 7, 8], "q": 6, "sort": [6, 7], "criteria": 6, "order": [6, 7, 8], "asc": 6, "detail": [6, 8, 14], "other": [6, 12], "jpeg": 6, "add": [6, 8, 9, 10, 11], "remov": [6, 8, 9, 10], "modifi": [6, 8, 9, 12], "new_email": 6, "reset_password": 6, "differ": [6, 8, 10], "than": [6, 8], "curent": 6, "A": [6, 8, 9, 10, 12, 13], "own": [6, 11], "except": [6, 13], "he": 6, "": [6, 7, 8, 12], "john_do": 6, "your": [6, 11, 12], "02": 7, "31": 7, "least": 7, "ave_spe": 7, "bound": 7, "creation_d": 7, "51": 7, "descent": [7, 8, 10], "17": [7, 12], "04": 7, "kjxavsturjvoah2wvcegef": 7, "map": [7, 8, 10, 11, 14], "max_alt": 7, "max_spe": 7, "min_alt": 7, "modification_d": 7, "move": [7, 8], "next_workout": 7, "note": [7, 8, 10, 12], "paus": [7, 8], "previous_workout": 7, "mon": 7, "jan": 7, "segment": [7, 8, 10], "titl": 7, "weather_end": 7, "weather_start": 7, "with_gpx": 7, "100": [7, 8, 10], "distance_from": 7, "minim": 7, "distance_to": 7, "maxim": 7, "duration_from": 7, "h": [7, 10], "duration_to": 7, "ave_speed_from": 7, "ave_speed_to": 7, "max_speed_from": 7, "max_speed_to": 7, "desc": 7, "workout_short_id": 7, "57": [7, 8], "45": 7, "22": 7, "gpx": [7, 8, 10, 11, 12], "morn": 7, "acit": 7, "short": 7, "leaflet": [7, 12], "chart_data": 7, "chart": [7, 8, 10, 12], "rechart": 7, "elev": [7, 8, 10, 12], "279": 7, "latitud": 7, "5078118": 7, "longitud": 7, "1232004": 7, "63": 7, "fri": 7, "44": [7, 8], "7": [7, 12], "7380": 7, "280": 7, "5079733": 7, "1234538": 7, "39": 7, "segment_id": 7, "map_id": 7, "fa33f4d996844a5c73ecd1ae24456ab8": 7, "1563529507772": 7, "map_til": 7, "z": [7, 12], "x": [7, 12], "tile": [7, 8], "c": [7, 12], "4109": 7, "2930": 7, "subdomain": [7, 8, 12], "zoom": 7, "index": 7, "along": 7, "axi": 7, "download": [7, 8, 10, 12], "xml": 7, "201": [7, 8], "no_gpx": 7, "uuid": [7, 8], "km": [7, 10], "second": 7, "mandatori": [7, 8, 12], "213": 8, "measur": 8, "should": [8, 12], "ft": 8, "mi": 8, "223": 8, "icon": [8, 12], "167": 8, "dashboard": 8, "162": 8, "thank": 8, "fmstrat": 8, "In": [8, 10], "contain": [8, 10, 12], "databas": [8, 10, 12, 13], "migrat": [8, 9, 12], "see": [8, 10, 11, 12, 13], "upgrad": 8, "document": [8, 11, 12], "210": 8, "could": 8, "environ": [8, 9, 13], "variabl": [8, 13], "staticmap_subdomain": [8, 12], "209": 8, "incorrect": 8, "track": [8, 11], "multipl": 8, "gorgobacka": 8, "now": [8, 9, 10, 12], "german": 8, "And": 8, "weblat": 8, "detect": 8, "browser": 8, "pr": 8, "208": 8, "card": 8, "html": 8, "attribut": [8, 12], "197": 8, "196": 8, "manag": [8, 9], "tool": [8, 12], "190": 8, "were": 8, "j": [8, 12], "lavoi": 8, "193": 8, "192": 8, "instead": [8, 10], "191": 8, "layout": 8, "includ": 8, "195": 8, "affect": 8, "previous": 8, "import": [8, 12], "cc4287e": 8, "docker": 8, "env": [8, 12], "offset": 8, "depend": [8, 12], "refacto": 8, "befor": [8, 12], "introduc": 8, "possibl": [8, 10, 11, 12], "smtp": [8, 12], "reduc": 8, "pre": 8, "requisit": 8, "To": [8, 12], "cli": [8, 9, 10, 12], "180": 8, "cannot": [8, 10], "tl": [8, 12], "177": 8, "posit": [8, 10], "small": 8, "screen": [8, 10], "175": 8, "refresh": 8, "173": 8, "link": [8, 12], "171": 8, "correctli": 8, "need": [8, 12], "sent": [8, 10, 12], "155": 8, "106": 8, "169": 8, "161": 8, "160": 8, "app": [8, 11], "sever": [8, 11, 12], "danielsiersleben": 8, "report": 8, "initi": [8, 12], "command": [8, 10, 11, 12], "set": [8, 9, 10, 12, 13], "149": 8, "initialis": [8, 12], "152": 8, "autoescap": 8, "jinja": 8, "templat": 8, "151": 8, "sanit": 8, "input": 8, "serv": [8, 12], "dramatiq": [8, 12], "warn": [8, 10], "launch": 8, "worker": [8, 12], "w": 8, "script": 8, "entrypoint": 8, "drop": 8, "avoid": 8, "product": 8, "dotenv": 8, "146": 8, "filter": [8, 10], "145": 8, "model": 8, "140": 8, "fullscreen": 8, "control": [8, 10], "138": 8, "135": 8, "finish": 8, "marker": 8, "134": 8, "wind": [8, 10], "direct": [8, 10], "877fa0f": 8, "calendar": [8, 10], "resolut": 8, "131": 8, "129": 8, "127": [8, 12], "pars": [8, 12], "legitim": 8, "uri": 8, "localhost": [8, 12], "25": [8, 12], "123": 8, "121": 8, "snowsho": [8, 10], "116": 8, "better": 8, "ui": 8, "button": 8, "graph": 8, "115": 8, "option": [8, 9, 12], "91": 8, "min": 8, "altitud": 8, "90": 8, "seem": 8, "104": 8, "switch": 8, "agplv3": 8, "licens": [8, 11, 12], "101": 8, "full": [8, 10], "client": [8, 12], "develop": [8, 9, 11], "98": 8, "109": 8, "support": [8, 10, 13], "slow": 8, "movement": 8, "84": 8, "93": 8, "paf38": 8, "83": 8, "gener": [8, 10, 12], "static": [8, 12], "keep": [8, 11, 12], "default_staticmap": [8, 12], "81": 8, "remain": 8, "textarea": 8, "82": 8, "dai": [8, 10], "80": [8, 12], "save": [8, 10], "79": 8, "fail": [8, 14], "make": [8, 12], "rebuild": 8, "75": 8, "same": 8, "python": [8, 12], "javascript": [8, 12], "due": 8, "sqlalchemi": [8, 12, 13], "engin": [8, 12, 13], "postgr": [8, 13], "longer": [8, 13], "database_url": [8, 12], "postgresql": [8, 12, 13], "72": 8, "exceed": 8, "71": 8, "greater": 8, "70": 8, "less": 8, "upload": [8, 9, 10, 12], "66": 8, "limit": [8, 10], "64": 8, "shown": [8, 14], "62": 8, "refactor": 8, "evalu": [8, 12], "purpos": [8, 12], "standard": [8, 12], "term": [8, 12], "directori": [8, 12], "also": [8, 9, 11, 12], "59": 8, "major": 8, "instal": [8, 11], "becom": 8, "more": [8, 10, 11, 12], "easi": 8, "read": 8, "been": [8, 11], "renam": 8, "layer": [8, 12], "replac": [8, 12], "thunderforest": [8, 12], "outdoor": [8, 11, 12], "54": 8, "53": 8, "simplifi": 8, "redi": [8, 12], "complet": 8, "side": 8, "4c3fc34": 8, "empti": [8, 9, 12], "logout": 8, "34614d5": 8, "spinner": 8, "load": [8, 13], "b862a77": 8, "2e1ee2c": 8, "interceptor": 8, "rout": 8, "definit": 8, "down": 8, "weekend": 8, "background": 8, "40": 8, "local": [8, 11, 12], "i18n": 8, "41": 8, "show": [8, 9], "point": [8, 12], "mous": 8, "over": 8, "choos": [8, 10], "36": 8, "33": 8, "37": 8, "list": [8, 11, 12], "34": 8, "weather": [8, 10, 12], "anymor": 8, "poetri": [8, 12], "pipenv": 8, "packag": [8, 12], "calcul": 8, "28": 8, "26": 8, "tooltip": [8, 10], "creation": [8, 10], "montain": 8, "even": [8, 10], "enter": [8, 10], "darkski": [8, 10], "kei": [8, 10, 12], "farest": 8, "search": 8, "owner": [8, 10], "view": [8, 10], "usag": 9, "arg": 9, "fittracke": [9, 10, 12, 14], "help": 9, "exit": 9, "deprec": 9, "next": [9, 10], "fittrackee_set_admin": 9, "fittrackee_upgrade_db": 9, "appli": 9, "descript": [9, 12], "electr": 10, "row": 10, "ski": 10, "alpin": 10, "cross": 10, "countri": 10, "trail": 10, "overridden": 10, "which": 10, "up": [10, 11], "relat": [10, 12], "store": [10, 11], "metric": 10, "system": [10, 12], "arrow": 10, "indic": 10, "come": 10, "period": 10, "hidden": 10, "mai": [10, 11, 12], "origin": 10, "dropdown": 10, "For": [10, 12], "On": [10, 12], "case": [10, 12], "line": [10, 11, 12], "between": 10, "hide": 10, "overrid": 10, "appear": 10, "still": [10, 11], "defin": 10, "rais": 10, "necessari": [10, 12], "like": [10, 12], "nginx": [10, 12], "lock": 10, "via": 10, "mobil": 11, "yet": 11, "export": 11, "them": 11, "android": 11, "exhaust": 11, "runner": 11, "gpl": 11, "v3": 11, "forrunn": 11, "opentrack": 11, "apach": 11, "fitotrack": 11, "open": [11, 12], "street": 11, "under": [11, 12], "heavi": [11, 12], "featur": [11, 12], "unstabl": [11, 12], "issu": [11, 12], "interfac": [11, 12], "troubleshoot": 11, "written": 12, "typescript": 12, "flask": 12, "staticmap": 12, "coordin": 12, "forecast": 12, "io": 12, "fetch": 12, "dark": 12, "sky": 12, "former": 12, "task": 12, "queue": 12, "vue3": 12, "vuex": 12, "logo": 12, "made": 12, "freepik": 12, "flaticon": 12, "fork": 12, "awesom": 12, "yarn": 12, "compos": 12, "step": 12, "describ": 12, "linux": 12, "test": 12, "debian": 12, "arch": 12, "o": 12, "encount": 12, "adapt": 12, "sinc": 12, "makefil": 12, "custom": 12, "librari": 12, "thei": 12, "method": 12, "flask_app": 12, "modul": 12, "pwd": 12, "__main__": 12, "py": 12, "els": 12, "host": 12, "port": 12, "5000": 12, "app_set": 12, "productionconfig": 12, "app_secret_kei": 12, "secret": 12, "app_work": 12, "spawn": 12, "gunicorn": [12, 13], "app_log": 12, "path": [12, 13], "upload_fold": [12, 13], "absolut": [12, 13], "where": 12, "folder": 12, "application_directori": 12, "With": 12, "virtualenv": 12, "5432": 12, "begin": 12, "database_disable_pool": 12, "pool": 12, "entri": 12, "directli": 12, "ui_url": 12, "email_url": [12, 13], "sender_email": 12, "sender": 12, "redis_url": 12, "workers_process": 12, "tile_server_url": 12, "b": 12, "osm": 12, "franc": 12, "target": 12, "_blank": 12, "rel": 12, "noopen": 12, "noreferr": 12, "komoot": 12, "de": 12, "otherwis": 12, "insensit": 12, "weather_api_kei": 12, "weather_api": 12, "vue_app_api_url": 12, "unencrypt": 12, "ssl": 12, "465": 12, "starttl": 12, "587": 12, "office365": 12, "work": 12, "omit": 12, "old": 12, "adress": 12, "apikei": 12, "xxxx": 12, "servic": 12, "expect": 12, "osmfr": 12, "fond": 12, "cart": 12, "par": 12, "mention": 12, "legal": 12, "nofollow": 12, "sou": 12, "nbsp": 12, "creativecommon": 12, "sa": 12, "licenc": 12, "cc": 12, "BY": 12, "chosen": 12, "randomli": 12, "recommend": 12, "wai": 12, "pip": 12, "WITH": 12, "grant": 12, "privileg": 12, "ON": 12, "TO": 12, "nano": 12, "schema": 12, "ftcli": 12, "db": 12, "fittrackee_work": 12, "systemd": 12, "3000": 12, "archlinux": 12, "yai": 12, "project": 12, "clone": 12, "repo": 12, "git": 12, "github": 12, "samr1": 12, "cd": 12, "vue": 12, "releas": 12, "v0": 12, "wget": 12, "tar": 12, "gz": 12, "xzf": 12, "mv": 12, "sql": 12, "backup": 12, "pg_dump": 12, "u": 12, "changelog": 12, "restart": 12, "pull": 12, "repositori": 12, "overwrit": 12, "cp": 12, "r": 12, "There": 12, "One": 12, "proxi": 12, "pass": 12, "distribut": 12, "network": 12, "startlimitintervalsec": 12, "simpl": 12, "alwai": 12, "restartsec": 12, "standardoutput": 12, "syslog": 12, "standarderror": 12, "syslogidentifi": 12, "workingdirectori": 12, "home": 12, "execstart": 12, "venv": 12, "bin": 12, "create_app": 12, "logfil": 12, "wantedbi": 12, "multi": 12, "OF": 12, "listen": 12, "443": 12, "http2": 12, "server_nam": 12, "ssl_certif": 12, "fullchain": 12, "pem": 12, "ssl_certificate_kei": 12, "privkei": 12, "proxy_pass": 12, "proxy_redirect": 12, "proxy_set_head": 12, "real": 12, "ip": 12, "remote_addr": 12, "forward": 12, "proxy_add_x_forwarded_for": 12, "301": 12, "request_uri": 12, "larger": 12, "client_max_body_s": 12, "build": 12, "init": 12, "8025": 12, "access": 12, "mailhog": 12, "shell": 12, "insid": 12, "addit": 12, "fittrackee_cli": 12, "lint": 12, "exc": 13, "nosuchmoduleerror": 13, "plugin": 13, "dialect": 13, "invalidemailurlschem": 13, "todo": 15}, "objects": {"": [[0, 0, 1, "post--api-auth-account-confirm", "/api/auth/account/confirm"], [0, 0, 1, "post--api-auth-account-resend-confirmation", "/api/auth/account/resend-confirmation"], [0, 0, 1, "post--api-auth-email-update", "/api/auth/email/update"], [0, 0, 1, "post--api-auth-login", "/api/auth/login"], [0, 0, 1, "post--api-auth-password-reset-request", "/api/auth/password/reset-request"], [0, 0, 1, "post--api-auth-password-update", "/api/auth/password/update"], [0, 1, 1, "delete--api-auth-picture", "/api/auth/picture"], [0, 0, 1, "post--api-auth-picture", "/api/auth/picture"], [0, 2, 1, "get--api-auth-profile", "/api/auth/profile"], [0, 0, 1, "post--api-auth-profile-edit", "/api/auth/profile/edit"], [0, 3, 1, "patch--api-auth-profile-edit-account", "/api/auth/profile/edit/account"], [0, 0, 1, "post--api-auth-profile-edit-preferences", "/api/auth/profile/edit/preferences"], [0, 0, 1, "post--api-auth-profile-edit-sports", "/api/auth/profile/edit/sports"], [0, 1, 1, "delete--api-auth-profile-reset-sports-(sport_id)", "/api/auth/profile/reset/sports/(sport_id)"], [0, 0, 1, "post--api-auth-register", "/api/auth/register"], [1, 2, 1, "get--api-config", "/api/config"], [1, 3, 1, "patch--api-config", "/api/config"], [1, 2, 1, "get--api-ping", "/api/ping"], [3, 2, 1, "get--api-records", "/api/records"], [4, 2, 1, "get--api-sports", "/api/sports"], [4, 2, 1, "get--api-sports-(int-sport_id)", "/api/sports/(int:sport_id)"], [4, 3, 1, "patch--api-sports-(int-sport_id)", "/api/sports/(int:sport_id)"], [5, 2, 1, "get--api-stats-(user_name)-by_sport", "/api/stats/(user_name)/by_sport"], [5, 2, 1, "get--api-stats-(user_name)-by_time", "/api/stats/(user_name)/by_time"], [5, 2, 1, "get--api-stats-all", "/api/stats/all"], [6, 2, 1, "get--api-users", "/api/users"], [6, 1, 1, "delete--api-users-(user_name)", "/api/users/(user_name)"], [6, 2, 1, "get--api-users-(user_name)", "/api/users/(user_name)"], [6, 3, 1, "patch--api-users-(user_name)", "/api/users/(user_name)"], [6, 2, 1, "get--api-users-(user_name)-picture", "/api/users/(user_name)/picture"], [7, 2, 1, "get--api-workouts", "/api/workouts"], [7, 0, 1, "post--api-workouts", "/api/workouts"], [7, 1, 1, "delete--api-workouts-(string-workout_short_id)", "/api/workouts/(string:workout_short_id)"], [7, 2, 1, "get--api-workouts-(string-workout_short_id)", "/api/workouts/(string:workout_short_id)"], [7, 3, 1, "patch--api-workouts-(string-workout_short_id)", "/api/workouts/(string:workout_short_id)"], [7, 2, 1, "get--api-workouts-(string-workout_short_id)-chart_data", "/api/workouts/(string:workout_short_id)/chart_data"], [7, 2, 1, "get--api-workouts-(string-workout_short_id)-chart_data-segment-(int-segment_id)", "/api/workouts/(string:workout_short_id)/chart_data/segment/(int:segment_id)"], [7, 2, 1, "get--api-workouts-(string-workout_short_id)-gpx", "/api/workouts/(string:workout_short_id)/gpx"], [7, 2, 1, "get--api-workouts-(string-workout_short_id)-gpx-download", "/api/workouts/(string:workout_short_id)/gpx/download"], [7, 2, 1, "get--api-workouts-(string-workout_short_id)-gpx-segment-(int-segment_id)", "/api/workouts/(string:workout_short_id)/gpx/segment/(int:segment_id)"], [7, 2, 1, "get--api-workouts-map-(map_id)", "/api/workouts/map/(map_id)"], [7, 0, 1, "post--api-workouts-no_gpx", "/api/workouts/no_gpx"], [12, 4, 1, "-", "APP_LOG"], [12, 4, 1, "-", "APP_SECRET_KEY"], [12, 4, 1, "-", "APP_SETTINGS"], [12, 4, 1, "-", "APP_WORKERS"], [12, 4, 1, "-", "DATABASE_DISABLE_POOLING"], [12, 4, 1, "-", "DATABASE_URL"], [12, 4, 1, "-", "DEFAULT_STATICMAP"], [12, 4, 1, "-", "EMAIL_URL"], [12, 4, 1, "-", "FLASK_APP"], [12, 4, 1, "-", "HOST"], [12, 4, 1, "-", "MAP_ATTRIBUTION"], [12, 4, 1, "-", "PORT"], [12, 4, 1, "-", "REDIS_URL"], [12, 4, 1, "-", "SENDER_EMAIL"], [12, 4, 1, "envvar-STATICMAP_SUBDOMAINS", "STATICMAP_SUBDOMAINS \ud83c\udd95"], [12, 4, 1, "-", "TILE_SERVER_URL"], [12, 4, 1, "-", "UI_URL"], [12, 4, 1, "-", "UPLOAD_FOLDER"], [12, 4, 1, "-", "VUE_APP_API_URL"], [12, 4, 1, "-", "WEATHER_API_KEY"], [12, 4, 1, "-", "WORKERS_PROCESSES"]], "/api/workouts/map_tile/(s)/(z)/(x)/(y)": [[7, 2, 1, "get--api-workouts-map_tile-(s)-(z)-(x)-(y).png", "png"]]}, "objtypes": {"0": "http:post", "1": "http:delete", "2": "http:get", "3": "http:patch", "4": "std:envvar"}, "objnames": {"0": ["http", "post", "HTTP post"], "1": ["http", "delete", "HTTP delete"], "2": ["http", "get", "HTTP get"], "3": ["http", "patch", "HTTP patch"], "4": ["std", "envvar", "environment variable"]}, "titleterms": {"authent": 0, "configur": 1, "api": 2, "document": 2, "endpoint": 2, "record": 3, "sport": 4, "statist": [5, 8, 10], "user": [6, 9, 15], "workout": [7, 10, 13], "chang": 8, "log": 8, "version": 8, "0": 8, "6": 8, "11": 8, "2022": 8, "07": 8, "27": 8, "issu": 8, "close": 8, "bug": 8, "fix": 8, "pull": 8, "request": 8, "featur": [8, 10], "10": 8, "13": 8, "9": 8, "03": 8, "translat": [8, 10], "8": 8, "06": 8, "22": 8, "misc": 8, "7": 8, "05": 8, "29": 8, "5": 8, "04": 8, "24": 8, "4": 8, "23": 8, "3": 8, "09": 8, "2": 8, "1": 8, "02": 8, "secur": 8, "01": 8, "19": 8, "new": 8, "2021": 8, "12": 8, "30": 8, "14": 8, "16": 8, "21": 8, "17": 8, "31": 8, "2020": 8, "fittracke": [8, 11, 13], "pypi": [8, 12], "administr": [8, 10, 13], "15": 8, "improv": 8, "minor": 8, "avail": 8, "french": 8, "2019": 8, "first": 8, "releas": 8, "2018": 8, "command": 9, "line": 9, "interfac": 9, "databas": 9, "ftcli": 9, "db": 9, "upgrad": [9, 12], "drop": 9, "updat": 9, "account": 10, "prefer": 10, "screenshot": 10, "dashboard": 10, "detail": [10, 13], "list": 10, "tabl": 11, "content": 11, "instal": 12, "prerequisit": 12, "environ": 12, "variabl": 12, "email": 12, "map": [12, 13], "tile": 12, "server": 12, "from": 12, "sourc": 12, "dev": 12, "product": 12, "prod": 12, "deploy": 12, "docker": 12, "develop": 12, "fail": 13, "start": 13, "imag": 13, "ar": 13, "displai": 13, "i": 13, "shown": 13, "troubleshoot": 14}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["api/auth", "api/configuration", "api/index", "api/oauth2", "api/records", "api/sports", "api/stats", "api/users", "api/workouts", "apps", "changelog", "cli", "features", "index", "installation", "troubleshooting/administrator", "troubleshooting/index", "troubleshooting/user"], "filenames": ["api/auth.rst", "api/configuration.rst", "api/index.rst", "api/oauth2.rst", "api/records.rst", "api/sports.rst", "api/stats.rst", "api/users.rst", "api/workouts.rst", "apps.rst", "changelog.md", "cli.rst", "features.rst", "index.rst", "installation.rst", "troubleshooting/administrator.rst", "troubleshooting/index.rst", "troubleshooting/user.rst"], "titles": ["Authentication", "Configuration", "API documentation", "OAuth2", "Records", "Sports", "Statistics", "Users", "Workouts", "Third-party applications", "Change log", "Command line interface", "Features", "FitTrackee", "Installation", "Administrator", "Troubleshooting", "User"], "terms": {"post": [0, 3, 8], "api": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14], "auth": [0, 1, 3, 4, 5, 6, 7, 8, 9, 14], "regist": [0, 1, 14], "user": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 14, 16], "send": [0, 7, 10, 12, 14], "confirm": [0, 3, 10, 12, 14], "email": [0, 1, 7, 10, 11, 12, 15], "The": [0, 9, 10, 11, 12, 14], "newli": [0, 14], "creat": [0, 3, 8, 9, 10, 12, 14], "account": [0, 7, 10, 11, 14], "i": [0, 1, 3, 9, 10, 11, 12, 13, 14, 16], "inact": [0, 7, 12, 14], "must": [0, 1, 3, 5, 7, 10, 12, 14, 15], "hi": [0, 7, 10, 12], "activ": [0, 5, 7, 10, 11, 12, 13, 14], "exampl": [0, 1, 3, 4, 5, 6, 7, 8, 9, 13, 14], "request": [0, 1, 3, 4, 5, 6, 7, 8, 9, 14], "http": [0, 1, 3, 4, 5, 6, 7, 8, 14], "1": [0, 1, 3, 4, 5, 6, 7, 8, 12, 14], "content": [0, 1, 3, 4, 5, 6, 7, 8], "type": [0, 1, 3, 4, 5, 6, 7, 8, 14], "applic": [0, 1, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14], "json": [0, 1, 3, 4, 5, 6, 7, 8], "respons": [0, 1, 3, 4, 5, 6, 7, 8], "success": [0, 1, 3, 4, 5, 6, 7, 8], "200": [0, 1, 3, 4, 5, 6, 7, 8, 10], "statu": [0, 1, 3, 4, 5, 6, 7, 8, 11], "error": [0, 1, 3, 5, 7, 8, 10, 12, 14, 15], "registr": [0, 1, 10, 12, 14], "400": [0, 1, 3, 5, 7, 8], "bad": [0, 1, 3, 5, 7, 8], "messag": [0, 1, 3, 8, 10, 11], "valid": [0, 1, 3, 4, 5, 6, 7, 8, 10, 14, 15], "provid": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15], "n": 0, "object": [0, 1, 5, 7, 8], "usernam": [0, 6, 7, 10, 14], "string": [0, 1, 3, 5, 6, 7, 8, 14], "3": [0, 5, 6, 7, 8, 12, 14], "30": [0, 6], "charact": [0, 10], "requir": [0, 9, 10, 14], "password": [0, 7, 10, 11, 12, 14], "8": [0, 8], "lang": [0, 10], "languag": [0, 7, 10, 12], "prefer": [0, 7, 10], "invalid": [0, 1, 3, 4, 5, 6, 7, 8, 10, 14], "fallback": 0, "en": [0, 7], "english": 0, "code": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10], "ok": [0, 1, 3, 4, 5, 6, 7, 8], "payload": [0, 1, 3, 5, 7, 8], "sorri": 0, "alreadi": 0, "taken": 0, "onli": [0, 3, 7, 8, 9, 10, 11, 12, 14], "alphanumer": [0, 10], "underscor": 0, "_": [0, 10], "allow": [0, 1, 8, 9, 10, 12, 13], "403": [0, 1, 5, 6, 7, 8], "forbidden": [0, 1, 5, 6, 7, 8], "disabl": [0, 10, 12, 14], "500": [0, 1, 5, 7, 8, 10], "intern": [0, 1, 5, 7, 8], "server": [0, 1, 5, 7, 8, 10, 12, 13], "pleas": [0, 1, 3, 4, 5, 6, 7, 8, 10], "try": [0, 7, 8], "again": [0, 1, 3, 4, 5, 6, 7, 8], "contact": [0, 1, 7, 8, 12], "administr": [0, 1, 7, 8, 9, 16], "after": [0, 3, 10, 12, 14], "auth_token": 0, "web": [0, 9, 13, 14], "token": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11], "resend": 0, "instruct": [0, 10, 12, 14], "If": [0, 3, 12, 14], "thi": [0, 3, 8, 10, 11, 12, 13, 14], "endpoint": [0, 1, 3, 9, 10], "avail": [0, 4, 9, 11, 12, 14], "resent": 0, "404": [0, 3, 5, 6, 7, 8, 10], "Not": [0, 3, 5, 6, 7, 8], "found": [0, 3, 5, 6, 7, 8, 10], "url": [0, 3, 10, 14, 15], "wa": [0, 10], "login": 0, "an": [0, 1, 3, 5, 7, 9, 10, 12, 14, 15], "can": [0, 7, 9, 10, 12, 13, 14, 15], "log": [0, 1, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15], "successfulli": 0, "401": [0, 1, 3, 4, 5, 6, 7, 8], "unauthor": [0, 1, 3, 4, 5, 6, 7, 8], "credenti": [0, 14], "get": [0, 1, 3, 4, 5, 6, 7, 8], "profil": [0, 3, 9, 10], "info": 0, "scope": [0, 1, 3, 4, 5, 6, 7, 8, 9], "read": [0, 3, 4, 5, 6, 7, 8, 9, 10], "data": [0, 1, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14], "admin": [0, 1, 4, 5, 6, 7, 8, 10, 11, 12, 14], "fals": [0, 1, 3, 5, 7, 8, 14], "bio": [0, 7], "null": [0, 5, 7, 8], "birth_dat": [0, 7], "created_at": [0, 7], "sun": [0, 4, 7, 8], "14": [0, 3, 7, 8], "jul": [0, 4, 7, 8], "2019": [0, 4, 6, 7, 8], "09": [0, 7], "58": [0, 7, 10], "gmt": [0, 3, 4, 7, 8], "display_asc": 0, "true": [0, 1, 3, 5, 7, 10, 14], "sam": [0, 4, 7, 8], "com": [0, 1, 3, 7, 14], "first_nam": [0, 7], "imperial_unit": [0, 7], "is_act": [0, 5, 7], "last_nam": [0, 7], "locat": [0, 7, 14], "nb_sport": [0, 7], "nb_workout": [0, 6, 7], "6": [0, 1, 5, 7, 8, 11, 12, 14], "pictur": [0, 7, 8, 10], "record": [0, 2, 7, 8, 10, 12], "id": [0, 3, 4, 5, 6, 7, 8], "9": [0, 4, 7, 12, 14], "record_typ": [0, 4, 7, 8], "AS": [0, 4, 7, 8], "sport_id": [0, 4, 5, 6, 7, 8], "valu": [0, 3, 4, 7, 8, 14], "18": [0, 4, 7, 8, 10], "workout_d": [0, 4, 7, 8], "07": [0, 4, 7, 8], "08": [0, 4, 7, 8], "00": [0, 4, 7, 8], "workout_id": [0, 4, 7, 8], "hvybqybra7wwxpastwr4v2": [0, 4, 7, 8], "10": [0, 1, 4, 7, 8, 14], "fd": [0, 4, 7, 8], "13": [0, 4, 7, 8], "ha": [0, 4, 7, 8, 12, 13], "43": [0, 4, 7, 8, 10], "97": [0, 4, 7, 8], "11": [0, 1, 4, 7, 12, 14], "ld": [0, 4, 7, 8], "01": [0, 4, 6, 7, 8], "12": [0, 4, 7, 8], "m": [0, 4, 6, 7, 8], "sports_list": [0, 7], "4": [0, 5, 6, 7, 8, 14], "timezon": [0, 7, 8, 10, 12], "europ": [0, 7], "pari": [0, 7], "total_dist": [0, 6, 7], "67": [0, 7], "895": [0, 7], "total_dur": [0, 6, 7], "50": [0, 7, 10], "27": [0, 3, 7], "weekm": [0, 6, 7], "header": [0, 1, 3, 4, 5, 6, 7, 8], "author": [0, 1, 3, 4, 5, 6, 7, 8, 9, 14], "oauth": [0, 1, 3, 4, 5, 6, 7, 8, 9, 14], "2": [0, 1, 3, 4, 5, 6, 7, 8, 9, 12, 14], "0": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14], "bearer": [0, 1, 3, 4, 5, 6, 7, 8], "signatur": [0, 1, 3, 4, 5, 6, 7, 8], "expir": [0, 1, 3, 4, 5, 6, 7, 8, 11], "edit": [0, 10, 12], "write": [0, 1, 3, 5, 7, 8, 9], "updat": [0, 1, 5, 7, 8, 10, 12, 14], "first": [0, 3, 9, 12], "name": [0, 3, 7, 10, 14], "last": [0, 14], "biographi": 0, "birth": [0, 10], "date": [0, 6, 8, 10, 12], "format": [0, 6, 8], "y": [0, 6, 8, 14], "d": [0, 6, 8], "boolean": [0, 1, 3, 7, 11], "displai": [0, 8, 10, 11, 12, 13, 14, 16], "highest": [0, 4, 12], "ascent": [0, 4, 8, 10, 12], "total": [0, 3, 10, 12], "distanc": [0, 4, 8, 10, 12], "imperi": [0, 10, 12], "unit": [0, 10, 14], "time": [0, 6, 8, 10, 12], "zone": 0, "doe": [0, 6, 7, 8, 10], "week": [0, 6, 10, 12], "start": [0, 6, 8, 10, 12, 14, 16], "mondai": [0, 6, 12], "don": 0, "t": [0, 10, 15], "match": [0, 10], "sport": [0, 2, 6, 8, 10, 12, 14], "color": [0, 5, 10, 12], "000000": 0, "stopped_speed_threshold": [0, 5], "user_id": 0, "hexadecim": 0, "when": [0, 1, 10, 11, 12, 14], "ad": [0, 10, 11, 12], "workout": [0, 2, 3, 4, 5, 6, 9, 10, 13, 16], "float": [0, 8], "stop": [0, 10, 12, 14], "speed": [0, 4, 8, 10, 12, 14], "threshold": [0, 10, 12], "us": [0, 3, 7, 8, 9, 10, 12, 13, 14], "gpxpy": [0, 12, 14], "exist": [0, 6, 7, 8, 12, 13, 14], "delet": [0, 3, 7, 8, 10, 11, 12], "reset": [0, 7, 10, 11, 12, 14], "given": [0, 3, 14], "204": [0, 3, 7, 8], "paramet": [0, 3, 5, 6, 7, 8, 10, 12], "No": [0, 3, 7, 8, 10, 13], "multipart": [0, 3, 8], "form": [0, 3, 8], "file": [0, 1, 8, 10, 11, 12, 13, 14], "imag": [0, 7, 8, 10, 12, 14, 16], "extens": [0, 8], "jpg": 0, "png": [0, 8, 14], "gif": 0, "part": [0, 8], "select": [0, 8, 12], "413": [0, 8], "entiti": [0, 8], "too": [0, 8], "larg": [0, 8, 12], "dure": [0, 8], "size": [0, 1, 8, 10, 12], "exce": [0, 8], "0mb": [0, 8], "NO": [0, 3, 7, 8], "handl": [0, 12, 14], "process": [0, 10, 12, 14], "patch": [0, 1, 5, 7, 8], "It": [0, 7, 9, 10, 12, 13, 15], "enabl": [0, 1, 7, 12, 14], "chang": [0, 12, 13, 14], "one": [0, 7, 8, 12], "current": [0, 10], "address": [0, 12, 14], "inform": [0, 10, 13, 14], "anoth": [0, 7, 14], "new": [0, 7, 9, 11, 12, 14], "new_password": 0, "miss": [0, 10], "config": [1, 10, 14], "admin_contact": 1, "gpx_limit_import": 1, "is_email_sending_en": 1, "is_registration_en": 1, "max_single_file_s": 1, "1048576": 1, "max_us": 1, "max_zip_file_s": 1, "10485760": 1, "map_attribut": [1, 14], "copi": [1, 14], "href": [1, 14], "www": [1, 14], "openstreetmap": [1, 10, 14], "org": [1, 14], "copyright": [1, 14], "contributor": [1, 10, 14], "version": [1, 11, 14], "authent": [1, 2, 3, 4, 5, 7, 8, 9], "integ": [1, 3, 5, 6, 7, 8], "max": [1, 7, 8, 10], "number": [1, 7, 8, 10, 11, 12, 14], "zip": [1, 8, 10, 12], "archiv": [1, 10, 12, 14], "singl": [1, 7, 10, 14], "instanc": [1, 3, 10, 12, 14], "you": [1, 5, 6, 7, 8, 13], "do": [1, 5, 6, 7, 8], "have": [1, 5, 6, 7, 8, 10], "permiss": [1, 5, 6, 7, 8], "ping": 1, "health": 1, "check": [1, 10, 14, 15], "pong": 1, "configur": [2, 9, 10, 12, 14], "oauth2": [2, 9], "statist": 2, "app": [3, 9, 10, 13], "client": [3, 9, 10, 12, 14], "pagin": [3, 7, 8], "5": [3, 5, 6, 7, 8, 11, 12, 14], "page": [3, 7, 8, 10], "access": [3, 9, 14], "fittracke": [3, 9, 11, 12, 14, 16], "parti": [3, 12, 13], "without": [3, 6, 7, 8, 10, 12, 13], "client_descript": 3, "client_id": 3, "o22a27s2abpuoxjbxv3ujdox": 3, "issued_at": 3, "thu": 3, "juli": 3, "2022": 3, "06": [3, 6], "53": [3, 10], "gpx": [3, 8, 10, 12, 13, 14], "import": [3, 10, 14], "redirect_uri": 3, "callback": 3, "websit": 3, "has_next": 3, "has_prev": 3, "queri": [3, 6, 7, 8], "default": [3, 6, 7, 8, 10, 12, 14], "client_secret": 3, "secret": [3, 14], "client_nam": 3, "client_uri": 3, "arrai": 3, "list": [3, 10, 13, 14], "redirect": 3, "descript": [3, 11, 14], "option": [3, 10, 11, 14], "client_client_id": 3, "NOT": [3, 5, 8], "int": [3, 5, 8], "by_id": 3, "revok": 3, "all": [3, 4, 5, 6, 7, 14], "associ": 3, "issu": [3, 13, 14], "response_typ": 3, "support": [3, 9, 10, 12, 14, 15], "state": 3, "uniqu": 3, "prevent": 3, "cross": [3, 12], "site": 3, "forgeri": 3, "mandatori": [3, 8, 10, 14], "recommend": [3, 9, 14], "code_challeng": 3, "gener": [3, 10, 12, 14], "from": [3, 6, 8, 10, 12, 13], "verifi": 3, "pkce": [3, 9], "code_challenge_method": 3, "method": [3, 14], "challeng": 3, "s256": 3, "return": [3, 4, 7, 8, 10, 14], "authlib": [3, 9, 14], "librari": [3, 9, 14], "refresh": [3, 10], "access_token": 3, "roehv64thcg28wcewzhrnvlusoduvw8nvnhkcml57": 3, "expires_in": 3, "864000": 3, "refresh_token": 3, "nuv9cy8vqonrqkhtz5pqaq2zw7msh0mornpjr14amswd6f6i": 3, "token_typ": 3, "expires_at": 3, "1658660147": 3, "0667062": 3, "grant_typ": 3, "grant": [3, 9, 14], "authorization_cod": 3, "ar": [3, 4, 8, 9, 10, 11, 12, 13, 14, 16], "code_verifi": 3, "follow": [4, 9, 11, 12, 14, 15], "averag": [4, 8, 10, 12], "farthest": [4, 10, 12], "longest": [4, 10, 12], "durat": [4, 8, 10, 12], "maximum": [4, 10, 12], "non": [5, 13], "is_active_for_us": 5, "label": [5, 10], "cycl": [5, 10, 12], "transport": [5, 10, 12], "hike": [5, 10, 12], "mountain": [5, 12], "bike": [5, 8, 10, 12], "run": [5, 10, 12, 14], "walk": [5, 10, 12], "has_workout": 5, "stat": [6, 10], "user_nam": [6, 7], "by_tim": 6, "2018": [6, 8], "2017": [6, 8], "average_spe": 6, "48": 6, "total_asc": 6, "203": 6, "156": [6, 10], "15": [6, 8], "282": 6, "12341": 6, "16": [6, 8], "99": [6, 10], "150": 6, "178": [6, 10], "47": [6, 8, 10], "9960": 6, "95": [6, 10], "46": [6, 10], "78": 6, "613": 6, "1267": 6, "end": [6, 8], "frame": 6, "sundai": [6, 8, 12], "month": [6, 10, 12], "year": [6, 12], "by_sport": 6, "uploads_dir_s": 6, "1000": 6, "regardless": 7, "right": [7, 9, 10, 11, 12, 14], "some": [7, 8, 9, 10, 13, 14], "order_bi": 7, "workouts_count": 7, "par_pag": 7, "is_admin": 7, "sat": 7, "20": 7, "03": [7, 8], "fr": [7, 14], "per_pag": [7, 8], "per": [7, 8, 10], "q": 7, "sort": [7, 8], "criteria": 7, "order": [7, 8, 10], "asc": 7, "detail": [7, 10, 16], "other": [7, 14], "jpeg": 7, "add": [7, 10, 11, 12, 13], "remov": [7, 10, 11, 12], "modifi": [7, 10, 11, 14], "new_email": 7, "reset_password": 7, "differ": [7, 10, 12], "than": [7, 10, 11], "curent": 7, "A": [7, 10, 11, 12, 14, 15], "own": [7, 13], "except": [7, 15], "he": 7, "": [7, 8, 10, 14], "john_do": 7, "your": [7, 13, 14], "02": 8, "31": 8, "least": 8, "ave_spe": 8, "bound": 8, "creation_d": 8, "51": 8, "descent": [8, 10, 12], "17": [8, 14], "04": 8, "kjxavsturjvoah2wvcegef": 8, "map": [8, 10, 12, 13, 16], "max_alt": 8, "max_spe": 8, "min_alt": 8, "modification_d": 8, "move": [8, 10], "next_workout": 8, "note": [8, 10, 12, 14], "paus": [8, 10], "previous_workout": 8, "mon": 8, "jan": 8, "segment": [8, 10, 12], "titl": 8, "weather_end": 8, "weather_start": 8, "with_gpx": 8, "100": [8, 10, 12], "distance_from": 8, "minim": 8, "distance_to": 8, "maxim": 8, "duration_from": 8, "h": [8, 12], "duration_to": 8, "ave_speed_from": 8, "ave_speed_to": 8, "max_speed_from": 8, "max_speed_to": 8, "desc": 8, "workout_short_id": 8, "57": [8, 10], "45": 8, "22": 8, "morn": 8, "short": 8, "leaflet": [8, 14], "chart_data": 8, "chart": [8, 10, 12, 14], "j": [8, 10, 14], "elev": [8, 10, 12, 14], "279": 8, "latitud": 8, "5078118": 8, "longitud": 8, "1232004": 8, "63": 8, "fri": 8, "44": [8, 10], "7": [8, 9, 11, 12, 14], "7380": 8, "280": 8, "5079733": 8, "1234538": 8, "39": 8, "segment_id": 8, "rechart": 8, "map_id": 8, "fa33f4d996844a5c73ecd1ae24456ab8": 8, "1563529507772": 8, "map_til": 8, "z": [8, 14], "x": [8, 14], "tile": [8, 10], "c": [8, 14], "4109": 8, "2930": 8, "subdomain": [8, 10, 14], "zoom": 8, "index": 8, "along": 8, "axi": 8, "download": [8, 10, 12, 14], "xml": 8, "201": [8, 10], "no_gpx": 8, "uuid": [8, 10], "km": [8, 12], "second": 8, "rest": 9, "see": [9, 10, 12, 13, 14, 15], "document": [9, 10, 13, 14], "whose": 9, "most": 9, "To": [9, 10, 14], "interact": 9, "set": [9, 10, 11, 12, 14, 15], "tab": 9, "implement": 9, "flow": 9, "exchang": 9, "better": [9, 10], "secur": 9, "relat": [9, 12, 14], "resourc": 9, "about": 9, "simplifi": [9, 10], "aaron": 9, "parecki": 9, "oauthlib": 9, "213": 10, "measur": 10, "should": [10, 14], "ft": 10, "mi": 10, "223": 10, "icon": [10, 14], "167": 10, "dashboard": 10, "162": 10, "thank": 10, "fmstrat": 10, "In": [10, 12], "contain": [10, 12, 14], "databas": [10, 12, 14, 15], "migrat": [10, 11, 14], "upgrad": 10, "210": 10, "could": 10, "environ": [10, 11, 15], "variabl": [10, 15], "staticmap_subdomain": [10, 14], "209": 10, "incorrect": 10, "track": [10, 13], "multipl": 10, "gorgobacka": 10, "now": [10, 11, 12, 14], "german": 10, "And": 10, "weblat": 10, "detect": 10, "browser": 10, "pr": 10, "208": 10, "card": 10, "html": 10, "attribut": [10, 14], "197": 10, "196": 10, "manag": [10, 11], "tool": [10, 14], "190": 10, "were": 10, "lavoi": 10, "193": 10, "192": 10, "instead": [10, 12], "191": 10, "layout": 10, "includ": 10, "195": 10, "affect": 10, "previous": 10, "cc4287e": 10, "docker": 10, "env": [10, 14], "offset": 10, "depend": [10, 14], "refacto": 10, "befor": [10, 14], "introduc": 10, "possibl": [10, 12, 13, 14], "smtp": [10, 14], "reduc": 10, "pre": 10, "requisit": 10, "cli": [10, 11, 12, 14], "180": 10, "cannot": [10, 12], "tl": [10, 14], "177": 10, "posit": [10, 12], "small": 10, "screen": [10, 12], "175": 10, "173": 10, "link": [10, 14], "171": 10, "correctli": 10, "need": [10, 14], "sent": [10, 12, 14], "155": 10, "106": 10, "169": 10, "161": 10, "160": 10, "sever": [10, 13, 14], "danielsiersleben": 10, "report": 10, "initi": [10, 14], "command": [10, 12, 13, 14], "149": 10, "initialis": [10, 14], "152": 10, "autoescap": 10, "jinja": 10, "templat": 10, "151": 10, "sanit": 10, "input": 10, "serv": [10, 14], "dramatiq": [10, 14], "warn": [10, 12], "launch": 10, "worker": [10, 14], "w": 10, "script": 10, "entrypoint": 10, "drop": 10, "avoid": 10, "product": 10, "dotenv": 10, "146": 10, "filter": [10, 12], "145": 10, "model": 10, "140": 10, "fullscreen": 10, "control": [10, 12], "138": 10, "135": 10, "finish": 10, "marker": 10, "134": 10, "wind": [10, 12], "direct": [10, 12], "877fa0f": 10, "calendar": [10, 12], "resolut": 10, "131": 10, "129": 10, "127": [10, 14], "pars": [10, 14], "legitim": 10, "uri": 10, "localhost": [10, 14], "25": [10, 14], "123": 10, "121": 10, "snowsho": [10, 12], "116": 10, "ui": 10, "button": 10, "graph": 10, "115": 10, "91": 10, "min": 10, "altitud": 10, "90": 10, "seem": 10, "104": 10, "switch": 10, "agplv3": 10, "licens": [10, 13, 14], "101": 10, "full": [10, 12], "develop": [10, 11, 13], "98": 10, "109": 10, "slow": 10, "movement": 10, "84": 10, "93": 10, "paf38": 10, "83": 10, "static": [10, 14], "keep": [10, 13, 14], "default_staticmap": [10, 14], "81": 10, "remain": 10, "textarea": 10, "82": 10, "dai": [10, 11, 12], "80": [10, 14], "save": [10, 12], "79": 10, "fail": [10, 16], "make": [10, 14], "rebuild": 10, "75": 10, "same": 10, "python": [10, 14], "javascript": [10, 14], "due": 10, "sqlalchemi": [10, 14, 15], "engin": [10, 14, 15], "postgr": [10, 15], "longer": [10, 15], "database_url": [10, 14], "postgresql": [10, 14, 15], "72": 10, "exceed": 10, "71": 10, "greater": 10, "70": 10, "less": 10, "upload": [10, 11, 12, 14], "66": 10, "limit": [10, 12], "64": 10, "shown": [10, 16], "62": 10, "refactor": 10, "evalu": [10, 14], "purpos": [10, 14], "standard": [10, 14], "term": [10, 14], "directori": [10, 14], "also": [10, 11, 13, 14], "59": 10, "major": 10, "instal": [10, 13], "becom": 10, "more": [10, 11, 12, 13, 14], "easi": 10, "been": [10, 13], "renam": 10, "layer": [10, 14], "replac": [10, 14], "thunderforest": [10, 14], "outdoor": [10, 13, 14], "54": 10, "redi": [10, 14], "complet": 10, "side": 10, "4c3fc34": 10, "empti": [10, 11, 14], "logout": 10, "34614d5": 10, "spinner": 10, "load": [10, 15], "b862a77": 10, "2e1ee2c": 10, "interceptor": 10, "rout": 10, "definit": 10, "down": 10, "weekend": 10, "background": 10, "40": 10, "local": [10, 13, 14], "i18n": 10, "41": 10, "show": [10, 11], "point": [10, 14], "mous": 10, "over": 10, "choos": [10, 12], "36": 10, "33": 10, "37": 10, "34": 10, "weather": [10, 12, 14], "anymor": 10, "poetri": [10, 14], "pipenv": 10, "packag": [10, 14], "calcul": 10, "28": 10, "26": 10, "tooltip": [10, 12], "creation": [10, 12], "montain": 10, "even": [10, 12], "enter": [10, 12], "darkski": [10, 12], "kei": [10, 12, 14], "farest": 10, "search": 10, "owner": [10, 12], "view": [10, 12], "usag": 11, "arg": 11, "help": 11, "exit": 11, "deprec": 11, "next": [11, 12], "fittrackee_set_admin": 11, "fittrackee_upgrade_db": 11, "appli": 11, "electr": 12, "row": 12, "ski": 12, "alpin": 12, "countri": 12, "trail": 12, "overridden": 12, "which": 12, "up": [12, 13], "store": [12, 13], "metric": 12, "system": [12, 14], "arrow": 12, "indic": 12, "come": 12, "period": 12, "hidden": 12, "mai": [12, 13, 14], "origin": 12, "dropdown": 12, "For": [12, 14], "On": [12, 14], "case": [12, 14], "line": [12, 13, 14], "between": 12, "hide": 12, "overrid": 12, "appear": 12, "still": [12, 13], "third": [12, 13], "defin": 12, "rais": 12, "necessari": [12, 14], "like": [12, 14], "nginx": [12, 14], "lock": 12, "via": 12, "mobil": 13, "yet": 13, "export": 13, "them": 13, "android": 13, "exhaust": 13, "runner": 13, "gpl": 13, "v3": 13, "forrunn": 13, "opentrack": 13, "apach": 13, "fitotrack": 13, "open": [13, 14], "street": 13, "under": [13, 14], "heavi": [13, 14], "featur": [13, 14], "unstabl": [13, 14], "interfac": [13, 14], "troubleshoot": 13, "written": 14, "typescript": 14, "flask": 14, "staticmap": 14, "coordin": 14, "forecast": 14, "io": 14, "fetch": 14, "dark": 14, "sky": 14, "former": 14, "task": 14, "queue": 14, "vue3": 14, "vuex": 14, "logo": 14, "made": 14, "freepik": 14, "flaticon": 14, "fork": 14, "awesom": 14, "yarn": 14, "compos": 14, "step": 14, "describ": 14, "linux": 14, "test": 14, "debian": 14, "arch": 14, "o": 14, "encount": 14, "adapt": 14, "sinc": 14, "makefil": 14, "custom": 14, "thei": 14, "flask_app": 14, "modul": 14, "pwd": 14, "__main__": 14, "py": 14, "els": 14, "host": 14, "port": 14, "5000": 14, "app_set": 14, "productionconfig": 14, "app_secret_kei": 14, "strong": 14, "jwt": 14, "app_work": 14, "spawn": 14, "gunicorn": [14, 15], "app_log": 14, "path": [14, 15], "upload_fold": [14, 15], "absolut": [14, 15], "where": 14, "folder": 14, "application_directori": 14, "With": 14, "virtualenv": 14, "5432": 14, "begin": 14, "database_disable_pool": 14, "pool": 14, "entri": 14, "directli": 14, "ui_url": 14, "email_url": [14, 15], "sender_email": 14, "sender": 14, "redis_url": 14, "workers_process": 14, "tile_server_url": 14, "b": 14, "osm": 14, "franc": 14, "target": 14, "_blank": 14, "rel": 14, "noopen": 14, "noreferr": 14, "komoot": 14, "de": 14, "otherwis": 14, "insensit": 14, "weather_api_kei": 14, "weather_api": 14, "vue_app_api_url": 14, "unencrypt": 14, "ssl": 14, "465": 14, "starttl": 14, "587": 14, "office365": 14, "work": 14, "omit": 14, "old": 14, "adress": 14, "apikei": 14, "xxxx": 14, "servic": 14, "expect": 14, "osmfr": 14, "fond": 14, "cart": 14, "par": 14, "mention": 14, "legal": 14, "nofollow": 14, "sou": 14, "nbsp": 14, "creativecommon": 14, "sa": 14, "licenc": 14, "cc": 14, "BY": 14, "chosen": 14, "randomli": 14, "wai": 14, "pip": 14, "WITH": 14, "privileg": 14, "ON": 14, "TO": 14, "nano": 14, "schema": 14, "ftcli": 14, "db": 14, "fittrackee_work": 14, "systemd": 14, "3000": 14, "archlinux": 14, "yai": 14, "project": 14, "clone": 14, "repo": 14, "git": 14, "github": 14, "samr1": 14, "cd": 14, "vue": 14, "releas": 14, "v0": 14, "wget": 14, "tar": 14, "gz": 14, "xzf": 14, "mv": 14, "sql": 14, "backup": 14, "pg_dump": 14, "u": 14, "changelog": 14, "restart": 14, "pull": 14, "repositori": 14, "overwrit": 14, "cp": 14, "r": 14, "There": 14, "One": 14, "proxi": 14, "pass": 14, "distribut": 14, "network": 14, "startlimitintervalsec": 14, "simpl": 14, "alwai": 14, "restartsec": 14, "standardoutput": 14, "syslog": 14, "standarderror": 14, "syslogidentifi": 14, "workingdirectori": 14, "home": 14, "execstart": 14, "venv": 14, "bin": 14, "create_app": 14, "logfil": 14, "wantedbi": 14, "multi": 14, "OF": 14, "listen": 14, "443": 14, "http2": 14, "server_nam": 14, "ssl_certif": 14, "fullchain": 14, "pem": 14, "ssl_certificate_kei": 14, "privkei": 14, "proxy_pass": 14, "proxy_redirect": 14, "proxy_set_head": 14, "real": 14, "ip": 14, "remote_addr": 14, "forward": 14, "proxy_add_x_forwarded_for": 14, "proto": 14, "scheme": 14, "301": 14, "request_uri": 14, "larger": 14, "client_max_body_s": 14, "build": 14, "init": 14, "8025": 14, "mailhog": 14, "shell": 14, "insid": 14, "addit": 14, "fittrackee_cli": 14, "lint": 14, "exc": 15, "nosuchmoduleerror": 15, "plugin": 15, "dialect": 15, "invalidemailurlschem": 15, "todo": 17}, "objects": {"": [[0, 0, 1, "post--api-auth-account-confirm", "/api/auth/account/confirm"], [0, 0, 1, "post--api-auth-account-resend-confirmation", "/api/auth/account/resend-confirmation"], [0, 0, 1, "post--api-auth-email-update", "/api/auth/email/update"], [0, 0, 1, "post--api-auth-login", "/api/auth/login"], [0, 0, 1, "post--api-auth-password-reset-request", "/api/auth/password/reset-request"], [0, 0, 1, "post--api-auth-password-update", "/api/auth/password/update"], [0, 1, 1, "delete--api-auth-picture", "/api/auth/picture"], [0, 0, 1, "post--api-auth-picture", "/api/auth/picture"], [0, 2, 1, "get--api-auth-profile", "/api/auth/profile"], [0, 0, 1, "post--api-auth-profile-edit", "/api/auth/profile/edit"], [0, 3, 1, "patch--api-auth-profile-edit-account", "/api/auth/profile/edit/account"], [0, 0, 1, "post--api-auth-profile-edit-preferences", "/api/auth/profile/edit/preferences"], [0, 0, 1, "post--api-auth-profile-edit-sports", "/api/auth/profile/edit/sports"], [0, 1, 1, "delete--api-auth-profile-reset-sports-(sport_id)", "/api/auth/profile/reset/sports/(sport_id)"], [0, 0, 1, "post--api-auth-register", "/api/auth/register"], [1, 2, 1, "get--api-config", "/api/config"], [1, 3, 1, "patch--api-config", "/api/config"], [3, 2, 1, "get--api-oauth-apps", "/api/oauth/apps"], [3, 0, 1, "post--api-oauth-apps", "/api/oauth/apps"], [3, 1, 1, "delete--api-oauth-apps-(int-client_id)", "/api/oauth/apps/(int:client_id)"], [3, 2, 1, "get--api-oauth-apps-(int-client_id)-by_id", "/api/oauth/apps/(int:client_id)/by_id"], [3, 0, 1, "post--api-oauth-apps-(int-client_id)-revoke", "/api/oauth/apps/(int:client_id)/revoke"], [3, 2, 1, "get--api-oauth-apps-(string-client_client_id)", "/api/oauth/apps/(string:client_client_id)"], [3, 0, 1, "post--api-oauth-authorize", "/api/oauth/authorize"], [3, 0, 1, "post--api-oauth-revoke", "/api/oauth/revoke"], [3, 0, 1, "post--api-oauth-token", "/api/oauth/token"], [1, 2, 1, "get--api-ping", "/api/ping"], [4, 2, 1, "get--api-records", "/api/records"], [5, 2, 1, "get--api-sports", "/api/sports"], [5, 2, 1, "get--api-sports-(int-sport_id)", "/api/sports/(int:sport_id)"], [5, 3, 1, "patch--api-sports-(int-sport_id)", "/api/sports/(int:sport_id)"], [6, 2, 1, "get--api-stats-(user_name)-by_sport", "/api/stats/(user_name)/by_sport"], [6, 2, 1, "get--api-stats-(user_name)-by_time", "/api/stats/(user_name)/by_time"], [6, 2, 1, "get--api-stats-all", "/api/stats/all"], [7, 2, 1, "get--api-users", "/api/users"], [7, 1, 1, "delete--api-users-(user_name)", "/api/users/(user_name)"], [7, 2, 1, "get--api-users-(user_name)", "/api/users/(user_name)"], [7, 3, 1, "patch--api-users-(user_name)", "/api/users/(user_name)"], [7, 2, 1, "get--api-users-(user_name)-picture", "/api/users/(user_name)/picture"], [8, 2, 1, "get--api-workouts", "/api/workouts"], [8, 0, 1, "post--api-workouts", "/api/workouts"], [8, 1, 1, "delete--api-workouts-(string-workout_short_id)", "/api/workouts/(string:workout_short_id)"], [8, 2, 1, "get--api-workouts-(string-workout_short_id)", "/api/workouts/(string:workout_short_id)"], [8, 3, 1, "patch--api-workouts-(string-workout_short_id)", "/api/workouts/(string:workout_short_id)"], [8, 2, 1, "get--api-workouts-(string-workout_short_id)-chart_data", "/api/workouts/(string:workout_short_id)/chart_data"], [8, 2, 1, "get--api-workouts-(string-workout_short_id)-chart_data-segment-(int-segment_id)", "/api/workouts/(string:workout_short_id)/chart_data/segment/(int:segment_id)"], [8, 2, 1, "get--api-workouts-(string-workout_short_id)-gpx", "/api/workouts/(string:workout_short_id)/gpx"], [8, 2, 1, "get--api-workouts-(string-workout_short_id)-gpx-download", "/api/workouts/(string:workout_short_id)/gpx/download"], [8, 2, 1, "get--api-workouts-(string-workout_short_id)-gpx-segment-(int-segment_id)", "/api/workouts/(string:workout_short_id)/gpx/segment/(int:segment_id)"], [8, 2, 1, "get--api-workouts-map-(map_id)", "/api/workouts/map/(map_id)"], [8, 0, 1, "post--api-workouts-no_gpx", "/api/workouts/no_gpx"], [14, 4, 1, "-", "APP_LOG"], [14, 4, 1, "-", "APP_SECRET_KEY"], [14, 4, 1, "-", "APP_SETTINGS"], [14, 4, 1, "-", "APP_WORKERS"], [14, 4, 1, "-", "DATABASE_DISABLE_POOLING"], [14, 4, 1, "-", "DATABASE_URL"], [14, 4, 1, "-", "DEFAULT_STATICMAP"], [14, 4, 1, "-", "EMAIL_URL"], [14, 4, 1, "-", "FLASK_APP"], [14, 4, 1, "-", "HOST"], [14, 4, 1, "-", "MAP_ATTRIBUTION"], [14, 4, 1, "-", "PORT"], [14, 4, 1, "-", "REDIS_URL"], [14, 4, 1, "-", "SENDER_EMAIL"], [14, 4, 1, "envvar-STATICMAP_SUBDOMAINS", "STATICMAP_SUBDOMAINS \ud83c\udd95"], [14, 4, 1, "-", "TILE_SERVER_URL"], [14, 4, 1, "-", "UI_URL"], [14, 4, 1, "-", "UPLOAD_FOLDER"], [14, 4, 1, "-", "VUE_APP_API_URL"], [14, 4, 1, "-", "WEATHER_API_KEY"], [14, 4, 1, "-", "WORKERS_PROCESSES"]], "/api/workouts/map_tile/(s)/(z)/(x)/(y)": [[8, 2, 1, "get--api-workouts-map_tile-(s)-(z)-(x)-(y).png", "png"]]}, "objtypes": {"0": "http:post", "1": "http:delete", "2": "http:get", "3": "http:patch", "4": "std:envvar"}, "objnames": {"0": ["http", "post", "HTTP post"], "1": ["http", "delete", "HTTP delete"], "2": ["http", "get", "HTTP get"], "3": ["http", "patch", "HTTP patch"], "4": ["std", "envvar", "environment variable"]}, "titleterms": {"authent": 0, "configur": 1, "api": 2, "document": 2, "endpoint": 2, "oauth2": [3, 11], "record": 4, "sport": 5, "statist": [6, 10, 12], "user": [7, 11, 17], "workout": [8, 12, 15], "third": 9, "parti": 9, "applic": 9, "chang": 10, "log": 10, "version": 10, "0": 10, "6": 10, "11": 10, "2022": 10, "07": 10, "27": 10, "issu": 10, "close": 10, "bug": 10, "fix": 10, "pull": 10, "request": 10, "featur": [10, 12], "10": 10, "13": 10, "9": 10, "03": 10, "translat": [10, 12], "8": 10, "06": 10, "22": 10, "misc": 10, "7": 10, "05": 10, "29": 10, "5": 10, "04": 10, "24": 10, "4": 10, "23": 10, "3": 10, "09": 10, "2": 10, "1": 10, "02": 10, "secur": 10, "01": 10, "19": 10, "new": 10, "2021": 10, "12": 10, "30": 10, "14": 10, "16": 10, "21": 10, "17": 10, "31": 10, "2020": 10, "fittracke": [10, 13, 15], "pypi": [10, 14], "administr": [10, 12, 15], "15": 10, "improv": 10, "minor": 10, "avail": 10, "french": 10, "2019": 10, "first": 10, "releas": 10, "2018": 10, "command": 11, "line": 11, "interfac": 11, "databas": 11, "ftcli": 11, "db": 11, "upgrad": [11, 14], "drop": 11, "clean": 11, "updat": 11, "account": 12, "prefer": 12, "screenshot": 12, "dashboard": 12, "detail": [12, 15], "list": 12, "tabl": 13, "content": 13, "instal": 14, "prerequisit": 14, "environ": 14, "variabl": 14, "email": 14, "map": [14, 15], "tile": 14, "server": 14, "from": 14, "sourc": 14, "dev": 14, "product": 14, "prod": 14, "deploy": 14, "docker": 14, "develop": 14, "fail": 15, "start": 15, "imag": 15, "ar": 15, "displai": 15, "i": 15, "shown": 15, "troubleshoot": 16}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file diff --git a/docs/troubleshooting/administrator.html b/docs/troubleshooting/administrator.html index 06e2615f..fb10a002 100644 --- a/docs/troubleshooting/administrator.html +++ b/docs/troubleshooting/administrator.html @@ -61,6 +61,7 @@ role="menu" aria-labelledby="dLabelGlobalToc">