diff --git a/docs/_sources/api/auth.rst.txt b/docs/_sources/api/auth.rst.txt index 9195d865..8d54d004 100644 --- a/docs/_sources/api/auth.rst.txt +++ b/docs/_sources/api/auth.rst.txt @@ -4,8 +4,9 @@ Authentication .. autoflask:: fittrackee:create_app() :endpoints: auth.register_user, + auth.confirm_account, + auth.resend_account_confirmation_email, auth.login_user, - auth.logout_user, auth.get_authenticated_user_profile, auth.edit_user, auth.edit_user_preferences, @@ -14,4 +15,6 @@ Authentication auth.edit_picture, auth.del_picture, auth.request_password_reset, - auth.update_password + auth.update_user_account, + auth.update_password, + auth.update_email diff --git a/docs/_sources/features.rst.txt b/docs/_sources/features.rst.txt index e013b0bd..4f917b52 100644 --- a/docs/_sources/features.rst.txt +++ b/docs/_sources/features.rst.txt @@ -44,9 +44,13 @@ Workouts - average speed (**new in 0.5.1**) - User records by sports: - average speed - - farest distance + - farthest distance - longest duration - maximum speed + +.. note:: + Records may differ from records displayed by the application that originally generated the gpx files. + - Workouts list and filter. Only sports with workouts are displayed in sport dropdown. .. note:: @@ -58,6 +62,7 @@ Account & preferences - A user can create, update and deleted his account - A user can set language, timezone and first day of week. - A user can reset his password (*new in 0.3.0*) +- A user can change his email address (*new in 0.6.0*) - A user can choose between metric system and imperial system for distance, elevation and speed display (*new in 0.5.0*) - A user can set sport preferences (*new in 0.5.0*): - change sport color (used for sport image and charts) @@ -82,6 +87,7 @@ Administration - maximum size of uploaded files - maximum size of zip archive - maximum number of files in the zip archive. If an archive contains more files, only the configured number of files is processed, without raising errors. + - administrator email for contact (*new in 0.6.0*) .. warning:: Updating server configuration may be necessary to handle large files (like `nginx `_ for instance). @@ -89,8 +95,12 @@ Administration - **Users** - - display users list and details - - edit a user to add/remove administration rights + - display and filter users list + - edit a user to: + - add/remove administration rights + - activate his account (*new in 0.6.0*) + - update his email (in case his account is locked) (*new in 0.6.0*) + - reset his password (in case his account is locked) (*new in 0.6.0*) - delete a user - **Sports** diff --git a/docs/_sources/installation.rst.txt b/docs/_sources/installation.rst.txt index b9d46376..66e03bda 100644 --- a/docs/_sources/installation.rst.txt +++ b/docs/_sources/installation.rst.txt @@ -298,6 +298,8 @@ For instance, copy and update ``.env`` file from ``.env.example`` and source the $ fittrackee_set_admin +.. note:: + If the user account is inactive, it activates it. From sources ^^^^^^^^^^^^ diff --git a/docs/api/auth.html b/docs/api/auth.html index 751b5193..f5e0a0db 100644 --- a/docs/api/auth.html +++ b/docs/api/auth.html @@ -130,7 +130,9 @@
POST /api/auth/register
-

register a user

+

register a user and send confirmation email.

+

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

Example request:

POST /api/auth/register HTTP/1.1
 Content-Type: application/json
@@ -138,14 +140,12 @@
 

Example responses:

    -
  • successful registration

  • +
  • success

-
HTTP/1.1 201 CREATED
+
HTTP/1.1 200 SUCCESS
 Content-Type: application/json
 
 {
-  "auth_token": "JSON Web Token",
-  "message": "successfully registered",
   "status": "success"
 }
 
@@ -165,23 +165,24 @@
Request JSON Object
    -
  • username (string) – user name (3 to 12 characters required)

  • +
  • username (string) – username (3 to 30 characters required)

  • email (string) – user email

  • password (string) – password (8 characters required)

  • -
  • password_conf (string) – password confirmation

Status Codes
    -
  • 201 Created – successfully registered

  • +
  • 200 OK – success

  • 400 Bad Request

    • invalid payload

    • -
    • sorry, that user already exists

    • +
    • sorry, that username is already taken

    • Errors:
        -
      • username: 3 to 12 characters required

      • +
      • username: 3 to 30 characters required

      • +
      • username: +only alphanumeric characters and the underscore +character “_” allowed

      • email: valid email must be provided

      • -
      • password: password and password confirmation don’t match

      • password: 8 characters required

      @@ -196,10 +197,82 @@
+
+
+POST /api/auth/account/confirm
+

activate user account after registration

+

Example request:

+
POST /api/auth/account/confirm HTTP/1.1
+Content-Type: application/json
+
+
+

Example response:

+
HTTP/1.1 200 OK
+Content-Type: application/json
+
+{
+  "auth_token": "JSON Web Token",
+  "message": "account confirmation successful",
+  "status": "success"
+}
+
+
+
+
Request JSON Object
+
    +
  • token (string) – confirmation token

  • +
+
+
Status Codes
+
+
+
+
+ +
+
+POST /api/auth/account/resend-confirmation
+

resend email with instructions to confirm account

+

Example request:

+
POST /api/auth/account/resend-confirmation HTTP/1.1
+Content-Type: application/json
+
+
+

Example response:

+
HTTP/1.1 200 OK
+Content-Type: application/json
+
+{
+  "message": "confirmation email resent",
+  "status": "success"
+}
+
+
+
+
Request JSON Object
+
    +
  • email (string) – user email

  • +
+
+
Status Codes
+
+
+
+
+
POST /api/auth/login

user login

+

Only user with an active account can log in.

Example request:

POST /api/auth/login HTTP/1.1
 Content-Type: application/json
@@ -222,7 +295,7 @@
 
  • error on login

-
HTTP/1.1 404 NOT FOUND
+
HTTP/1.1 401 UNAUTHORIZED
 Content-Type: application/json
 
 {
@@ -235,7 +308,7 @@
 
Request JSON Object
  • email (string) – user email

  • -
  • password_conf (string) – password confirmation

  • +
  • password (string) – password

Status Codes
@@ -249,59 +322,10 @@
-
-
-GET /api/auth/logout
-

user logout

-

Example request:

-
GET /api/auth/logout HTTP/1.1
-Content-Type: application/json
-
-
-

Example responses:

-
    -
  • successful logout

  • -
-
HTTP/1.1 200 OK
-Content-Type: application/json
-
-{
-  "message": "successfully logged out",
-  "status": "success"
-}
-
-
-
    -
  • error on login

  • -
-
HTTP/1.1 401 UNAUTHORIZED
-Content-Type: application/json
-
-{
-  "message": "provide a valid auth token",
-  "status": "error"
-}
-
-
-
-
Request Headers
-
-
-
Status Codes
-
-
-
-
-
GET /api/auth/profile
-

get authenticated user info

+

get authenticated user info (profile, account, preferences)

Example request:

GET /api/auth/profile HTTP/1.1
 Content-Type: application/json
@@ -320,6 +344,7 @@
     "email": "sam@example.com",
     "first_name": null,
     "imperial_units": false,
+    "is_active": true,
     "language": "en",
     "last_name": null,
     "location": null,
@@ -402,7 +427,7 @@
 
POST /api/auth/profile/edit
-

edit authenticated user

+

edit authenticated user profile

Example request:

POST /api/auth/profile/edit HTTP/1.1
 Content-Type: application/json
@@ -421,6 +446,7 @@
     "email": "sam@example.com",
     "first_name": null,
     "imperial_units": false,
+    "is_active": true,
     "language": "en",
     "last_name": null,
     "location": null,
@@ -489,8 +515,6 @@
 
  • location (string) – user location

  • bio (string) – user biography

  • birth_date (string) – user birth date (format: %Y-%m-%d)

  • -
  • password (string) – user password

  • -
  • password_conf (string) – user password confirmation

  • Request Headers
    @@ -503,7 +527,6 @@
  • 200 OK – user profile updated

  • 400 Bad Request

    • invalid payload

    • -
    • password: password and password confirmation don’t match

  • 401 Unauthorized

      @@ -540,6 +563,7 @@ "email": "sam@example.com", "first_name": null, "imperial_units": false, + "is_active": true, "language": "en", "last_name": null, "location": null, @@ -862,10 +886,140 @@
  • +
    +
    +PATCH /api/auth/profile/edit/account
    +

    update authenticated user email and password

    +

    It sends emails:

    +
      +
    • Password change

    • +
    • Email change:

      +
        +
      • one to the current address to inform user

      • +
      • another one to the new address to confirm it.

      • +
      +
    • +
    +

    Example request:

    +
    PATCH /api/auth/profile/edit/account HTTP/1.1
    +Content-Type: application/json
    +
    +
    +

    Example response:

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "data": {
    +    "admin": false,
    +    "bio": null,
    +    "birth_date": null,
    +    "created_at": "Sun, 14 Jul 2019 14:09:58 GMT",
    +    "email": "sam@example.com",
    +    "first_name": null,
    +    "imperial_units": false,
    +    "is_active": true,
    +    "language": "en",
    +    "last_name": null,
    +    "location": null,
    +    "nb_sports": 3,
    +    "nb_workouts": 6,
    +    "picture": false,
    +    "records": [
    +      {
    +        "id": 9,
    +        "record_type": "AS",
    +        "sport_id": 1,
    +        "user": "sam",
    +        "value": 18,
    +        "workout_date": "Sun, 07 Jul 2019 08:00:00 GMT",
    +        "workout_id": "hvYBqYBRa7wwXpaStWR4V2"
    +      },
    +      {
    +        "id": 10,
    +        "record_type": "FD",
    +        "sport_id": 1,
    +        "user": "sam",
    +        "value": 18,
    +        "workout_date": "Sun, 07 Jul 2019 08:00:00 GMT",
    +        "workout_id": "hvYBqYBRa7wwXpaStWR4V2"
    +      },
    +      {
    +        "id": 11,
    +        "record_type": "LD",
    +        "sport_id": 1,
    +        "user": "sam",
    +        "value": "1:01:00",
    +        "workout_date": "Sun, 07 Jul 2019 08:00:00 GMT",
    +        "workout_id": "hvYBqYBRa7wwXpaStWR4V2"
    +      },
    +      {
    +        "id": 12,
    +        "record_type": "MS",
    +        "sport_id": 1,
    +        "user": "sam",
    +        "value": 18,
    +        "workout_date": "Sun, 07 Jul 2019 08:00:00 GMT",
    +        "workout_id": "hvYBqYBRa7wwXpaStWR4V2"
    +      }
    +    ],
    +    "sports_list": [
    +        1,
    +        4,
    +        6
    +    ],
    +    "timezone": "Europe/Paris",
    +    "total_distance": 67.895,
    +    "total_duration": "6:50:27",
    +    "username": "sam"
    +    "weekm": true,
    +  },
    +  "message": "user account updated",
    +  "status": "success"
    +}
    +
    +
    +
    +
    Request JSON Object
    +
      +
    • email (string) – user email

    • +
    • password (string) – user current password

    • +
    • new_password (string) – user new password

    • +
    +
    +
    Request Headers
    +
    +
    +
    Status Codes
    +
      +
    • 200 OK – user account updated

    • +
    • 400 Bad Request

        +
      • invalid payload

      • +
      • email is missing

      • +
      • current password is missing

      • +
      • email: valid email must be provided

      • +
      • password: 8 characters required

      • +
      +

    • +
    • 401 Unauthorized

        +
      • provide a valid auth token

      • +
      • signature expired, please log in again

      • +
      • invalid token, please log in again

      • +
      • invalid credentials

      • +
      +

    • +
    • 500 Internal Server Error – error, please try again or contact the administrator

    • +
    +
    +
    +
    +
    POST /api/auth/password/update
    -

    update user password

    +

    update user password after password reset request

    Example request:

    POST /api/auth/password/update HTTP/1.1
     Content-Type: application/json
    @@ -885,7 +1039,6 @@
     
    Request JSON Object
    • password (string) – password (8 characters required)

    • -
    • password_conf (string) – password confirmation

    • token (string) – password reset token

    @@ -900,6 +1053,41 @@
    +
    +
    +POST /api/auth/email/update
    +

    update user email after confirmation

    +

    Example request:

    +
    POST /api/auth/email/update HTTP/1.1
    +Content-Type: application/json
    +
    +
    +

    Example response:

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "message": "email updated",
    +  "status": "success"
    +}
    +
    +
    +
    +
    Request JSON Object
    +
      +
    • token (string) – password reset token

    • +
    +
    +
    Status Codes
    +
    +
    +
    +
    + diff --git a/docs/api/configuration.html b/docs/api/configuration.html index 362aa3d7..266b8652 100644 --- a/docs/api/configuration.html +++ b/docs/api/configuration.html @@ -180,6 +180,7 @@ { "data": { + "admin_contact": "admin@example.com", "gpx_limit_import": 10, "is_registration_enabled": true, "max_single_file_size": 1048576, @@ -193,6 +194,7 @@
    Request JSON Object
      +
    • 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 ?

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

    • @@ -213,6 +215,7 @@
    • provide a valid auth token

    • signature expired, please log in again

    • invalid token, please log in again

    • +
    • valid email must be provided for admin contact

  • 403 Forbidden – you do not have permissions

  • diff --git a/docs/api/users.html b/docs/api/users.html index 6c73e489..b23ab042 100644 --- a/docs/api/users.html +++ b/docs/api/users.html @@ -130,7 +130,9 @@
    GET /api/users
    -

    Get all users

    +

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

    +

    It returns user preferences only for authenticated user.

    Example request:

    • without parameters

    • @@ -160,6 +162,7 @@ "created_at": "Sun, 14 Jul 2019 14:09:58 GMT", "email": "admin@example.com", "first_name": null, + "is_admin": true, "imperial_units": false, "language": "en", "last_name": null, @@ -213,7 +216,8 @@ "timezone": "Europe/Paris", "total_distance": 67.895, "total_duration": "6:50:27", - "username": "admin" + "username": "admin", + "weekm": false }, { "admin": false, @@ -222,6 +226,7 @@ "created_at": "Sat, 20 Jul 2019 11:27:03 GMT", "email": "sam@example.com", "first_name": null, + "is_admin": false, "language": "fr", "last_name": null, "location": null, @@ -248,7 +253,7 @@
    • per_page (integer) – number of users per page (default: 10, max: 50)

    • q (string) – query on user name

    • order_by (string) – sorting criteria (username, created_at, -workouts_count, admin)

    • +workouts_count, admin, is_active)

    • order (string) – sorting order (default: asc)

    @@ -274,7 +279,8 @@
    GET /api/users/(user_name)
    -

    Get single user details

    +

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

    +

    It returns user preferences only for authenticated user.

    Example request:

    GET /api/users/admin HTTP/1.1
     Content-Type: application/json
    @@ -294,6 +300,7 @@
           "email": "admin@example.com",
           "first_name": null,
           "imperial_units": false,
    +      "is_admin": true,
           "language": "en",
           "last_name": null,
           "location": null,
    @@ -418,10 +425,16 @@
     
    PATCH /api/users/(user_name)
    -

    Update user to add admin rights

    +

    Update user account

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

    • +
    • reset password (and send email to update user password)

    • +
    • update user email (and send email to update user password)

    • +
    • activate account for an inactive user

    • +

    Only user with admin rights can modify another user

    Example request:

    -
    PATCH api/users/<user_name> HTTP/1.1
    +
    PATCH /api/users/<user_name> HTTP/1.1
     Content-Type: application/json
     
    @@ -439,6 +452,7 @@ "email": "admin@example.com", "first_name": null, "imperial_units": false, + "is_active": true, "language": "en", "last_name": null, "location": null, @@ -506,7 +520,10 @@
    Request JSON Object
      +
    • activate (boolean) – activate user account

    • admin (boolean) – does the user have administrator rights

    • +
    • new_email (boolean) – new user email

    • +
    • reset_password (boolean) – reset user password

    Request Headers
    @@ -517,6 +534,12 @@
    Status Codes
    • 200 OK – success

    • +
    • 400 Bad Request

        +
      • invalid payload

      • +
      • valid email must be provided

      • +
      • new email must be different than curent email

      • +
      +

    • 401 Unauthorized

      • provide a valid auth token

      • signature expired, please log in again

      • diff --git a/docs/features.html b/docs/features.html index 29f8c19b..065ef29e 100644 --- a/docs/features.html +++ b/docs/features.html @@ -209,13 +209,19 @@
      • User records by sports:
        • average speed

        • -
        • farest distance

        • +
        • farthest distance

        • longest duration

        • maximum speed

      • +
      +
      +

      Note

      +

      Records may differ from records displayed by the application that originally generated the gpx files.

      +
      +
      • Workouts list and filter. Only sports with workouts are displayed in sport dropdown.

      @@ -229,6 +235,7 @@
    • A user can create, update and deleted his account

    • A user can set language, timezone and first day of week.

    • A user can reset his password (new in 0.3.0)

    • +
    • A user can change his email address (new in 0.6.0)

    • A user can choose between metric system and imperial system for distance, elevation and speed display (new in 0.5.0)

    • A user can set sport preferences (new in 0.5.0):
        @@ -260,6 +267,7 @@
      • maximum size of uploaded files

      • maximum size of zip archive

      • maximum number of files in the zip archive. If an archive contains more files, only the configured number of files is processed, without raising errors.

      • +
      • administrator email for contact (new in 0.6.0)

      Warning

      @@ -268,8 +276,17 @@
    • Users

        -
      • display users list and details

      • -
      • edit a user to add/remove administration rights

      • +
      • display and filter users list

      • +
      • +
        edit a user to:
          +
        • add/remove administration rights

        • +
        • activate his account (new in 0.6.0)

        • +
        • update his email (in case his account is locked) (new in 0.6.0)

        • +
        • reset his password (in case his account is locked) (new in 0.6.0)

        • +
        +
        +
        +
      • delete a user

    • diff --git a/docs/http-routingtable.html b/docs/http-routingtable.html index 8bfbcb2a..b2f6ddc1 100644 --- a/docs/http-routingtable.html +++ b/docs/http-routingtable.html @@ -125,11 +125,6 @@   /api - - - - GET /api/auth/logout - @@ -235,6 +230,21 @@ GET /api/workouts/map_tile/(s)/(z)/(x)/(y).png + + + + POST /api/auth/account/confirm + + + + + POST /api/auth/account/resend-confirmation + + + + + POST /api/auth/email/update + @@ -305,6 +315,11 @@ DELETE /api/workouts/(string:workout_short_id) + + + + PATCH /api/auth/profile/edit/account + diff --git a/docs/installation.html b/docs/installation.html index 6450d409..b4f8a0f3 100644 --- a/docs/installation.html +++ b/docs/installation.html @@ -557,6 +557,10 @@ $ source .env
      $ fittrackee_set_admin <username>
       
      +
      +

      Note

      +

      If the user account is inactive, it activates it.

      +

      From sources

      diff --git a/docs/objects.inv b/docs/objects.inv index 7a181023..2714876a 100644 Binary files a/docs/objects.inv and b/docs/objects.inv differ diff --git a/docs/searchindex.js b/docs/searchindex.js index 231434f9..050c87a3 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","features","index","installation","troubleshooting/administrator","troubleshooting/index","troubleshooting/user"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"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},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","features.rst","index.rst","installation.rst","troubleshooting/administrator.rst","troubleshooting/index.rst","troubleshooting/user.rst"],objects:{"":[[0,0,1,"post--api-auth-login","/api/auth/login"],[0,1,1,"get--api-auth-logout","/api/auth/logout"],[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,2,1,"delete--api-auth-picture","/api/auth/picture"],[0,0,1,"post--api-auth-picture","/api/auth/picture"],[0,1,1,"get--api-auth-profile","/api/auth/profile"],[0,0,1,"post--api-auth-profile-edit","/api/auth/profile/edit"],[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,2,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,1,1,"get--api-config","/api/config"],[1,3,1,"patch--api-config","/api/config"],[1,1,1,"get--api-ping","/api/ping"],[3,1,1,"get--api-records","/api/records"],[4,1,1,"get--api-sports","/api/sports"],[4,1,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,1,1,"get--api-stats-(user_name)-by_sport","/api/stats/(user_name)/by_sport"],[5,1,1,"get--api-stats-(user_name)-by_time","/api/stats/(user_name)/by_time"],[5,1,1,"get--api-stats-all","/api/stats/all"],[6,1,1,"get--api-users","/api/users"],[6,2,1,"delete--api-users-(user_name)","/api/users/(user_name)"],[6,1,1,"get--api-users-(user_name)","/api/users/(user_name)"],[6,3,1,"patch--api-users-(user_name)","/api/users/(user_name)"],[6,1,1,"get--api-users-(user_name)-picture","/api/users/(user_name)/picture"],[7,1,1,"get--api-workouts","/api/workouts"],[7,0,1,"post--api-workouts","/api/workouts"],[7,2,1,"delete--api-workouts-(string-workout_short_id)","/api/workouts/(string:workout_short_id)"],[7,1,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,1,1,"get--api-workouts-(string-workout_short_id)-chart_data","/api/workouts/(string:workout_short_id)/chart_data"],[7,1,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,1,1,"get--api-workouts-(string-workout_short_id)-gpx","/api/workouts/(string:workout_short_id)/gpx"],[7,1,1,"get--api-workouts-(string-workout_short_id)-gpx-download","/api/workouts/(string:workout_short_id)/gpx/download"],[7,1,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,1,1,"get--api-workouts-map-(map_id)","/api/workouts/map/(map_id)"],[7,0,1,"post--api-workouts-no_gpx","/api/workouts/no_gpx"],[11,4,1,"-","APP_LOG"],[11,4,1,"-","APP_SECRET_KEY"],[11,4,1,"-","APP_SETTINGS"],[11,4,1,"-","APP_WORKERS"],[11,4,1,"-","DATABASE_DISABLE_POOLING"],[11,4,1,"-","DATABASE_URL"],[11,4,1,"envvar-DEFAULT_STATICMAP","DEFAULT_STATICMAP \ud83c\udd95"],[11,4,1,"-","EMAIL_URL"],[11,4,1,"-","FLASK_APP"],[11,4,1,"-","HOST"],[11,4,1,"-","MAP_ATTRIBUTION"],[11,4,1,"-","PORT"],[11,4,1,"-","REDIS_URL"],[11,4,1,"-","SENDER_EMAIL"],[11,4,1,"-","TILE_SERVER_URL"],[11,4,1,"-","UI_URL"],[11,4,1,"-","UPLOAD_FOLDER"],[11,4,1,"-","VUE_APP_API_URL"],[11,4,1,"-","WEATHER_API_KEY"],[11,4,1,"-","WORKERS_PROCESSES"]],"/api/workouts/map_tile/(s)/(z)/(x)/(y)":[[7,1,1,"get--api-workouts-map_tile-(s)-(z)-(x)-(y).png","png"]]},objnames:{"0":["http","post","HTTP post"],"1":["http","get","HTTP get"],"2":["http","delete","HTTP delete"],"3":["http","patch","HTTP patch"],"4":["std","envvar","environment variable"]},objtypes:{"0":"http:post","1":"http:get","2":"http:delete","3":"http:patch","4":"std:envvar"},terms:{"0":[0,1,3,4,5,6,7,9,11],"00":[0,3,6,7],"000000":0,"01":[0,3,5,6,7],"02":7,"03":[6,7],"04":7,"06":5,"07":[0,3,6,7],"08":[0,3,6],"09":[0,6],"0mb":[0,7],"1":[0,1,3,4,5,6,7,9,11],"10":[0,1,3,6,7,11],"100":[7,8,9],"1000":5,"101":8,"104":8,"1048576":1,"10485760":1,"109":8,"11":[0,3,6,9],"115":8,"116":8,"12":[0,3,6,7],"121":8,"123":8,"1232004":7,"12341":5,"1234538":7,"1267":5,"127":[8,11],"129":8,"13":7,"131":8,"134":8,"135":8,"138":8,"14":[0,6,7],"140":8,"145":8,"146":8,"149":8,"15":[5,7],"150":5,"151":8,"152":8,"156":5,"1563529507772":7,"16":[5,7],"17":[7,11],"178":5,"18":[0,3,6,7,8],"2":[0,1,3,4,5,6,7,9,11],"20":6,"200":[0,1,3,4,5,6,7],"201":[0,7],"2017":[5,7],"2018":[5,7],"2019":[0,3,5,6,7],"203":5,"204":[0,6,7],"22":[7,8],"24":8,"25":[8,11],"26":8,"27":[0,6],"279":7,"28":8,"280":7,"282":5,"2930":7,"2e1ee2c":8,"3":[0,4,5,6,7,9,11],"30":5,"3000":11,"301":11,"31":7,"33":8,"34":8,"34614d5":8,"36":8,"37":8,"39":7,"4":[0,4,5,6,7,11],"40":8,"400":[0,1,4,7],"401":[0,1,3,4,5,6,7],"403":[0,1,4,5,6,7],"404":[0,4,5,6,7],"41":8,"4109":7,"413":[0,7],"43":8,"44":[7,8],"443":11,"45":7,"46":[5,8],"465":11,"47":[5,7,8],"48":5,"4c3fc34":8,"5":[1,4,5,6,7,9,11],"50":[0,6,8],"500":[0,1,4,6,7],"5000":11,"5078118":7,"5079733":7,"51":7,"53":8,"54":8,"5432":11,"57":[7,8],"58":[0,6,8],"587":11,"59":8,"6":[0,4,6,7],"613":5,"62":8,"63":7,"64":8,"66":8,"67":[0,6],"7":[1,7,11],"70":8,"71":8,"72":8,"7380":7,"75":8,"78":5,"79":8,"8":[0,7],"80":[8,11],"8025":11,"81":8,"82":8,"83":8,"84":8,"877fa0f":8,"895":[0,6],"9":[0,3,6,11],"90":8,"91":8,"93":8,"95":[5,8],"98":8,"99":[5,8],"9960":5,"boolean":[0,1,6],"case":9,"default":[5,6,7,8,9,11],"do":[1,4,5,6,7],"export":10,"float":[0,7],"import":[8,11],"int":[4,7],"new":[0,9,11],"null":[0,4,6,7],"return":[3,7,11],"short":7,"static":[8,11],"switch":8,"true":[0,1,4,6,8,11],"try":[0,6,7],A:[6,8,9],AS:[0,3,6,7],And:8,For:[9,11],If:[9,11],In:[8,9],It:[8,9,10,12],NO:[0,6,7],NOT:[0,4,7],No:[0,6,7,8,10],Not:[0,4,5,6,7],OF:11,ON:11,On:11,One:11,TO:11,The:[8,9,11],There:11,To:11,WITH:11,With:11,_:8,__main__:11,_blank:11,access:11,account:[6,8,11],acit:7,activ:[4,8,9,10,11],ad:[0,8,9],adapt:11,add:[6,8,9,10],addit:11,address:11,admin:[0,1,3,4,5,6,7,8,9,11],administr:[0,6,7,13],after:[8,11],again:[0,1,3,4,5,6,7],agplv3:8,all:[3,4,5,6,11],allow:[0,1,7,8,9,10],along:7,alphanumer:8,alpin:9,alreadi:0,also:[8,10,11],altitud:8,alwai:11,an:[1,4,6,7,8,9,11],android:10,anoth:[6,11],anymor:8,apach:10,api:[0,1,3,4,5,6,7,8,9,10,11],apikei:11,app:[8,10],app_log:11,app_secret_kei:11,app_set:11,app_work:11,appear:9,applic:[0,1,3,4,5,6,7,8,9,10,11],ar:[3,7,8,9,10,11,12],arch:11,archiv:[1,8,9,11],archlinux:11,arrow:9,asc:6,ascent:[7,9],attribut:11,auth:[0,1,3,4,5,6,7],auth_token:0,authent:[1,2,3,4,7],author:[0,1,3,4,5,6,7],autoescap:8,avail:[0,3,9,11],ave_spe:7,ave_speed_from:7,ave_speed_to:7,averag:[3,7,8,9],average_spe:5,avoid:8,axi:7,b862a77:8,b:11,background:8,backup:11,bad:[0,1,4,7],bearer:[0,1,3,4,5,6,7],becom:8,been:8,befor:[8,11],begin:11,better:8,between:9,bike:[4,7,8,9],bin:11,bio:[0,6],biographi:0,birth:[0,8],birth_dat:[0,6],bound:7,build:11,button:8,by_sport:5,by_tim:5,c:7,calcul:8,calendar:[8,9],can:[6,8,9,10,11,12],cannot:8,cd:11,chang:[9,10,11],changelog:11,charact:[0,8],chart:[7,8,9,11],chart_data:7,check:[1,8,11,12],choos:[8,9],client:[8,11],client_max_body_s:11,clone:11,code:[0,1,3,4,5,6,7],color:[0,4,8,9],com:[0,6,11],come:9,command:[8,11],complet:8,compos:11,config:[1,8,11],configur:[2,8,9,11],confirm:0,contact:[0,6,7],contain:[8,9,11],content:[0,1,3,4,5,6,7],contributor:[1,8,11],control:[8,9],coordin:11,copi:[1,11],copyright:[1,11],correctli:8,countri:9,cp:11,creat:[0,7,8,9,11],create_app:11,created_at:[0,6],creation:[8,9],creation_d:7,credenti:[0,11],criteria:6,cross:9,current:8,custom:11,cycl:[4,8,9],d:[0,5,7],dai:[8,9],danielsiersleben:8,dark:11,darkski:[8,9],dashboard:8,data:[0,1,3,4,5,6,7,8,9,10,11],databas:[8,9,11,12],database_disable_pool:11,database_url:[8,11],date:[0,5,7,8,9],db:11,debian:11,default_staticmap:[8,11],defin:9,definit:8,delet:[0,6,7,8,9],depend:[8,11],desc:7,descent:[7,9],describ:11,descript:11,detail:[6,8],develop:[8,10],dialect:12,differ:8,direct:[8,9],directli:11,directori:[8,11],disabl:[0,8,9,11],displai:[7,8,9,10,11,12],distanc:[3,7,8,9],distance_from:7,distance_to:7,distribut:11,docker:8,document:[8,10,11],doe:[0,5,6,7,8],don:0,dotenv:8,down:8,download:[7,8,9,11],dramatiq:[8,11],drop:8,dropdown:9,due:8,durat:[3,7,8,9],duration_from:7,duration_to:7,dure:[0,7],easi:8,edit:[0,8,9],electr:9,elev:[7,8,9,11],els:11,email:[0,6,8],email_url:11,empti:8,en:[0,6],enabl:[1,9],encount:11,end:[5,7],endpoint:[1,8],engin:[8,11,12],english:9,enter:[8,9],entiti:[0,7],entri:11,entrypoint:8,env:11,environ:[8,12],error:[0,1,4,6,7,8,9,11,12],europ:[0,6],evalu:[8,11],even:[8,9],exampl:[0,1,3,4,5,6,7,10,11],exc:12,exce:[0,7],exceed:8,except:6,execstart:11,exhaust:10,exist:[0,5,6,7,9,10,11],expir:[0,1,3,4,5,6,7],extens:[0,7],fa33f4d996844a5c73ecd1ae24456ab8:7,fail:[8,13],fals:[0,1,4,6,7,11],farest:[3,8,9],fd:[0,3,6,7],featur:[10,11],fetch:11,file:[0,1,7,8,9,10,11],filter:[8,9],finish:8,first:[0,9],first_nam:[0,6],fitotrack:10,fittracke:[9,11,13],fittrackee_cli:11,fittrackee_set_admin:11,fittrackee_upgrade_db:11,fittrackee_work:11,flask:11,flask_app:11,flaticon:11,fmstrat:8,follow:[3,9,11,12],forbidden:[0,1,4,5,6,7],forecast:11,form:[0,7],format:[0,5,7],former:11,forrunn:10,forward:11,found:[0,4,5,6,7],fr:6,frame:5,freepik:11,french:9,fri:7,from:[5,7,8,9,10],full:[8,9],fullchain:11,fullscreen:8,gener:[8,11],get:[0,1,3,4,5,6,7],gif:0,git:11,github:11,given:[0,11],gmt:[0,3,6,7],gpl:10,gpx:[7,8,9,10,11],gpx_limit_import:1,gpxpy:[0,9,11],grant:11,graph:8,greater:8,gunicorn:[11,12],gz:11,h:[7,9],ha:[6,9],handl:[0,9,11],has_workout:4,have:[1,4,5,6,7,8],he:6,header:[0,1,3,4,5,6,7],health:1,heavi:[10,11],hexadecim:0,hi:[6,8,9],hike:[4,8,9],home:11,host:11,href:[1,11],http2:11,http:[0,1,3,4,5,6,7,11],hvybqybra7wwxpastwr4v2:[0,3,6],i18n:8,icon:[8,11],id:[0,3,4,5,6,7],imag:[0,6,7,8,9,11],imperi:[8,9],imperial_unit:[0,6],includ:8,incorrect:8,index:7,indic:9,info:0,inform:[8,10,11],init:11,initi:[8,11],initialis:[8,11],input:8,insid:11,instal:[8,10],instanc:[1,9,11],instead:9,instruct:8,integ:[1,4,5,6,7],interceptor:8,interfac:11,intern:[0,1,4,6,7],introduc:8,invalid:[0,1,3,4,5,6,7,8,11],io:11,ip:11,is_act:[0,4],is_active_for_us:4,is_registration_en:1,issu:[10,11],jan:7,javascript:8,jinja:8,john_do:6,jpeg:6,jpg:0,js:11,json:[0,1,3,4,5,6,7],jul:[0,3,6,7],keep:[8,10,11],kei:[8,9,11],kjxavsturjvoah2wvcegef:7,km:[7,9],label:[4,8],languag:[0,6,9],larg:[0,7,9],larger:11,last:[0,11],last_nam:[0,6],latitud:7,launch:8,layer:[8,11],ld:[0,3,6,7],leaflet:[7,11],least:7,legitim:8,less:8,librari:11,licens:[8,10],like:[9,11],limit:[8,9],link:11,linux:11,list:[8,10,11],listen:11,load:[8,12],local:[8,10,11],localhost:[8,11],locat:[0,6,11],log:[0,1,3,4,5,6,7,10,11,12],logfil:11,login:0,logo:11,logout:[0,8],longer:[8,12],longest:[3,8,9],longitud:7,m:[0,5,7],made:11,mai:[9,10,11],mailhog:11,major:8,make:[8,11],makefil:11,manag:8,mandatori:[7,8,11],map:[7,8,9,10],map_attribut:[1,11],map_id:7,map_til:7,marker:8,match:0,max:[1,6,7,8],max_alt:7,max_single_file_s:1,max_spe:7,max_speed_from:7,max_speed_to:7,max_us:1,max_zip_file_s:1,maxim:7,maximum:[3,8,9],messag:[0,1,7,8],method:11,metric:9,migrat:[8,11],min:8,min_alt:7,minim:7,miss:8,mobil:10,model:8,modifi:[6,8],modification_d:7,modul:11,mon:7,mondai:[0,5,9],montain:8,month:[5,8,9],more:[8,9,10,11],morn:7,mountain:[4,9],mous:8,move:[7,8],movement:8,ms:[0,3,6,7],multi:11,multipart:[0,7],must:[0,1,4,8,9,11,12],mv:11,n:0,name:[0,5,6,11],nano:11,nb_sport:[0,6],nb_workout:[0,5,6],necessari:[9,11],need:11,network:11,newli:11,next:9,next_workout:7,nginx:[9,11],no_gpx:7,non:[4,10],noopen:11,noreferr:11,nosuchmoduleerror:12,note:[7,8,9,11],now:[8,9,11],number:[1,6,7,8,9,11],oauth:[0,1,3,4,5,6,7],object:[0,1,4,6,7],ok:[0,1,3,4,5,6,7],omit:11,one:[6,7,9],onli:[6,7,8,9,11],open:[10,11],openstreetmap:[1,8,11],opentrack:10,option:[8,11],order:[6,7,8],order_bi:6,org:[1,11],os:11,other:[6,11],out:0,outdoor:[8,10,11],over:8,overrid:9,overridden:9,overwrit:11,own:[6,10],owner:[8,9],packag:[8,11],paf38:8,page:[6,7],pagin:[6,7],par_pag:6,paramet:[0,4,5,6,7,8,9],pari:[0,6],pars:[8,11],part:[0,7],pass:11,password:[0,8,9,11],password_conf:0,patch:[1,4,6,7],path:11,paus:[7,8],payload:[0,1,4,7],pem:11,per:[6,7,8],per_pag:[6,7],period:9,permiss:[1,4,5,6,7],pg_dump:11,pictur:[0,6,7],ping:1,pip:11,pipenv:8,pleas:[0,1,3,4,5,6,7,8],plugin:12,png:[0,7,11],poetri:[8,11],point:[8,11],pong:1,pool:11,port:11,posit:[8,9],possibl:[8,10],post:[0,7],postgr:[8,12],postgresql:[8,11,12],prefer:[0,8],previous_workout:7,privileg:11,privkei:11,process:[0,9,11],product:8,productionconfig:11,profil:0,project:11,provid:[0,1,3,4,5,6,7,8,9,11],proxi:11,proxy_add_x_forwarded_for:11,proxy_pass:11,proxy_redirect:11,proxy_set_head:11,pull:11,purpos:[8,11],pwd:11,py:11,python:[8,11],q:6,queri:[5,6,7],queue:11,r:11,rais:9,read:8,real:11,rebuild:8,rechart:7,recommend:11,record:[0,2,6,7,8,9],record_typ:[0,3,6,7],redi:[8,11],redis_url:11,refactor:8,regist:[0,1,11],registr:[0,1,8,9],rel:11,relat:[9,11],releas:11,remain:8,remote_addr:11,remov:[8,9],renam:8,replac:[8,11],repo:11,report:8,repositori:11,request:[0,1,3,4,5,6,7],request_uri:11,requir:0,reset:[0,8,9],resolut:8,respons:[0,1,3,4,5,6,7],restart:11,restartsec:11,right:[6,8,9,11],rout:8,row:9,run:[4,8,9,11],runner:10,s:[6,7,8,11],sam:[0,6],same:8,samr1:11,sanit:8,sat:6,save:[8,9],schema:11,screen:[8,9],script:8,search:8,second:7,secret:11,see:[8,9,10,11],seem:8,segment:[7,8,9],segment_id:7,select:[0,7],send:[8,11],sender:11,sender_email:11,serv:[8,11],server:[0,1,4,6,7,8,9,10],server_nam:11,servic:11,set:[8,9,11],sever:[8,10,11],shell:11,should:11,show:8,shown:8,side:8,signatur:[0,1,3,4,5,6,7],simpl:11,simplifi:8,sinc:11,singl:[1,6],size:[0,1,7,8,9],ski:9,sky:11,slow:8,small:8,smtp:[8,11],snowsho:[8,9],some:[6,7,8,10,11],sorri:0,sort:[6,7],spawn:11,speed:[0,3,7,8,9,11],spinner:8,sport:[0,2,5,7,8,9,11],sport_id:[0,3,4,5,6,7],sports_list:[0,6],sql:11,sqlalchemi:[8,11,12],ssl:11,ssl_certif:11,ssl_certificate_kei:11,standard:[8,11],standarderror:11,standardoutput:11,start:[0,5,7,8,9,11,13],startlimitintervalsec:11,starttl:11,stat:[5,8],staticmap:11,statist:2,statu:[0,1,3,4,5,6,7],step:11,still:[9,10],stop:[0,8,9,11],stopped_speed_threshold:[0,4],store:[9,10],street:10,string:[0,4,5,6,7],subdomain:7,success:[0,1,3,4,5,6,7],successfulli:0,sun:[0,3,6,7],sundai:[5,7,9],support:[8,9,12],syslog:11,syslogidentifi:11,system:[9,11],systemd:11,t:[0,8,12],tar:11,target:11,task:11,templat:8,term:[8,11],test:11,textarea:8,than:8,thank:8,thei:11,them:10,thi:[7,8,9,10,11],threshold:[0,8,9],thunderforest:[8,11],tile:[7,8],tile_server_url:11,time:[0,5,7,8,9],timezon:[0,6,8,9],titl:7,tl:11,todo:14,token:[0,1,3,4,5,6,7],too:[0,7],tool:11,tooltip:[8,9],total:[8,9],total_asc:5,total_dist:[0,5,6],total_dur:[0,5,6],track:10,trail:9,transport:[4,8,9],troubleshoot:10,type:[0,1,3,4,5,6,7,11],typescript:11,u:11,ui:8,ui_url:11,unauthor:[0,1,3,4,5,6,7],under:[10,11],unencrypt:11,unit:[8,11],unstabl:[10,11],up:[9,10],updat:[0,1,4,6,7,8,9,11],upgrad:8,upload:[8,9,11],upload_fold:11,uploads_dir_s:5,uri:8,url:[8,11,12],us:[0,6,7,8,9,10,11],user:[0,1,2,3,4,5,7,8,9,11,13],user_id:0,user_nam:[5,6],usernam:[0,6,8,11],uuid:[7,8],v0:11,v3:10,valid:[0,1,3,4,5,6,7,8,11],valu:[0,3,6,7],variabl:[8,12],venv:11,version:[1,11],view:[8,9],virtualenv:11,vue3:11,vue:11,vue_app_api_url:11,vuex:11,w:8,wa:8,wai:11,walk:[4,8,9],wantedbi:11,warn:8,weather:[8,9,11],weather_api:11,weather_api_kei:11,weather_end:7,weather_start:7,web:[0,10,11],week:[0,5,8,9],weekend:8,weekm:[0,5],were:8,wget:11,when:[0,1,8,9,11],where:11,which:9,wind:[8,9],with_gpx:7,without:[5,6,7,8,9,10],worker:[8,11],workers_process:11,workingdirectori:11,workout:[0,2,5,8,10],workout_d:[0,3,6,7],workout_id:[0,3,6,7],workout_short_id:7,workouts_count:6,written:11,www:[1,11],x:[7,11],xml:7,xxxx:11,xzf:11,y:[0,5,7,11],yai:11,yarn:11,year:[5,9],yet:10,you:[1,4,5,6,7,10],your:[6,10,11],z:[7,11],zip:[1,7,8,9],zone:0,zoom:7},titles:["Authentication","Configuration","API documentation","Records","Sports","Statistics","Users","Workouts","Change log","Features","FitTrackee","Installation","Administrator","Troubleshooting","User"],titleterms:{"0":8,"01":8,"02":8,"03":8,"04":8,"05":8,"07":8,"09":8,"1":8,"10":8,"11":8,"12":8,"13":8,"14":8,"15":8,"16":8,"17":8,"19":8,"2":8,"2018":8,"2019":8,"2020":8,"2021":8,"2022":8,"21":8,"23":8,"29":8,"3":8,"30":8,"31":8,"4":8,"5":8,"6":8,"7":8,"8":8,"9":8,"new":8,account:9,administr:[8,9,12],api:2,authent:0,avail:8,bug:8,chang:8,close:8,configur:1,content:10,dashboard:9,deploy:11,detail:9,dev:11,develop:11,docker:11,document:2,email:11,endpoint:[2,13],environ:11,fail:12,featur:[8,9],first:8,fittracke:[8,10,12],fix:8,french:8,from:11,improv:8,instal:11,issu:8,list:9,log:8,map:11,minor:8,misc:8,prefer:9,prerequisit:11,prod:11,product:11,pull:8,pypi:[8,11],record:3,releas:8,request:8,screenshot:9,secur:8,server:11,sourc:11,sport:4,start:12,statist:[5,8,9],tabl:10,tile:11,translat:9,troubleshoot:13,upgrad:11,user:[6,14],variabl:11,version:8,workout:[7,9]}}) \ No newline at end of file +Search.setIndex({docnames:["api/auth","api/configuration","api/index","api/records","api/sports","api/stats","api/users","api/workouts","changelog","features","index","installation","troubleshooting/administrator","troubleshooting/index","troubleshooting/user"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"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},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","features.rst","index.rst","installation.rst","troubleshooting/administrator.rst","troubleshooting/index.rst","troubleshooting/user.rst"],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"],[11,4,1,"-","APP_LOG"],[11,4,1,"-","APP_SECRET_KEY"],[11,4,1,"-","APP_SETTINGS"],[11,4,1,"-","APP_WORKERS"],[11,4,1,"-","DATABASE_DISABLE_POOLING"],[11,4,1,"-","DATABASE_URL"],[11,4,1,"envvar-DEFAULT_STATICMAP","DEFAULT_STATICMAP \ud83c\udd95"],[11,4,1,"-","EMAIL_URL"],[11,4,1,"-","FLASK_APP"],[11,4,1,"-","HOST"],[11,4,1,"-","MAP_ATTRIBUTION"],[11,4,1,"-","PORT"],[11,4,1,"-","REDIS_URL"],[11,4,1,"-","SENDER_EMAIL"],[11,4,1,"-","TILE_SERVER_URL"],[11,4,1,"-","UI_URL"],[11,4,1,"-","UPLOAD_FOLDER"],[11,4,1,"-","VUE_APP_API_URL"],[11,4,1,"-","WEATHER_API_KEY"],[11,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"]]},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"]},objtypes:{"0":"http:post","1":"http:delete","2":"http:get","3":"http:patch","4":"std:envvar"},terms:{"0":[0,1,3,4,5,6,7,9,11],"00":[0,3,6,7],"000000":0,"01":[0,3,5,6,7],"02":7,"03":[6,7],"04":7,"06":5,"07":[0,3,6,7],"08":[0,3,6],"09":[0,6],"0mb":[0,7],"1":[0,1,3,4,5,6,7,9,11],"10":[0,1,3,6,7,11],"100":[7,8,9],"1000":5,"101":8,"104":8,"1048576":1,"10485760":1,"109":8,"11":[0,3,6,9],"115":8,"116":8,"12":[0,3,6,7],"121":8,"123":8,"1232004":7,"12341":5,"1234538":7,"1267":5,"127":[8,11],"129":8,"13":7,"131":8,"134":8,"135":8,"138":8,"14":[0,6,7],"140":8,"145":8,"146":8,"149":8,"15":[5,7],"150":5,"151":8,"152":8,"156":5,"1563529507772":7,"16":[5,7],"17":[7,11],"178":5,"18":[0,3,6,7,8],"2":[0,1,3,4,5,6,7,9,11],"20":6,"200":[0,1,3,4,5,6,7],"201":7,"2017":[5,7],"2018":[5,7],"2019":[0,3,5,6,7],"203":5,"204":[0,6,7],"22":[7,8],"24":8,"25":[8,11],"26":8,"27":[0,6],"279":7,"28":8,"280":7,"282":5,"2930":7,"2e1ee2c":8,"3":[0,4,5,6,7,9,11],"30":[0,5],"3000":11,"301":11,"31":7,"33":8,"34":8,"34614d5":8,"36":8,"37":8,"39":7,"4":[0,4,5,6,7,11],"40":8,"400":[0,1,4,6,7],"401":[0,1,3,4,5,6,7],"403":[0,1,4,5,6,7],"404":[0,4,5,6,7],"41":8,"4109":7,"413":[0,7],"43":8,"44":[7,8],"443":11,"45":7,"46":[5,8],"465":11,"47":[5,7,8],"48":5,"4c3fc34":8,"5":[1,4,5,6,7,9,11],"50":[0,6,8],"500":[0,1,4,6,7],"5000":11,"5078118":7,"5079733":7,"51":7,"53":8,"54":8,"5432":11,"57":[7,8],"58":[0,6,8],"587":11,"59":8,"6":[0,4,6,7,9],"613":5,"62":8,"63":7,"64":8,"66":8,"67":[0,6],"7":[1,7,11],"70":8,"71":8,"72":8,"7380":7,"75":8,"78":5,"79":8,"8":[0,7],"80":[8,11],"8025":11,"81":8,"82":8,"83":8,"84":8,"877fa0f":8,"895":[0,6],"9":[0,3,6,11],"90":8,"91":8,"93":8,"95":[5,8],"98":8,"99":[5,8],"9960":5,"boolean":[0,1,6],"case":9,"default":[5,6,7,8,9,11],"do":[1,4,5,6,7],"export":10,"float":[0,7],"import":[8,11],"int":[4,7],"new":[0,6,9,11],"null":[0,4,6,7],"return":[3,6,7,11],"short":7,"static":[8,11],"switch":8,"true":[0,1,4,6,8,11],"try":[0,6,7],A:[6,8,9],AS:[0,3,6,7],And:8,For:[9,11],If:[9,11],In:[8,9],It:[0,6,8,9,10,12],NO:[0,6,7],NOT:[4,7],No:[0,6,7,8,10],Not:[0,4,5,6,7],OF:11,ON:11,On:11,One:11,TO:11,The:[0,8,9,11],There:11,To:11,WITH:11,With:11,_:[0,8],__main__:11,_blank:11,access:11,account:[0,6,8,11],acit:7,activ:[0,4,6,8,9,10,11],ad:[0,8,9],adapt:11,add:[6,8,9,10],addit:11,address:[0,9,11],admin:[0,1,3,4,5,6,7,8,9,11],admin_contact:1,administr:[0,1,6,7,13],after:[0,8,11],again:[0,1,3,4,5,6,7],agplv3:8,all:[3,4,5,6,11],allow:[0,1,7,8,9,10],along:7,alphanumer:[0,8],alpin:9,alreadi:0,also:[8,10,11],altitud:8,alwai:11,an:[0,1,4,6,7,8,9,11],android:10,anoth:[0,6,11],anymor:8,apach:10,api:[0,1,3,4,5,6,7,8,9,10,11],apikei:11,app:[8,10],app_log:11,app_secret_kei:11,app_set:11,app_work:11,appear:9,applic:[0,1,3,4,5,6,7,8,9,10,11],ar:[3,7,8,9,10,11,12],arch:11,archiv:[1,8,9,11],archlinux:11,arrow:9,asc:6,ascent:[7,9],attribut:11,auth:[0,1,3,4,5,6,7],auth_token:0,authent:[1,2,3,4,6,7],author:[0,1,3,4,5,6,7],autoescap:8,avail:[0,3,9,11],ave_spe:7,ave_speed_from:7,ave_speed_to:7,averag:[3,7,8,9],average_spe:5,avoid:8,axi:7,b862a77:8,b:11,background:8,backup:11,bad:[0,1,4,6,7],bearer:[0,1,3,4,5,6,7],becom:8,been:8,befor:[8,11],begin:11,better:8,between:9,bike:[4,7,8,9],bin:11,bio:[0,6],biographi:0,birth:[0,8],birth_dat:[0,6],bound:7,build:11,button:8,by_sport:5,by_tim:5,c:7,calcul:8,calendar:[8,9],can:[0,6,8,9,10,11,12],cannot:8,cd:11,chang:[0,9,10,11],changelog:11,charact:[0,8],chart:[7,8,9,11],chart_data:7,check:[1,8,11,12],choos:[8,9],client:[8,11],client_max_body_s:11,clone:11,code:[0,1,3,4,5,6,7],color:[0,4,8,9],com:[0,1,6,11],come:9,command:[8,11],complet:8,compos:11,config:[1,8,11],configur:[2,8,9,11],confirm:0,contact:[0,1,6,7,9],contain:[8,9,11],content:[0,1,3,4,5,6,7],contributor:[1,8,11],control:[8,9],coordin:11,copi:[1,11],copyright:[1,11],correctli:8,countri:9,cp:11,creat:[0,7,8,9,11],create_app:11,created_at:[0,6],creation:[8,9],creation_d:7,credenti:[0,11],criteria:6,cross:9,curent:6,current:[0,8],custom:11,cycl:[4,8,9],d:[0,5,7],dai:[8,9],danielsiersleben:8,dark:11,darkski:[8,9],dashboard:8,data:[0,1,3,4,5,6,7,8,9,10,11],databas:[8,9,11,12],database_disable_pool:11,database_url:[8,11],date:[0,5,7,8,9],db:11,debian:11,default_staticmap:[8,11],defin:9,definit:8,delet:[0,6,7,8,9],depend:[8,11],desc:7,descent:[7,9],describ:11,descript:11,detail:[6,8],develop:[8,10],dialect:12,differ:[6,8,9],direct:[8,9],directli:11,directori:[8,11],disabl:[0,8,9,11],displai:[7,8,9,10,11,12],distanc:[3,7,8,9],distance_from:7,distance_to:7,distribut:11,docker:8,document:[8,10,11],doe:[0,5,6,7,8],don:0,dotenv:8,down:8,download:[7,8,9,11],dramatiq:[8,11],drop:8,dropdown:9,due:8,durat:[3,7,8,9],duration_from:7,duration_to:7,dure:[0,7],easi:8,edit:[0,8,9],electr:9,elev:[7,8,9,11],els:11,email:[0,1,6,8,9],email_url:11,empti:8,en:[0,6],enabl:[1,9],encount:11,end:[5,7],endpoint:[1,8],engin:[8,11,12],english:9,enter:[8,9],entiti:[0,7],entri:11,entrypoint:8,env:11,environ:[8,12],error:[0,1,4,6,7,8,9,11,12],europ:[0,6],evalu:[8,11],even:[8,9],exampl:[0,1,3,4,5,6,7,10,11],exc:12,exce:[0,7],exceed:8,except:6,execstart:11,exhaust:10,exist:[0,5,6,7,9,10,11],expir:[0,1,3,4,5,6,7],extens:[0,7],fa33f4d996844a5c73ecd1ae24456ab8:7,fail:[8,13],fals:[0,1,4,6,7,11],farest:[3,8],farthest:9,fd:[0,3,6,7],featur:[10,11],fetch:11,file:[0,1,7,8,9,10,11],filter:[8,9],finish:8,first:[0,9],first_nam:[0,6],fitotrack:10,fittracke:[9,11,13],fittrackee_cli:11,fittrackee_set_admin:11,fittrackee_upgrade_db:11,fittrackee_work:11,flask:11,flask_app:11,flaticon:11,fmstrat:8,follow:[3,9,11,12],forbidden:[0,1,4,5,6,7],forecast:11,form:[0,7],format:[0,5,7],former:11,forrunn:10,forward:11,found:[0,4,5,6,7],fr:6,frame:5,freepik:11,french:9,fri:7,from:[5,7,8,9,10],full:[8,9],fullchain:11,fullscreen:8,gener:[8,9,11],get:[0,1,3,4,5,6,7],gif:0,git:11,github:11,given:[0,11],gmt:[0,3,6,7],gpl:10,gpx:[7,8,9,10,11],gpx_limit_import:1,gpxpy:[0,9,11],grant:11,graph:8,greater:8,gunicorn:[11,12],gz:11,h:[7,9],ha:[6,9],handl:[0,9,11],has_workout:4,have:[1,4,5,6,7,8],he:6,header:[0,1,3,4,5,6,7],health:1,heavi:[10,11],hexadecim:0,hi:[0,6,8,9],hike:[4,8,9],home:11,host:11,href:[1,11],http2:11,http:[0,1,3,4,5,6,7,11],hvybqybra7wwxpastwr4v2:[0,3,6],i18n:8,icon:[8,11],id:[0,3,4,5,6,7],imag:[0,6,7,8,9,11],imperi:[8,9],imperial_unit:[0,6],inact:[0,6,11],includ:8,incorrect:8,index:7,indic:9,info:0,inform:[0,8,10,11],init:11,initi:[8,11],initialis:[8,11],input:8,insid:11,instal:[8,10],instanc:[1,9,11],instead:9,instruct:[0,8],integ:[1,4,5,6,7],interceptor:8,interfac:11,intern:[0,1,4,6,7],introduc:8,invalid:[0,1,3,4,5,6,7,8,11],io:11,ip:11,is_act:[0,4,6],is_active_for_us:4,is_admin:6,is_registration_en:1,issu:[10,11],jan:7,javascript:8,jinja:8,john_do:6,jpeg:6,jpg:0,js:11,json:[0,1,3,4,5,6,7],jul:[0,3,6,7],keep:[8,10,11],kei:[8,9,11],kjxavsturjvoah2wvcegef:7,km:[7,9],label:[4,8],languag:[0,6,9],larg:[0,7,9],larger:11,last:[0,11],last_nam:[0,6],latitud:7,launch:8,layer:[8,11],ld:[0,3,6,7],leaflet:[7,11],least:7,legitim:8,less:8,librari:11,licens:[8,10],like:[9,11],limit:[8,9],link:11,linux:11,list:[8,10,11],listen:11,load:[8,12],local:[8,10,11],localhost:[8,11],locat:[0,6,11],lock:9,log:[0,1,3,4,5,6,7,10,11,12],logfil:11,login:0,logo:11,logout:8,longer:[8,12],longest:[3,8,9],longitud:7,m:[0,5,7],made:11,mai:[9,10,11],mailhog:11,major:8,make:[8,11],makefil:11,manag:8,mandatori:[7,8,11],map:[7,8,9,10],map_attribut:[1,11],map_id:7,map_til:7,marker:8,match:0,max:[1,6,7,8],max_alt:7,max_single_file_s:1,max_spe:7,max_speed_from:7,max_speed_to:7,max_us:1,max_zip_file_s:1,maxim:7,maximum:[3,8,9],messag:[0,1,7,8],method:11,metric:9,migrat:[8,11],min:8,min_alt:7,minim:7,miss:[0,8],mobil:10,model:8,modifi:[6,8],modification_d:7,modul:11,mon:7,mondai:[0,5,9],montain:8,month:[5,8,9],more:[8,9,10,11],morn:7,mountain:[4,9],mous:8,move:[7,8],movement:8,ms:[0,3,6,7],multi:11,multipart:[0,7],must:[0,1,4,6,8,9,11,12],mv:11,n:0,name:[0,5,6,11],nano:11,nb_sport:[0,6],nb_workout:[0,5,6],necessari:[9,11],need:11,network:11,new_email:6,new_password:0,newli:[0,11],next:9,next_workout:7,nginx:[9,11],no_gpx:7,non:[4,10],noopen:11,noreferr:11,nosuchmoduleerror:12,note:[7,8,9,11],now:[8,9,11],number:[1,6,7,8,9,11],oauth:[0,1,3,4,5,6,7],object:[0,1,4,6,7],ok:[0,1,3,4,5,6,7],omit:11,one:[0,6,7,9],onli:[0,6,7,8,9,11],open:[10,11],openstreetmap:[1,8,11],opentrack:10,option:[8,11],order:[6,7,8],order_bi:6,org:[1,11],origin:9,os:11,other:[6,11],outdoor:[8,10,11],over:8,overrid:9,overridden:9,overwrit:11,own:[6,10],owner:[8,9],packag:[8,11],paf38:8,page:[6,7],pagin:[6,7],par_pag:6,paramet:[0,4,5,6,7,8,9],pari:[0,6],pars:[8,11],part:[0,7],pass:11,password:[0,6,8,9,11],patch:[0,1,4,6,7],path:11,paus:[7,8],payload:[0,1,4,6,7],pem:11,per:[6,7,8],per_pag:[6,7],period:9,permiss:[1,4,5,6,7],pg_dump:11,pictur:[0,6,7],ping:1,pip:11,pipenv:8,pleas:[0,1,3,4,5,6,7,8],plugin:12,png:[0,7,11],poetri:[8,11],point:[8,11],pong:1,pool:11,port:11,posit:[8,9],possibl:[8,10],post:[0,7],postgr:[8,12],postgresql:[8,11,12],prefer:[0,6,8],previous_workout:7,privileg:11,privkei:11,process:[0,9,11],product:8,productionconfig:11,profil:0,project:11,provid:[0,1,3,4,5,6,7,8,9,11],proxi:11,proxy_add_x_forwarded_for:11,proxy_pass:11,proxy_redirect:11,proxy_set_head:11,pull:11,purpos:[8,11],pwd:11,py:11,python:[8,11],q:6,queri:[5,6,7],queue:11,r:11,rais:9,read:8,real:11,rebuild:8,rechart:7,recommend:11,record:[0,2,6,7,8,9],record_typ:[0,3,6,7],redi:[8,11],redis_url:11,refactor:8,regardless:6,regist:[0,1,11],registr:[0,1,8,9],rel:11,relat:[9,11],releas:11,remain:8,remote_addr:11,remov:[6,8,9],renam:8,replac:[8,11],repo:11,report:8,repositori:11,request:[0,1,3,4,5,6,7],request_uri:11,requir:0,resend:0,resent:0,reset:[0,6,8,9],reset_password:6,resolut:8,respons:[0,1,3,4,5,6,7],restart:11,restartsec:11,right:[6,8,9,11],rout:8,row:9,run:[4,8,9,11],runner:10,s:[6,7,8,11],sam:[0,6],same:8,samr1:11,sanit:8,sat:6,save:[8,9],schema:11,screen:[8,9],script:8,search:8,second:7,secret:11,see:[8,9,10,11],seem:8,segment:[7,8,9],segment_id:7,select:[0,7],send:[0,6,8,11],sender:11,sender_email:11,serv:[8,11],server:[0,1,4,6,7,8,9,10],server_nam:11,servic:11,set:[8,9,11],sever:[8,10,11],shell:11,should:11,show:8,shown:8,side:8,signatur:[0,1,3,4,5,6,7],simpl:11,simplifi:8,sinc:11,singl:[1,6],size:[0,1,7,8,9],ski:9,sky:11,slow:8,small:8,smtp:[8,11],snowsho:[8,9],some:[6,7,8,10,11],sorri:0,sort:[6,7],spawn:11,speed:[0,3,7,8,9,11],spinner:8,sport:[0,2,5,7,8,9,11],sport_id:[0,3,4,5,6,7],sports_list:[0,6],sql:11,sqlalchemi:[8,11,12],ssl:11,ssl_certif:11,ssl_certificate_kei:11,standard:[8,11],standarderror:11,standardoutput:11,start:[0,5,7,8,9,11,13],startlimitintervalsec:11,starttl:11,stat:[5,8],staticmap:11,statist:2,statu:[0,1,3,4,5,6,7],step:11,still:[9,10],stop:[0,8,9,11],stopped_speed_threshold:[0,4],store:[9,10],street:10,string:[0,1,4,5,6,7],subdomain:7,success:[0,1,3,4,5,6,7],successfulli:0,sun:[0,3,6,7],sundai:[5,7,9],support:[8,9,12],syslog:11,syslogidentifi:11,system:[9,11],systemd:11,t:[0,8,12],taken:0,tar:11,target:11,task:11,templat:8,term:[8,11],test:11,textarea:8,than:[6,8],thank:8,thei:11,them:10,thi:[7,8,9,10,11],threshold:[0,8,9],thunderforest:[8,11],tile:[7,8],tile_server_url:11,time:[0,5,7,8,9],timezon:[0,6,8,9],titl:7,tl:11,todo:14,token:[0,1,3,4,5,6,7],too:[0,7],tool:11,tooltip:[8,9],total:[8,9],total_asc:5,total_dist:[0,5,6],total_dur:[0,5,6],track:10,trail:9,transport:[4,8,9],troubleshoot:10,type:[0,1,3,4,5,6,7,11],typescript:11,u:11,ui:8,ui_url:11,unauthor:[0,1,3,4,5,6,7],under:[10,11],underscor:0,unencrypt:11,unit:[8,11],unstabl:[10,11],up:[9,10],updat:[0,1,4,6,7,8,9,11],upgrad:8,upload:[8,9,11],upload_fold:11,uploads_dir_s:5,uri:8,url:[8,11,12],us:[0,6,7,8,9,10,11],user:[0,1,2,3,4,5,7,8,9,11,13],user_id:0,user_nam:[5,6],usernam:[0,6,8,11],uuid:[7,8],v0:11,v3:10,valid:[0,1,3,4,5,6,7,8,11],valu:[0,3,6,7],variabl:[8,12],venv:11,version:[1,11],view:[8,9],virtualenv:11,vue3:11,vue:11,vue_app_api_url:11,vuex:11,w:8,wa:8,wai:11,walk:[4,8,9],wantedbi:11,warn:8,weather:[8,9,11],weather_api:11,weather_api_kei:11,weather_end:7,weather_start:7,web:[0,10,11],week:[0,5,8,9],weekend:8,weekm:[0,5,6],were:8,wget:11,when:[0,1,8,9,11],where:11,which:9,wind:[8,9],with_gpx:7,without:[5,6,7,8,9,10],worker:[8,11],workers_process:11,workingdirectori:11,workout:[0,2,5,8,10],workout_d:[0,3,6,7],workout_id:[0,3,6,7],workout_short_id:7,workouts_count:6,written:11,www:[1,11],x:[7,11],xml:7,xxxx:11,xzf:11,y:[0,5,7,11],yai:11,yarn:11,year:[5,9],yet:10,you:[1,4,5,6,7,10],your:[6,10,11],z:[7,11],zip:[1,7,8,9],zone:0,zoom:7},titles:["Authentication","Configuration","API documentation","Records","Sports","Statistics","Users","Workouts","Change log","Features","FitTrackee","Installation","Administrator","Troubleshooting","User"],titleterms:{"0":8,"01":8,"02":8,"03":8,"04":8,"05":8,"07":8,"09":8,"1":8,"10":8,"11":8,"12":8,"13":8,"14":8,"15":8,"16":8,"17":8,"19":8,"2":8,"2018":8,"2019":8,"2020":8,"2021":8,"2022":8,"21":8,"23":8,"29":8,"3":8,"30":8,"31":8,"4":8,"5":8,"6":8,"7":8,"8":8,"9":8,"new":8,account:9,administr:[8,9,12],api:2,authent:0,avail:8,bug:8,chang:8,close:8,configur:1,content:10,dashboard:9,deploy:11,detail:9,dev:11,develop:11,docker:11,document:2,email:11,endpoint:[2,13],environ:11,fail:12,featur:[8,9],first:8,fittracke:[8,10,12],fix:8,french:8,from:11,improv:8,instal:11,issu:8,list:9,log:8,map:11,minor:8,misc:8,prefer:9,prerequisit:11,prod:11,product:11,pull:8,pypi:[8,11],record:3,releas:8,request:8,screenshot:9,secur:8,server:11,sourc:11,sport:4,start:12,statist:[5,8,9],tabl:10,tile:11,translat:9,troubleshoot:13,upgrad:11,user:[6,14],variabl:11,version:8,workout:[7,9]}}) \ No newline at end of file diff --git a/docsrc/source/api/auth.rst b/docsrc/source/api/auth.rst index 9195d865..8d54d004 100644 --- a/docsrc/source/api/auth.rst +++ b/docsrc/source/api/auth.rst @@ -4,8 +4,9 @@ Authentication .. autoflask:: fittrackee:create_app() :endpoints: auth.register_user, + auth.confirm_account, + auth.resend_account_confirmation_email, auth.login_user, - auth.logout_user, auth.get_authenticated_user_profile, auth.edit_user, auth.edit_user_preferences, @@ -14,4 +15,6 @@ Authentication auth.edit_picture, auth.del_picture, auth.request_password_reset, - auth.update_password + auth.update_user_account, + auth.update_password, + auth.update_email diff --git a/docsrc/source/features.rst b/docsrc/source/features.rst index e013b0bd..4f917b52 100644 --- a/docsrc/source/features.rst +++ b/docsrc/source/features.rst @@ -44,9 +44,13 @@ Workouts - average speed (**new in 0.5.1**) - User records by sports: - average speed - - farest distance + - farthest distance - longest duration - maximum speed + +.. note:: + Records may differ from records displayed by the application that originally generated the gpx files. + - Workouts list and filter. Only sports with workouts are displayed in sport dropdown. .. note:: @@ -58,6 +62,7 @@ Account & preferences - A user can create, update and deleted his account - A user can set language, timezone and first day of week. - A user can reset his password (*new in 0.3.0*) +- A user can change his email address (*new in 0.6.0*) - A user can choose between metric system and imperial system for distance, elevation and speed display (*new in 0.5.0*) - A user can set sport preferences (*new in 0.5.0*): - change sport color (used for sport image and charts) @@ -82,6 +87,7 @@ Administration - maximum size of uploaded files - maximum size of zip archive - maximum number of files in the zip archive. If an archive contains more files, only the configured number of files is processed, without raising errors. + - administrator email for contact (*new in 0.6.0*) .. warning:: Updating server configuration may be necessary to handle large files (like `nginx `_ for instance). @@ -89,8 +95,12 @@ Administration - **Users** - - display users list and details - - edit a user to add/remove administration rights + - display and filter users list + - edit a user to: + - add/remove administration rights + - activate his account (*new in 0.6.0*) + - update his email (in case his account is locked) (*new in 0.6.0*) + - reset his password (in case his account is locked) (*new in 0.6.0*) - delete a user - **Sports** diff --git a/docsrc/source/installation.rst b/docsrc/source/installation.rst index b9d46376..66e03bda 100644 --- a/docsrc/source/installation.rst +++ b/docsrc/source/installation.rst @@ -298,6 +298,8 @@ For instance, copy and update ``.env`` file from ``.env.example`` and source the $ fittrackee_set_admin +.. note:: + If the user account is inactive, it activates it. From sources ^^^^^^^^^^^^ diff --git a/fittrackee/users/auth.py b/fittrackee/users/auth.py index a6cbb5b7..1c315e40 100644 --- a/fittrackee/users/auth.py +++ b/fittrackee/users/auth.py @@ -64,7 +64,7 @@ def send_account_confirmation_email(user: User) -> None: @auth_blueprint.route('/auth/register', methods=['POST']) def register_user() -> Union[Tuple[Dict, int], HttpResponse]: """ - register a user + register a user and send confirmation email. The newly created account is inactive. The user must confirm his email to activate it. @@ -97,7 +97,7 @@ def register_user() -> Union[Tuple[Dict, int], HttpResponse]: Content-Type: application/json { - "message": "Errors: email: valid email must be provided\n", + "message": "Errors: email: valid email must be provided\\n", "status": "error" } @@ -111,8 +111,9 @@ def register_user() -> Union[Tuple[Dict, int], HttpResponse]: - sorry, that username is already taken - Errors: - username: 3 to 30 characters required - - username: only alphanumeric characters and the underscore - character "_" allowed + - username: + only alphanumeric characters and the underscore + character "_" allowed - email: valid email must be provided - password: 8 characters required :statuscode 403: @@ -177,7 +178,8 @@ def register_user() -> Union[Tuple[Dict, int], HttpResponse]: def login_user() -> Union[Dict, HttpResponse]: """ user login - Only user with active account can log in + + Only user with an active account can log in. **Example request**: @@ -205,7 +207,7 @@ def login_user() -> Union[Dict, HttpResponse]: .. sourcecode:: http - HTTP/1.1 404 NOT FOUND + HTTP/1.1 401 UNAUTHORIZED Content-Type: application/json { @@ -253,7 +255,7 @@ def get_authenticated_user_profile( auth_user: User, ) -> Union[Dict, HttpResponse]: """ - get authenticated user info + get authenticated user info (profile, account, preferences) **Example request**: @@ -353,7 +355,7 @@ def get_authenticated_user_profile( @authenticate def edit_user(auth_user: User) -> Union[Dict, HttpResponse]: """ - edit authenticated user + edit authenticated user profile **Example request**: @@ -503,6 +505,14 @@ def update_user_account(auth_user: User) -> Union[Dict, HttpResponse]: """ update authenticated user email and password + It sends emails: + + - Password change + - Email change: + + - one to the current address to inform user + - another one to the new address to confirm it. + **Example request**: .. sourcecode:: http @@ -1283,6 +1293,8 @@ def update_email() -> Union[Dict, HttpResponse]: **Example response**: + .. sourcecode:: http + HTTP/1.1 200 OK Content-Type: application/json @@ -1340,6 +1352,8 @@ def confirm_account() -> Union[Dict, HttpResponse]: **Example response**: + .. sourcecode:: http + HTTP/1.1 200 OK Content-Type: application/json @@ -1400,6 +1414,8 @@ def resend_account_confirmation_email() -> Union[Dict, HttpResponse]: **Example response**: + .. sourcecode:: http + HTTP/1.1 200 OK Content-Type: application/json diff --git a/fittrackee/users/users.py b/fittrackee/users/users.py index 45db4193..3e821e44 100644 --- a/fittrackee/users/users.py +++ b/fittrackee/users/users.py @@ -51,7 +51,10 @@ def set_admin(username: str) -> None: @authenticate_as_admin def get_users(auth_user: User) -> Dict: """ - Get all users (regardless their account status) + Get all users (regardless their account status), if authenticated user + has admin rights + + It returns user preferences only for authenticated user. **Example request**: @@ -140,7 +143,8 @@ def get_users(auth_user: User) -> Dict: "timezone": "Europe/Paris", "total_distance": 67.895, "total_duration": "6:50:27", - "username": "admin" + "username": "admin", + "weekm": false }, { "admin": false, @@ -250,7 +254,9 @@ def get_single_user( auth_user: User, user_name: str ) -> Union[Dict, HttpResponse]: """ - Get single user details + Get single user details. Only user with admin rights can get user details. + + It returns user preferences only for authenticated user. **Example request**: @@ -402,9 +408,10 @@ def get_picture(user_name: str) -> Any: def update_user(auth_user: User, user_name: str) -> Union[Dict, HttpResponse]: """ Update user account - - add/remove admin rights - - reset password and send email to update user password - - update user email + + - add/remove admin rights (regardless user account status) + - reset password (and send email to update user password) + - update user email (and send email to update user password) - activate account for an inactive user Only user with admin rights can modify another user @@ -413,7 +420,7 @@ def update_user(auth_user: User, user_name: str) -> Union[Dict, HttpResponse]: .. sourcecode:: http - PATCH api/users/ HTTP/1.1 + PATCH /api/users/ HTTP/1.1 Content-Type: application/json **Example response**: