diff --git a/docs/_images/fittrackee_screenshot-07.png b/docs/_images/fittrackee_screenshot-07.png new file mode 100644 index 00000000..e33f00b5 Binary files /dev/null and b/docs/_images/fittrackee_screenshot-07.png differ 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">
                • Features
                • +
                • Third-party applications
                • Installation
                • Command line interface
                • API documentation
                • @@ -133,6 +134,7 @@
                  GET /api/workouts

                  Get workouts for the authenticated user.

                  +

                  Scope: workouts:read

                  Example requests:

                  • without parameters

                  • @@ -294,7 +296,8 @@
                    GET /api/workouts/(string: workout_short_id)
                    -

                    Get a workout

                    +

                    Get a workout.

                    +

                    Scope: workouts:read

                    Example request:

                    GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF HTTP/1.1
                     
                    @@ -345,7 +348,7 @@
                  -
                • 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 28ef5b28..63e23fd2 100644 Binary files a/docs/objects.inv and b/docs/objects.inv differ 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">