Merge branch 'release-v0.6.5'
							
								
								
									
										17
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						@@ -1,5 +1,22 @@
 | 
				
			|||||||
# Change log
 | 
					# Change log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Version 0.6.5 (2022/04/24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It is now possible to start FitTrackee without a configured SMTP provider (see [documentation](https://samr1.github.io/FitTrackee/installation.html#emails)).
 | 
				
			||||||
 | 
					It reduces pre-requisites for single-user instances.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To manage users, a new [CLI](https://samr1.github.io/FitTrackee/cli.html) is available.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Issues Closed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [#180](https://github.com/SamR1/FitTrackee/issues/180) - allow using FitTrackee without SMTP server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In this release 1 issue was closed.  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Version 0.6.4 (2022/04/23)
 | 
					## Version 0.6.4 (2022/04/23)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Issues Closed
 | 
					### Issues Closed
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
FROM python:3.9
 | 
					FROM python:3.10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# set working directory
 | 
					# set working directory
 | 
				
			||||||
RUN mkdir -p /usr/src/app
 | 
					RUN mkdir -p /usr/src/app
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						@@ -89,11 +89,11 @@ html:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
install-db:
 | 
					install-db:
 | 
				
			||||||
	psql -U postgres -f db/create.sql
 | 
						psql -U postgres -f db/create.sql
 | 
				
			||||||
	$(FLASK) db upgrade --directory $(MIGRATIONS)
 | 
						$(FTCLI) db upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
init-db:
 | 
					init-db:
 | 
				
			||||||
	$(FLASK) drop-db
 | 
						$(FTCLI) db drop
 | 
				
			||||||
	$(FLASK) db upgrade --directory $(MIGRATIONS)
 | 
						$(FTCLI) db upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install: install-client install-python
 | 
					install: install-client install-python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -164,7 +164,8 @@ serve-python-dev:
 | 
				
			|||||||
	$(FLASK) run --with-threads -h $(HOST) -p $(PORT) --cert=adhoc
 | 
						$(FLASK) run --with-threads -h $(HOST) -p $(PORT) --cert=adhoc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set-admin:
 | 
					set-admin:
 | 
				
			||||||
	$(FLASK) users set-admin $(USERNAME)
 | 
						echo "Deprecated command, will be removed in a next version. Use 'user-set-admin' instead."
 | 
				
			||||||
 | 
						$(FTCLI) users update $(USERNAME) --set-admin true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test-e2e:
 | 
					test-e2e:
 | 
				
			||||||
	$(PYTEST) e2e --driver firefox $(PYTEST_ARGS)
 | 
						$(PYTEST) e2e --driver firefox $(PYTEST_ARGS)
 | 
				
			||||||
@@ -185,4 +186,17 @@ type-check:
 | 
				
			|||||||
	$(MYPY) fittrackee
 | 
						$(MYPY) fittrackee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
upgrade-db:
 | 
					upgrade-db:
 | 
				
			||||||
	$(FLASK) db upgrade --directory $(MIGRATIONS)
 | 
						$(FTCLI) db upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					user-activate:
 | 
				
			||||||
 | 
						$(FTCLI) users update $(USERNAME) --activate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					user-reset-password:
 | 
				
			||||||
 | 
						$(FTCLI) users update $(USERNAME) --reset-password
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ADMIN := true
 | 
				
			||||||
 | 
					user-set-admin:
 | 
				
			||||||
 | 
						$(FTCLI) users update $(USERNAME) --set-admin $(ADMIN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					user-update-email:
 | 
				
			||||||
 | 
						$(FTCLI) users update $(USERNAME) --update-email $(EMAIL)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ PYTEST = $(VENV)/bin/py.test -c pyproject.toml -W ignore::DeprecationWarning
 | 
				
			|||||||
GUNICORN = $(VENV)/bin/gunicorn
 | 
					GUNICORN = $(VENV)/bin/gunicorn
 | 
				
			||||||
BLACK = $(VENV)/bin/black
 | 
					BLACK = $(VENV)/bin/black
 | 
				
			||||||
MYPY = $(VENV)/bin/mypy
 | 
					MYPY = $(VENV)/bin/mypy
 | 
				
			||||||
 | 
					FTCLI = $(VENV)/bin/ftcli
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Node env
 | 
					# Node env
 | 
				
			||||||
NODE_MODULES = $(PWD)/fittrackee_client/node_modules
 | 
					NODE_MODULES = $(PWD)/fittrackee_client/node_modules
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,5 +4,5 @@ cd /usr/src/app
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
source .env.docker
 | 
					source .env.docker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
flask drop-db
 | 
					ftcli db drop
 | 
				
			||||||
flask db upgrade --directory fittrackee/migrations
 | 
					ftcli db upgrade
 | 
				
			||||||
@@ -4,4 +4,4 @@ cd /usr/src/app
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
source .env.docker
 | 
					source .env.docker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
flask users set-admin $1
 | 
					ftcli users update $1 --set-admin true
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
# Sphinx build info version 1
 | 
					# Sphinx build info version 1
 | 
				
			||||||
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
 | 
					# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
 | 
				
			||||||
config: 5c4236cdf8857210c21f0a7da25523a7
 | 
					config: 1ea083693023f346a774e8d4c5d799a3
 | 
				
			||||||
tags: 645f666f9bcd5a90fca523b33c5a78b7
 | 
					tags: 645f666f9bcd5a90fca523b33c5a78b7
 | 
				
			||||||
 
 | 
				
			|||||||
| 
		 Before Width: | Height: | Size: 539 KiB After Width: | Height: | Size: 539 KiB  | 
| 
		 Before Width: | Height: | Size: 368 KiB After Width: | Height: | Size: 369 KiB  | 
| 
		 Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 202 KiB  | 
| 
		 Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB  | 
| 
		 Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB  | 
| 
		 Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB  | 
@@ -1,5 +1,22 @@
 | 
				
			|||||||
# Change log
 | 
					# Change log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Version 0.6.5 (2022/04/24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It is now possible to start FitTrackee without a configured SMTP provider (see [documentation](https://samr1.github.io/FitTrackee/installation.html#emails)).
 | 
				
			||||||
 | 
					It reduces pre-requisites for single-user instances.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To manage users, a new [CLI](https://samr1.github.io/FitTrackee/cli.html) is available.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Issues Closed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [#180](https://github.com/SamR1/FitTrackee/issues/180) - allow using FitTrackee without SMTP server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In this release 1 issue was closed.  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Version 0.6.4 (2022/04/23)
 | 
					## Version 0.6.4 (2022/04/23)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Issues Closed
 | 
					### Issues Closed
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										67
									
								
								docs/_sources/cli.rst.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					Command line interface
 | 
				
			||||||
 | 
					######################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A command line interface (CLI) is available to manage database and users.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. code-block:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $ ftcli
 | 
				
			||||||
 | 
					    Usage: ftcli [OPTIONS] COMMAND [ARGS]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      FitTrackee Command Line Interface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Options:
 | 
				
			||||||
 | 
					      --help  Show this message and exit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Commands:
 | 
				
			||||||
 | 
					      db     Manage database.
 | 
				
			||||||
 | 
					      users  Manage users.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. warning::
 | 
				
			||||||
 | 
					    | The following commands are now deprecated and will be removed in a next version:
 | 
				
			||||||
 | 
					    | - ``fittrackee_set_admin``
 | 
				
			||||||
 | 
					    | - ``fittrackee_upgrade_db``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Database
 | 
				
			||||||
 | 
					~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``ftcli db upgrade``
 | 
				
			||||||
 | 
					""""""""""""""""""""
 | 
				
			||||||
 | 
					.. versionadded:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Apply migrations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``ftcli db drop``
 | 
				
			||||||
 | 
					"""""""""""""""""
 | 
				
			||||||
 | 
					.. versionadded:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Empty database and delete uploaded files, only on development environments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Users
 | 
				
			||||||
 | 
					~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``ftcli users update``
 | 
				
			||||||
 | 
					""""""""""""""""""""""
 | 
				
			||||||
 | 
					.. versionadded:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Modify a user account (admin rights, active status, email and password).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. cssclass:: table-bordered
 | 
				
			||||||
 | 
					.. list-table::
 | 
				
			||||||
 | 
					   :widths: 25 50
 | 
				
			||||||
 | 
					   :header-rows: 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   * - Options
 | 
				
			||||||
 | 
					     - Description
 | 
				
			||||||
 | 
					   * - ``--set-admin BOOLEAN``
 | 
				
			||||||
 | 
					     - Add/remove admin rights (when adding admin rights, it also activates user account if not active).
 | 
				
			||||||
 | 
					   * - ``--activate``
 | 
				
			||||||
 | 
					     - Activate user account.
 | 
				
			||||||
 | 
					   * - ``--reset-password``
 | 
				
			||||||
 | 
					     - Reset user password (a new password will be displayed).
 | 
				
			||||||
 | 
					   * - ``--update-email EMAIL``
 | 
				
			||||||
 | 
					     - Update user email.
 | 
				
			||||||
@@ -60,10 +60,11 @@ Workouts
 | 
				
			|||||||
Account & preferences
 | 
					Account & preferences
 | 
				
			||||||
^^^^^^^^^^^^^^^^^^^^^
 | 
					^^^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
- A user can create, update and deleted his account.
 | 
					- A user can create, update and deleted his account.
 | 
				
			||||||
- After registration, the user account is inactive and an email with confirmation instructions is sent to activate it. A user with an inactive account cannot log in. (*new in 0.6.0*)
 | 
					- After registration, the user account is inactive and an email with confirmation instructions is sent to activate it.
 | 
				
			||||||
 | 
					  A user with an inactive account cannot log in. (*new in 0.6.0*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
  The command line to add admin rights activates the account if it is inactive.
 | 
					  In case email sending is not configured, a `command line <cli.html#ftcli-users-update>`__ allows to activate users account.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- A user can set language, timezone and first day of week.
 | 
					- 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 reset his password (*new in 0.3.0*)
 | 
				
			||||||
@@ -97,6 +98,9 @@ Administration
 | 
				
			|||||||
  .. warning::
 | 
					  .. warning::
 | 
				
			||||||
      Updating server configuration may be necessary to handle large files (like `nginx <https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>`_ for instance).
 | 
					      Updating server configuration may be necessary to handle large files (like `nginx <https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>`_ for instance).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .. note::
 | 
				
			||||||
 | 
					      If email sending is disabled, a warning is displayed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Users**
 | 
					- **Users**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,7 +109,7 @@ Administration
 | 
				
			|||||||
      - add/remove administration rights
 | 
					      - add/remove administration rights
 | 
				
			||||||
      - activate his account (*new in 0.6.0*)
 | 
					      - activate his account (*new in 0.6.0*)
 | 
				
			||||||
      - update his email (in case his account is locked) (*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*)
 | 
					      - reset his password (in case his account is locked) (*new in 0.6.0*). If email sending is disabled, it is only possible via CLI.
 | 
				
			||||||
  - delete a user
 | 
					  - delete a user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Sports**
 | 
					- **Sports**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@ Table of contents
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   features
 | 
					   features
 | 
				
			||||||
   installation
 | 
					   installation
 | 
				
			||||||
 | 
					   cli
 | 
				
			||||||
   api/index
 | 
					   api/index
 | 
				
			||||||
   troubleshooting/index
 | 
					   troubleshooting/index
 | 
				
			||||||
   changelog
 | 
					   changelog
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,9 +22,8 @@ Prerequisites
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
-  Python 3.7+
 | 
					-  Python 3.7+
 | 
				
			||||||
-  PostgreSQL database (10+)
 | 
					-  PostgreSQL database (10+)
 | 
				
			||||||
-  SMTP provider
 | 
					-  SMTP provider and Redis for task queue (if email sending is enabled)
 | 
				
			||||||
-  Redis for task queue (to send emails)
 | 
					-  API key from `Dark Sky <https://darksky.net/dev>`__ (not mandatory)
 | 
				
			||||||
-  API key from `Dark Sky <https://darksky.net/dev>`__ [not mandatory]
 | 
					 | 
				
			||||||
-  `Poetry <https://poetry.eustace.io>`__ (for installation from sources only)
 | 
					-  `Poetry <https://poetry.eustace.io>`__ (for installation from sources only)
 | 
				
			||||||
-  `Yarn <https://yarnpkg.com>`__ (for development only)
 | 
					-  `Yarn <https://yarnpkg.com>`__ (for development only)
 | 
				
			||||||
-  Docker and Docker Compose (for development or evaluation purposes)
 | 
					-  Docker and Docker Compose (for development or evaluation purposes)
 | 
				
			||||||
@@ -133,6 +132,13 @@ deployment method.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Email URL with credentials, see `Emails <installation.html#emails>`__.
 | 
					    Email URL with credentials, see `Emails <installation.html#emails>`__.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. versionchanged:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    :default: empty string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. danger::
 | 
				
			||||||
 | 
					        If the email URL is empty, email sending will be disabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .. warning::
 | 
					    .. warning::
 | 
				
			||||||
        If the email URL is invalid, the application may not start.
 | 
					        If the email URL is invalid, the application may not start.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -214,7 +220,7 @@ To send emails, a valid ``EMAIL_URL`` must be provided:
 | 
				
			|||||||
    | - If the email URL is invalid, the application may not start.
 | 
					    | - If the email URL is invalid, the application may not start.
 | 
				
			||||||
    | - Sending emails with Office365 may not work if SMTP auth is disabled.
 | 
					    | - Sending emails with Office365 may not work if SMTP auth is disabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. versionadded:: 0.5.3
 | 
					.. versionchanged:: 0.5.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Credentials can be omitted: ``smtp://smtp.example.com:25``.
 | 
					| Credentials can be omitted: ``smtp://smtp.example.com:25``.
 | 
				
			||||||
| If ``:<port>`` is omitted, the port defaults to 25.
 | 
					| If ``:<port>`` is omitted, the port defaults to 25.
 | 
				
			||||||
@@ -229,6 +235,11 @@ Emails sent by FitTrackee are:
 | 
				
			|||||||
- email change (to old and new email adresses)
 | 
					- email change (to old and new email adresses)
 | 
				
			||||||
- password change
 | 
					- password change
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| For single-user instance, it is possible to disable email sending with an empty ``EMAIL_URL`` (in this case, no need to start dramatiq workers).
 | 
				
			||||||
 | 
					| A `CLI <cli.html#ftcli-users-update>`__ is available to activate account and modify email and password.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Map tile server
 | 
					Map tile server
 | 
				
			||||||
^^^^^^^^^^^^^^^
 | 
					^^^^^^^^^^^^^^^
 | 
				
			||||||
@@ -288,7 +299,7 @@ For instance, copy and update ``.env`` file from ``.env.example`` and source the
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.. code-block:: bash
 | 
					.. code-block:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $ fittrackee_upgrade_db
 | 
					    $ ftcli db upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Start the application
 | 
					- Start the application
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -296,7 +307,7 @@ For instance, copy and update ``.env`` file from ``.env.example`` and source the
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $ fittrackee
 | 
					    $ fittrackee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Start task queue workers
 | 
					- Start task queue workers if email sending is enabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: bash
 | 
					.. code-block:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -311,7 +322,7 @@ For instance, copy and update ``.env`` file from ``.env.example`` and source the
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ fittrackee_set_admin <username>
 | 
					   $ ftcli users update <username> --set-admin true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
    If the user account is inactive, it activates it.
 | 
					    If the user account is inactive, it activates it.
 | 
				
			||||||
@@ -373,7 +384,7 @@ Dev environment
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ make set-admin USERNAME=<username>
 | 
					   $ make user-set-admin USERNAME=<username>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
    If the user account is inactive, it activates it.
 | 
					    If the user account is inactive, it activates it.
 | 
				
			||||||
@@ -384,13 +395,13 @@ Production environment
 | 
				
			|||||||
.. warning::
 | 
					.. warning::
 | 
				
			||||||
    | Note that FitTrackee is under heavy development, some features may be unstable.
 | 
					    | Note that FitTrackee is under heavy development, some features may be unstable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-  Download the last release (for now, it is the release v0.6.4):
 | 
					-  Download the last release (for now, it is the release v0.6.5):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.4.tar.gz
 | 
					   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.5.tar.gz
 | 
				
			||||||
   $ tar -xzf v0.6.4.tar.gz
 | 
					   $ tar -xzf v0.6.5.tar.gz
 | 
				
			||||||
   $ mv FitTrackee-0.6.4 FitTrackee
 | 
					   $ mv FitTrackee-0.6.5 FitTrackee
 | 
				
			||||||
   $ cd FitTrackee
 | 
					   $ cd FitTrackee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-  Create **.env** from example and update it
 | 
					-  Create **.env** from example and update it
 | 
				
			||||||
@@ -415,13 +426,16 @@ Production environment
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   $ make run
 | 
					   $ make run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. note::
 | 
				
			||||||
 | 
					    If email sending is disabled: ``$ make run-server``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Open http://localhost:5000 and register
 | 
					- Open http://localhost:5000 and register
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- To set admin rights to the newly created account, use the following command line:
 | 
					- To set admin rights to the newly created account, use the following command line:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ make set-admin USERNAME=<username>
 | 
					   $ make user-set-admin USERNAME=<username>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
    If the user account is inactive, it activates it.
 | 
					    If the user account is inactive, it activates it.
 | 
				
			||||||
@@ -457,9 +471,9 @@ From PyPI
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.. code-block:: bash
 | 
					.. code-block:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $ fittrackee_upgrade_db
 | 
					    $ ftcli db upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Restart the application and task queue workers.
 | 
					- Restart the application and task queue workers (if email sending is enabled).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
From sources
 | 
					From sources
 | 
				
			||||||
@@ -507,13 +521,13 @@ Prod environment
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
- Change to the directory where FitTrackee directory is located
 | 
					- Change to the directory where FitTrackee directory is located
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Download the last release (for now, it is the release v0.6.4) and overwrite existing files:
 | 
					- Download the last release (for now, it is the release v0.6.5) and overwrite existing files:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.4.tar.gz
 | 
					   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.5.tar.gz
 | 
				
			||||||
   $ tar -xzf v0.6.4.tar.gz
 | 
					   $ tar -xzf v0.6.5.tar.gz
 | 
				
			||||||
   $ cp -R FitTrackee-0.6.4/* FitTrackee/
 | 
					   $ cp -R FitTrackee-0.6.5/* FitTrackee/
 | 
				
			||||||
   $ cd FitTrackee
 | 
					   $ cd FitTrackee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Update **.env** if needed (see `Environment variables <installation.html#environment-variables>`__).
 | 
					- Update **.env** if needed (see `Environment variables <installation.html#environment-variables>`__).
 | 
				
			||||||
@@ -536,6 +550,8 @@ Prod environment
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   $ make run
 | 
					   $ make run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. note::
 | 
				
			||||||
 | 
					    If email sending is disabled: ``$ make run-server``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Deployment
 | 
					Deployment
 | 
				
			||||||
~~~~~~~~~~
 | 
					~~~~~~~~~~
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								docs/_static/documentation_options.js
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,6 +1,6 @@
 | 
				
			|||||||
var DOCUMENTATION_OPTIONS = {
 | 
					var DOCUMENTATION_OPTIONS = {
 | 
				
			||||||
    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
 | 
					    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
 | 
				
			||||||
    VERSION: '0.6.4',
 | 
					    VERSION: '0.6.5',
 | 
				
			||||||
    LANGUAGE: 'None',
 | 
					    LANGUAGE: 'None',
 | 
				
			||||||
    COLLAPSE_INDEX: false,
 | 
					    COLLAPSE_INDEX: false,
 | 
				
			||||||
    BUILDER: 'html',
 | 
					    BUILDER: 'html',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Authentication — FitTrackee 0.6.4
 | 
					    <title>Authentication — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
@@ -237,6 +238,7 @@ character “_” allowed</p></li>
 | 
				
			|||||||
<dt class="sig sig-object http" id="post--api-auth-account-resend-confirmation">
 | 
					<dt class="sig sig-object http" id="post--api-auth-account-resend-confirmation">
 | 
				
			||||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/account/resend-confirmation</span></span><a class="headerlink" href="#post--api-auth-account-resend-confirmation" title="Permalink to this definition">¶</a></dt>
 | 
					<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/account/resend-confirmation</span></span><a class="headerlink" href="#post--api-auth-account-resend-confirmation" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
<dd><p>resend email with instructions to confirm account</p>
 | 
					<dd><p>resend email with instructions to confirm account</p>
 | 
				
			||||||
 | 
					<p>If email sending is disabled, this endpoint is not available</p>
 | 
				
			||||||
<p><strong>Example request</strong>:</p>
 | 
					<p><strong>Example request</strong>:</p>
 | 
				
			||||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/account/resend-confirmation</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
					<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/account/resend-confirmation</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
				
			||||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
					<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
				
			||||||
@@ -262,6 +264,7 @@ character “_” allowed</p></li>
 | 
				
			|||||||
<dd class="field-even"><ul class="simple">
 | 
					<dd class="field-even"><ul class="simple">
 | 
				
			||||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – confirmation email resent</p></li>
 | 
					<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – confirmation email resent</p></li>
 | 
				
			||||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1">400 Bad Request</a></span> – invalid payload</p></li>
 | 
					<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1">400 Bad Request</a></span> – invalid payload</p></li>
 | 
				
			||||||
 | 
					<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5">404 Not Found</a></span> – the requested URL was not found on the server</p></li>
 | 
				
			||||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.1">500 Internal Server Error</a></span> – error, please try again or contact the administrator</p></li>
 | 
					<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.1">500 Internal Server Error</a></span> – error, please try again or contact the administrator</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</dd>
 | 
					</dd>
 | 
				
			||||||
@@ -857,6 +860,7 @@ character “_” allowed</p></li>
 | 
				
			|||||||
<dt class="sig sig-object http" id="post--api-auth-password-reset-request">
 | 
					<dt class="sig sig-object http" id="post--api-auth-password-reset-request">
 | 
				
			||||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/password/reset-request</span></span><a class="headerlink" href="#post--api-auth-password-reset-request" title="Permalink to this definition">¶</a></dt>
 | 
					<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/password/reset-request</span></span><a class="headerlink" href="#post--api-auth-password-reset-request" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
<dd><p>handle password reset request</p>
 | 
					<dd><p>handle password reset request</p>
 | 
				
			||||||
 | 
					<p>If email sending is disabled, this endpoint is not available</p>
 | 
				
			||||||
<p><strong>Example request</strong>:</p>
 | 
					<p><strong>Example request</strong>:</p>
 | 
				
			||||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/password/reset-request</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
					<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/password/reset-request</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
				
			||||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
					<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
				
			||||||
@@ -882,6 +886,7 @@ character “_” allowed</p></li>
 | 
				
			|||||||
<dd class="field-even"><ul class="simple">
 | 
					<dd class="field-even"><ul class="simple">
 | 
				
			||||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – password reset request processed</p></li>
 | 
					<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – password reset request processed</p></li>
 | 
				
			||||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1">400 Bad Request</a></span> – invalid payload</p></li>
 | 
					<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1">400 Bad Request</a></span> – invalid payload</p></li>
 | 
				
			||||||
 | 
					<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5">404 Not Found</a></span> – the requested URL was not found on the server</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</dd>
 | 
					</dd>
 | 
				
			||||||
</dl>
 | 
					</dl>
 | 
				
			||||||
@@ -891,7 +896,7 @@ character “_” allowed</p></li>
 | 
				
			|||||||
<dt class="sig sig-object http" id="patch--api-auth-profile-edit-account">
 | 
					<dt class="sig sig-object http" id="patch--api-auth-profile-edit-account">
 | 
				
			||||||
<span class="sig-name descname"><span class="pre">PATCH</span> </span><span class="sig-name descname"><span class="pre">/api/auth/profile/edit/account</span></span><a class="headerlink" href="#patch--api-auth-profile-edit-account" title="Permalink to this definition">¶</a></dt>
 | 
					<span class="sig-name descname"><span class="pre">PATCH</span> </span><span class="sig-name descname"><span class="pre">/api/auth/profile/edit/account</span></span><a class="headerlink" href="#patch--api-auth-profile-edit-account" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
<dd><p>update authenticated user email and password</p>
 | 
					<dd><p>update authenticated user email and password</p>
 | 
				
			||||||
<p>It sends emails:</p>
 | 
					<p>It sends emails if sending is enabled:</p>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Password change</p></li>
 | 
					<li><p>Password change</p></li>
 | 
				
			||||||
<li><p>Email change:</p>
 | 
					<li><p>Email change:</p>
 | 
				
			||||||
@@ -1021,6 +1026,7 @@ character “_” allowed</p></li>
 | 
				
			|||||||
<dt class="sig sig-object http" id="post--api-auth-password-update">
 | 
					<dt class="sig sig-object http" id="post--api-auth-password-update">
 | 
				
			||||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/password/update</span></span><a class="headerlink" href="#post--api-auth-password-update" title="Permalink to this definition">¶</a></dt>
 | 
					<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/password/update</span></span><a class="headerlink" href="#post--api-auth-password-update" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
<dd><p>update user password after password reset request</p>
 | 
					<dd><p>update user password after password reset request</p>
 | 
				
			||||||
 | 
					<p>It sends emails if sending is enabled</p>
 | 
				
			||||||
<p><strong>Example request</strong>:</p>
 | 
					<p><strong>Example request</strong>:</p>
 | 
				
			||||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/password/update</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
					<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/password/update</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
				
			||||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
					<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Configuration — FitTrackee 0.6.4
 | 
					    <title>Configuration — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
@@ -144,12 +145,13 @@
 | 
				
			|||||||
<span class="w">  </span><span class="nt">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
					<span class="w">  </span><span class="nt">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"admin_contact"</span><span class="p">:</span><span class="w"> </span><span class="s2">"admin@example.com"</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"admin_contact"</span><span class="p">:</span><span class="w"> </span><span class="s2">"admin@example.com"</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"gpx_limit_import"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"gpx_limit_import"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
 | 
					<span class="w">    </span><span class="nt">"is_email_sending_enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"is_registration_enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"is_registration_enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"max_single_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1048576</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"max_single_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1048576</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"max_users"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"max_users"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"max_zip_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"max_zip_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"map_attribution"</span><span class="p">:</span><span class="w"> </span><span class="nt">"&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"map_attribution"</span><span class="p">:</span><span class="w"> </span><span class="nt">"&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.6.4"</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.6.5"</span><span class="w"></span>
 | 
				
			||||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
					<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
				
			||||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
					<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
				
			||||||
<span class="p">}</span><span class="w"></span>
 | 
					<span class="p">}</span><span class="w"></span>
 | 
				
			||||||
@@ -183,12 +185,13 @@
 | 
				
			|||||||
<span class="w">  </span><span class="nt">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
					<span class="w">  </span><span class="nt">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"admin_contact"</span><span class="p">:</span><span class="w"> </span><span class="s2">"admin@example.com"</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"admin_contact"</span><span class="p">:</span><span class="w"> </span><span class="s2">"admin@example.com"</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"gpx_limit_import"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"gpx_limit_import"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
 | 
					<span class="w">    </span><span class="nt">"is_email_sending_enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"is_registration_enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"is_registration_enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"max_single_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1048576</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"max_single_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1048576</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"max_users"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"max_users"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"max_zip_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"max_zip_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"map_attribution"</span><span class="p">:</span><span class="w"> </span><span class="nt">"&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"map_attribution"</span><span class="p">:</span><span class="w"> </span><span class="nt">"&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"</span><span class="w"></span>
 | 
				
			||||||
<span class="w">    </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.6.4"</span><span class="w"></span>
 | 
					<span class="w">    </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.6.5"</span><span class="w"></span>
 | 
				
			||||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
					<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
				
			||||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
					<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
				
			||||||
<span class="p">}</span><span class="w"></span>
 | 
					<span class="p">}</span><span class="w"></span>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>API documentation — FitTrackee 0.6.4
 | 
					    <title>API documentation — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -17,7 +17,7 @@
 | 
				
			|||||||
    <link rel="index" title="Index" href="../genindex.html" />
 | 
					    <link rel="index" title="Index" href="../genindex.html" />
 | 
				
			||||||
    <link rel="search" title="Search" href="../search.html" />
 | 
					    <link rel="search" title="Search" href="../search.html" />
 | 
				
			||||||
    <link rel="next" title="Authentication" href="auth.html" />
 | 
					    <link rel="next" title="Authentication" href="auth.html" />
 | 
				
			||||||
    <link rel="prev" title="Installation" href="../installation.html" />
 | 
					    <link rel="prev" title="Command line interface" href="../cli.html" />
 | 
				
			||||||
<meta charset='utf-8'>
 | 
					<meta charset='utf-8'>
 | 
				
			||||||
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
					<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
				
			||||||
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
 | 
					<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">API documentation</a></li>
 | 
					<li class="toctree-l1 current"><a class="current reference internal" href="#">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
@@ -87,7 +88,7 @@
 | 
				
			|||||||
              
 | 
					              
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
  <li>
 | 
					  <li>
 | 
				
			||||||
    <a href="../installation.html" title="Previous Chapter: Installation"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« Installation</span>
 | 
					    <a href="../cli.html" title="Previous Chapter: Command line interface"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« Command line ...</span>
 | 
				
			||||||
    </a>
 | 
					    </a>
 | 
				
			||||||
  </li>
 | 
					  </li>
 | 
				
			||||||
  <li>
 | 
					  <li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Records — FitTrackee 0.6.4
 | 
					    <title>Records — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Sports — FitTrackee 0.6.4
 | 
					    <title>Sports — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Statistics — FitTrackee 0.6.4
 | 
					    <title>Statistics — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Users — FitTrackee 0.6.4
 | 
					    <title>Users — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
@@ -429,8 +430,9 @@ details.</p>
 | 
				
			|||||||
<dd><p>Update user account</p>
 | 
					<dd><p>Update user account</p>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>add/remove admin rights (regardless user account status)</p></li>
 | 
					<li><p>add/remove admin rights (regardless user account status)</p></li>
 | 
				
			||||||
<li><p>reset password (and send email to update user password)</p></li>
 | 
					<li><p>reset password (and send email to update user password,
 | 
				
			||||||
<li><p>update user email (and send email to update user password)</p></li>
 | 
					if sending enabled)</p></li>
 | 
				
			||||||
 | 
					<li><p>update user email (and send email to new user email, if sending enabled)</p></li>
 | 
				
			||||||
<li><p>activate account for an inactive user</p></li>
 | 
					<li><p>activate account for an inactive user</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<p>Only user with admin rights can modify another user</p>
 | 
					<p>Only user with admin rights can modify another user</p>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Workouts — FitTrackee 0.6.4
 | 
					    <title>Workouts — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Change log — FitTrackee 0.6.4
 | 
					    <title>Change log — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -39,7 +39,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="index.html">
 | 
					        <a class="navbar-brand" href="index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,6 +60,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Change log</a></li>
 | 
					<li class="toctree-l1 current"><a class="current reference internal" href="#">Change log</a></li>
 | 
				
			||||||
@@ -77,8 +78,15 @@
 | 
				
			|||||||
      role="menu"
 | 
					      role="menu"
 | 
				
			||||||
      aria-labelledby="dLabelLocalToc"><ul>
 | 
					      aria-labelledby="dLabelLocalToc"><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#">Change log</a><ul>
 | 
					<li><a class="reference internal" href="#">Change log</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-6-4-2022-04-23">Version 0.6.4 (2022/04/23)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-6-5-2022-04-24">Version 0.6.5 (2022/04/24)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#issues-closed">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#issues-closed">Issues Closed</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#features">Features</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#version-0-6-4-2022-04-23">Version 0.6.4 (2022/04/23)</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id1">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#bugs-fixed">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#bugs-fixed">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
@@ -86,235 +94,235 @@
 | 
				
			|||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-6-3-2022-04-09">Version 0.6.3 (2022/04/09)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-6-3-2022-04-09">Version 0.6.3 (2022/04/09)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#pull-requests">Pull Requests</a><ul>
 | 
					<li><a class="reference internal" href="#pull-requests">Pull Requests</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id1">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id2">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-6-2-2022-04-03">Version 0.6.2 (2022/04/03)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-6-2-2022-04-03">Version 0.6.2 (2022/04/03)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id2">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id3">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id3">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id4">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-6-1-2022-03-27">Version 0.6.1 (2022/03/27)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-6-1-2022-03-27">Version 0.6.1 (2022/03/27)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id4">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id5">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id5">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id6">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-6-0-2022-03-27">Version 0.6.0 (2022/03/27)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-6-0-2022-03-27">Version 0.6.0 (2022/03/27)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id6">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id7">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#features">Features</a></li>
 | 
					<li><a class="reference internal" href="#id8">Features</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id7">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id9">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#id8">Pull Requests</a><ul>
 | 
					<li><a class="reference internal" href="#id10">Pull Requests</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id9">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id11">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-5-7-2022-02-13">Version 0.5.7 (2022/02/13)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-5-7-2022-02-13">Version 0.5.7 (2022/02/13)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id10">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id12">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#misc">Misc</a></li>
 | 
					<li><a class="reference internal" href="#misc">Misc</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#id11">Pull Requests</a><ul>
 | 
					<li><a class="reference internal" href="#id13">Pull Requests</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#security">Security</a></li>
 | 
					<li><a class="reference internal" href="#security">Security</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id12">Misc</a></li>
 | 
					<li><a class="reference internal" href="#id14">Misc</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-5-6-2022-02-05">Version 0.5.6 (2022/02/05)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-5-6-2022-02-05">Version 0.5.6 (2022/02/05)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id13">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id15">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id14">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id16">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#id15">Pull Requests</a></li>
 | 
					<li><a class="reference internal" href="#id17">Pull Requests</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-5-5-2022-01-19">Version 0.5.5 (2022/01/19)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-5-5-2022-01-19">Version 0.5.5 (2022/01/19)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id16">Issues Closed</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#new-features">New Features</a></li>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id17">Bugs Fixed</a></li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#version-0-5-4-2022-01-01">Version 0.5.4 (2022/01/01)</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id18">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id18">Issues Closed</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#new-features">New Features</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id19">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id19">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-5-3-2022-01-01">Version 0.5.3 (2022/01/01)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-5-4-2022-01-01">Version 0.5.4 (2022/01/01)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id20">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id20">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id21">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id21">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-5-2-2021-12-19">Version 0.5.2 (2021/12/19)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-5-3-2022-01-01">Version 0.5.3 (2022/01/01)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id22">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id22">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id23">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id23">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-5-1-2021-11-30">Version 0.5.1 (2021/11/30)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-5-2-2021-12-19">Version 0.5.2 (2021/12/19)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id24">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id24">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id25">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id25">New Features</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-5-0-2021-11-14">Version 0.5.0 (2021/11/14)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-5-1-2021-11-30">Version 0.5.1 (2021/11/30)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id26">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id26">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id27">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id27">New Features</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id28">Bugs Fixed</a></li>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id29">Misc</a></li>
 | 
					 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#id30">Pull Requests</a></li>
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#version-0-5-0-2021-11-14">Version 0.5.0 (2021/11/14)</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id28">Issues Closed</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id29">New Features</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id30">Bugs Fixed</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id31">Misc</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id32">Pull Requests</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-9-2021-07-16">Version 0.4.9 (2021/07/16)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-4-9-2021-07-16">Version 0.4.9 (2021/07/16)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id31">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id33">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id32">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id34">New Features</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id33">Bugs Fixed</a></li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-8-2021-07-03">Version 0.4.8 (2021/07/03)</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id34">Issues Closed</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id35">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id35">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-7-2021-04-07">Version 0.4.7 (2021/04/07)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-4-8-2021-07-03">Version 0.4.8 (2021/07/03)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id36">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id36">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id37">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id37">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#id38">Misc</a></li>
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#version-0-4-7-2021-04-07">Version 0.4.7 (2021/04/07)</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id38">Issues Closed</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id39">Bugs Fixed</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id40">Misc</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-6-2021-02-21">Version 0.4.6 (2021/02/21)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-4-6-2021-02-21">Version 0.4.6 (2021/02/21)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id39">Issues Closed</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id40">Bugs Fixed</a></li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-5-2021-02-17">Version 0.4.5 (2021/02/17)</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id41">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id41">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id42">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id42">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-4-2021-01-31">Version 0.4.4 (2021/01/31)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-4-5-2021-02-17">Version 0.4.5 (2021/02/17)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id43">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id43">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id44">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id44">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#id45">Misc</a></li>
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#version-0-4-4-2021-01-31">Version 0.4.4 (2021/01/31)</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id45">Issues Closed</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id46">Bugs Fixed</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id47">Misc</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-3-2021-01-10">Version 0.4.3 (2021/01/10)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-4-3-2021-01-10">Version 0.4.3 (2021/01/10)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id46">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id48">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id47">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id49">New Features</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id48">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id50">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-2-2021-01-03">Version 0.4.2 (2021/01/03)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-4-2-2021-01-03">Version 0.4.2 (2021/01/03)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id49">Misc</a></li>
 | 
					<li><a class="reference internal" href="#id51">Misc</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-1-2020-12-31">Version 0.4.1 (2020/12/31)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-4-1-2020-12-31">Version 0.4.1 (2020/12/31)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id50">Issues Closed</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id51">New Features</a></li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#version-0-4-0-fittrackee-on-pypi-2020-09-19">Version 0.4.0 - FitTrackee on PyPI (2020/09/19)</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id52">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id52">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id53">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id53">New Features</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-3-0-administration-2020-07-15">Version 0.3.0 - Administration (2020/07/15)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-4-0-fittrackee-on-pypi-2020-09-19">Version 0.4.0 - FitTrackee on PyPI (2020/09/19)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id54">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id54">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id55">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id55">New Features</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#version-0-3-0-administration-2020-07-15">Version 0.3.0 - Administration (2020/07/15)</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id56">Issues Closed</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id57">New Features</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-2-5-fix-and-improvements-2020-01-31">Version 0.2.5 - Fix and improvements (2020/01/31)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-2-5-fix-and-improvements-2020-01-31">Version 0.2.5 - Fix and improvements (2020/01/31)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id56">Misc</a></li>
 | 
					<li><a class="reference internal" href="#id58">Misc</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-2-4-minor-fix-2020-01-30">Version 0.2.4 - Minor fix (2020/01/30)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-2-4-minor-fix-2020-01-30">Version 0.2.4 - Minor fix (2020/01/30)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id57">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id59">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id58">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id60">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-2-3-fittrackee-available-in-french-2019-12-29">Version 0.2.3 - FitTrackee available in French (2019/12/29)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-2-3-fittrackee-available-in-french-2019-12-29">Version 0.2.3 - FitTrackee available in French (2019/12/29)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id59">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id61">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id60">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id62">New Features</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id61">Bugs Fixed</a></li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
</ul>
 | 
					 | 
				
			||||||
</li>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#version-0-2-2-statistics-fix-2019-09-23">Version 0.2.2 - Statistics fix (2019/09/23)</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id62">Issues Closed</a><ul>
 | 
					 | 
				
			||||||
<li><a class="reference internal" href="#id63">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id63">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-2-1-fix-and-improvements-2019-09-01">Version 0.2.1 - Fix and improvements (2019/09/01)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-2-2-statistics-fix-2019-09-23">Version 0.2.2 - Statistics fix (2019/09/23)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id64">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id64">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id65">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id65">Bugs Fixed</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id66">Bugs Fixed</a></li>
 | 
					 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#id67">Misc</a></li>
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#version-0-2-1-fix-and-improvements-2019-09-01">Version 0.2.1 - Fix and improvements (2019/09/01)</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id66">Issues Closed</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id67">New Features</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id68">Bugs Fixed</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#id69">Misc</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-2-0-statistics-2019-07-07">Version 0.2.0 - Statistics (2019/07/07)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-2-0-statistics-2019-07-07">Version 0.2.0 - Statistics (2019/07/07)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id68">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id70">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id69">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id71">New Features</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#id70">Misc</a></li>
 | 
					<li><a class="reference internal" href="#id72">Misc</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-1-1-fix-and-improvements-2019-02-07">Version 0.1.1 - Fix and improvements (2019/02/07)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-1-1-fix-and-improvements-2019-02-07">Version 0.1.1 - Fix and improvements (2019/02/07)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id71">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id73">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id72">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id74">New Features</a></li>
 | 
				
			||||||
<li><a class="reference internal" href="#id73">Bugs Fixed</a></li>
 | 
					<li><a class="reference internal" href="#id75">Bugs Fixed</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><a class="reference internal" href="#version-0-1-0-first-release-2018-07-04">Version 0.1.0 - First release 🎉 (2018-07-04)</a><ul>
 | 
					<li><a class="reference internal" href="#version-0-1-0-first-release-2018-07-04">Version 0.1.0 - First release 🎉 (2018-07-04)</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id74">Issues Closed</a><ul>
 | 
					<li><a class="reference internal" href="#id76">Issues Closed</a><ul>
 | 
				
			||||||
<li><a class="reference internal" href="#id75">New Features</a></li>
 | 
					<li><a class="reference internal" href="#id77">New Features</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -366,10 +374,26 @@
 | 
				
			|||||||
      
 | 
					      
 | 
				
			||||||
  <section id="change-log">
 | 
					  <section id="change-log">
 | 
				
			||||||
<h1>Change log<a class="headerlink" href="#change-log" title="Permalink to this headline">¶</a></h1>
 | 
					<h1>Change log<a class="headerlink" href="#change-log" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
<section id="version-0-6-4-2022-04-23">
 | 
					<section id="version-0-6-5-2022-04-24">
 | 
				
			||||||
<h2>Version 0.6.4 (2022/04/23)<a class="headerlink" href="#version-0-6-4-2022-04-23" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.6.5 (2022/04/24)<a class="headerlink" href="#version-0-6-5-2022-04-24" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<p>It is now possible to start FitTrackee without a configured SMTP provider (see <a class="reference external" href="https://samr1.github.io/FitTrackee/installation.html#emails">documentation</a>).
 | 
				
			||||||
 | 
					It reduces pre-requisites for single-user instances.</p>
 | 
				
			||||||
 | 
					<p>To manage users, a new <a class="reference external" href="https://samr1.github.io/FitTrackee/cli.html">CLI</a> is available.</p>
 | 
				
			||||||
<section id="issues-closed">
 | 
					<section id="issues-closed">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#issues-closed" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#issues-closed" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
 | 
					<section id="features">
 | 
				
			||||||
 | 
					<h4>Features<a class="headerlink" href="#features" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
 | 
					<ul class="simple">
 | 
				
			||||||
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/180">#180</a> - allow using FitTrackee without SMTP server</p></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p>In this release 1 issue was closed.</p>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					<section id="version-0-6-4-2022-04-23">
 | 
				
			||||||
 | 
					<h2>Version 0.6.4 (2022/04/23)<a class="headerlink" href="#version-0-6-4-2022-04-23" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<section id="id1">
 | 
				
			||||||
 | 
					<h3>Issues Closed<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="bugs-fixed">
 | 
					<section id="bugs-fixed">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#bugs-fixed" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#bugs-fixed" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
@@ -383,8 +407,8 @@
 | 
				
			|||||||
<h2>Version 0.6.3 (2022/04/09)<a class="headerlink" href="#version-0-6-3-2022-04-09" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.6.3 (2022/04/09)<a class="headerlink" href="#version-0-6-3-2022-04-09" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="pull-requests">
 | 
					<section id="pull-requests">
 | 
				
			||||||
<h3>Pull Requests<a class="headerlink" href="#pull-requests" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Pull Requests<a class="headerlink" href="#pull-requests" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id1">
 | 
					<section id="id2">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/177">#177</a> - Minor fixes</p>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/177">#177</a> - Minor fixes</p>
 | 
				
			||||||
<ul>
 | 
					<ul>
 | 
				
			||||||
@@ -398,10 +422,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-6-2-2022-04-03">
 | 
					<section id="version-0-6-2-2022-04-03">
 | 
				
			||||||
<h2>Version 0.6.2 (2022/04/03)<a class="headerlink" href="#version-0-6-2-2022-04-03" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.6.2 (2022/04/03)<a class="headerlink" href="#version-0-6-2-2022-04-03" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id2">
 | 
					 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h3>
 | 
					 | 
				
			||||||
<section id="id3">
 | 
					<section id="id3">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h4>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
 | 
					<section id="id4">
 | 
				
			||||||
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/175">#175</a> - Distance card on dashboard is not refreshed</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/175">#175</a> - Distance card on dashboard is not refreshed</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/173">#173</a> - link to user profile in workout card is incorrect</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/173">#173</a> - link to user profile in workout card is incorrect</p></li>
 | 
				
			||||||
@@ -412,10 +436,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-6-1-2022-03-27">
 | 
					<section id="version-0-6-1-2022-03-27">
 | 
				
			||||||
<h2>Version 0.6.1 (2022/03/27)<a class="headerlink" href="#version-0-6-1-2022-03-27" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.6.1 (2022/03/27)<a class="headerlink" href="#version-0-6-1-2022-03-27" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id4">
 | 
					 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h3>
 | 
					 | 
				
			||||||
<section id="id5">
 | 
					<section id="id5">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h4>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
 | 
					<section id="id6">
 | 
				
			||||||
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/171">#171</a> - Stats chart is not updated correctly</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/171">#171</a> - Stats chart is not updated correctly</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -426,26 +450,26 @@
 | 
				
			|||||||
<section id="version-0-6-0-2022-03-27">
 | 
					<section id="version-0-6-0-2022-03-27">
 | 
				
			||||||
<h2>Version 0.6.0 (2022/03/27)<a class="headerlink" href="#version-0-6-0-2022-03-27" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.6.0 (2022/03/27)<a class="headerlink" href="#version-0-6-0-2022-03-27" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<p>This version introduces some changes on <a class="reference external" href="https://samr1.github.io/FitTrackee/features.html#account-preferences">user registration</a>.<br />From now on, a user needs to confirm his account after registration (an email with confirmation instructions is sent after registration).</p>
 | 
					<p>This version introduces some changes on <a class="reference external" href="https://samr1.github.io/FitTrackee/features.html#account-preferences">user registration</a>.<br />From now on, a user needs to confirm his account after registration (an email with confirmation instructions is sent after registration).</p>
 | 
				
			||||||
<section id="id6">
 | 
					<section id="id7">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="features">
 | 
					<section id="id8">
 | 
				
			||||||
<h4>Features<a class="headerlink" href="#features" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Features<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/155">#155</a> -  Improve user registration</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/155">#155</a> -  Improve user registration</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/106">#106</a> -  Allow user to update email</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/106">#106</a> -  Allow user to update email</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id7">
 | 
					<section id="id9">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/169">#169</a> -  user picture is not refreshed after update</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/169">#169</a> -  user picture is not refreshed after update</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id8">
 | 
					<section id="id10">
 | 
				
			||||||
<h3>Pull Requests<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Pull Requests<a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id9">
 | 
					<section id="id11">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/161">#161</a> - Minor translation issue on ‘Farthest’</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/161">#161</a> - Minor translation issue on ‘Farthest’</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/160">#160</a> - Minor translation issue on APP_ERROR</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/160">#160</a> - Minor translation issue on APP_ERROR</p></li>
 | 
				
			||||||
@@ -460,8 +484,8 @@
 | 
				
			|||||||
<p>This release contains several fixes including security fixes.<br />Thanks to @DanielSiersleben for the report.</p>
 | 
					<p>This release contains several fixes including security fixes.<br />Thanks to @DanielSiersleben for the report.</p>
 | 
				
			||||||
<p>And from now on, admin account is not created on application initialization.<br />A new command is added to set administration rights on the account created after registration
 | 
					<p>And from now on, admin account is not created on application initialization.<br />A new command is added to set administration rights on the account created after registration
 | 
				
			||||||
(see <a class="reference external" href="https://samr1.github.io/FitTrackee/installation.html#upgrade">documentation</a>)</p>
 | 
					(see <a class="reference external" href="https://samr1.github.io/FitTrackee/installation.html#upgrade">documentation</a>)</p>
 | 
				
			||||||
<section id="id10">
 | 
					<section id="id12">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="misc">
 | 
					<section id="misc">
 | 
				
			||||||
<h4>Misc<a class="headerlink" href="#misc" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Misc<a class="headerlink" href="#misc" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
@@ -469,8 +493,8 @@
 | 
				
			|||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id11">
 | 
					<section id="id13">
 | 
				
			||||||
<h3>Pull Requests<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Pull Requests<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="security">
 | 
					<section id="security">
 | 
				
			||||||
<h4>Security<a class="headerlink" href="#security" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Security<a class="headerlink" href="#security" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
@@ -488,8 +512,8 @@
 | 
				
			|||||||
</li>
 | 
					</li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id12">
 | 
					<section id="id14">
 | 
				
			||||||
<h4>Misc<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Misc<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/152">#152</a> - Fixes and improvements:</p>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/152">#152</a> - Fixes and improvements:</p>
 | 
				
			||||||
<ul>
 | 
					<ul>
 | 
				
			||||||
@@ -505,17 +529,17 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-5-6-2022-02-05">
 | 
					<section id="version-0-5-6-2022-02-05">
 | 
				
			||||||
<h2>Version 0.5.6 (2022/02/05)<a class="headerlink" href="#version-0-5-6-2022-02-05" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.5.6 (2022/02/05)<a class="headerlink" href="#version-0-5-6-2022-02-05" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id13">
 | 
					<section id="id15">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id14">
 | 
					<section id="id16">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/146">#146</a> - incorrect label on workouts filters</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/146">#146</a> - incorrect label on workouts filters</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id15">
 | 
					<section id="id17">
 | 
				
			||||||
<h3>Pull Requests<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Pull Requests<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/145">#145</a> - fix on database models</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/145">#145</a> - fix on database models</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -524,8 +548,8 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-5-5-2022-01-19">
 | 
					<section id="version-0-5-5-2022-01-19">
 | 
				
			||||||
<h2>Version 0.5.5 (2022/01/19)<a class="headerlink" href="#version-0-5-5-2022-01-19" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.5.5 (2022/01/19)<a class="headerlink" href="#version-0-5-5-2022-01-19" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id16">
 | 
					<section id="id18">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="new-features">
 | 
					<section id="new-features">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#new-features" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#new-features" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
@@ -535,8 +559,8 @@
 | 
				
			|||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/134">#134</a> - Wind direction</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/134">#134</a> - Wind direction</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id17">
 | 
					<section id="id19">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/commit/877fa0faaabc0130402638905fe04f84563eb278">877fa0f</a> - fix sport icon color (when changed) on calendar on small resolutions</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/commit/877fa0faaabc0130402638905fe04f84563eb278">877fa0f</a> - fix sport icon color (when changed) on calendar on small resolutions</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -546,10 +570,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-5-4-2022-01-01">
 | 
					<section id="version-0-5-4-2022-01-01">
 | 
				
			||||||
<h2>Version 0.5.4 (2022/01/01)<a class="headerlink" href="#version-0-5-4-2022-01-01" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.5.4 (2022/01/01)<a class="headerlink" href="#version-0-5-4-2022-01-01" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id18">
 | 
					<section id="id20">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id19">
 | 
					<section id="id21">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/131">#131</a> - No workouts displayed on calendar</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/131">#131</a> - No workouts displayed on calendar</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -559,10 +583,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-5-3-2022-01-01">
 | 
					<section id="version-0-5-3-2022-01-01">
 | 
				
			||||||
<h2>Version 0.5.3 (2022/01/01)<a class="headerlink" href="#version-0-5-3-2022-01-01" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.5.3 (2022/01/01)<a class="headerlink" href="#version-0-5-3-2022-01-01" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id20">
 | 
					<section id="id22">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id21">
 | 
					<section id="id23">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/129">#129</a> - Display only active sports when editing a workout</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/129">#129</a> - Display only active sports when editing a workout</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/127">#127</a> - parse_email_url() can’t validate a legitimate EMAIL_URI such as “smtp://localhost:25”</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/127">#127</a> - parse_email_url() can’t validate a legitimate EMAIL_URI such as “smtp://localhost:25”</p></li>
 | 
				
			||||||
@@ -573,10 +597,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-5-2-2021-12-19">
 | 
					<section id="version-0-5-2-2021-12-19">
 | 
				
			||||||
<h2>Version 0.5.2 (2021/12/19)<a class="headerlink" href="#version-0-5-2-2021-12-19" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.5.2 (2021/12/19)<a class="headerlink" href="#version-0-5-2-2021-12-19" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id22">
 | 
					<section id="id24">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id23">
 | 
					<section id="id25">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/123">#123</a> - Allow user to reset preferences for a sport</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/123">#123</a> - Allow user to reset preferences for a sport</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/121">#121</a> - Add activity : snowshoes</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/121">#121</a> - Add activity : snowshoes</p></li>
 | 
				
			||||||
@@ -587,10 +611,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-5-1-2021-11-30">
 | 
					<section id="version-0-5-1-2021-11-30">
 | 
				
			||||||
<h2>Version 0.5.1 (2021/11/30)<a class="headerlink" href="#version-0-5-1-2021-11-30" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.5.1 (2021/11/30)<a class="headerlink" href="#version-0-5-1-2021-11-30" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id24">
 | 
					<section id="id26">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id25">
 | 
					<section id="id27">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/116">#116</a> - Better UI for Speed and Elevation buttons in the graph of the Workout screen</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/116">#116</a> - Better UI for Speed and Elevation buttons in the graph of the Workout screen</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/115">#115</a> - Add option to download the GPX file of a Workout</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/115">#115</a> - Add option to download the GPX file of a Workout</p></li>
 | 
				
			||||||
@@ -602,10 +626,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-5-0-2021-11-14">
 | 
					<section id="version-0-5-0-2021-11-14">
 | 
				
			||||||
<h2>Version 0.5.0 (2021/11/14)<a class="headerlink" href="#version-0-5-0-2021-11-14" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.5.0 (2021/11/14)<a class="headerlink" href="#version-0-5-0-2021-11-14" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id26">
 | 
					<section id="id28">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id27">
 | 
					<section id="id29">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/99">#99</a> - Display workout with imperial units</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/99">#99</a> - Display workout with imperial units</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/91">#91</a> - Display elevation chart with min and max altitude of workout</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/91">#91</a> - Display elevation chart with min and max altitude of workout</p></li>
 | 
				
			||||||
@@ -613,21 +637,21 @@
 | 
				
			|||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/18">#18</a> - Better UI</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/18">#18</a> - Better UI</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id28">
 | 
					<section id="id30">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/95">#95</a> - Some workouts seem to be missing on statistics chart</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/95">#95</a> - Some workouts seem to be missing on statistics chart</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id29">
 | 
					<section id="id31">
 | 
				
			||||||
<h4>Misc<a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Misc<a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/104">#104</a> - Switch to AGPLv3 license</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/104">#104</a> - Switch to AGPLv3 license</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id30">
 | 
					<section id="id32">
 | 
				
			||||||
<h3>Pull Requests<a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Pull Requests<a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/101">#101</a> - Docker updates for full files</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/101">#101</a> - Docker updates for full files</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/100">#100</a> - Add client application in docker for development</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/pull/100">#100</a> - Add client application in docker for development</p></li>
 | 
				
			||||||
@@ -644,17 +668,17 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-9-2021-07-16">
 | 
					<section id="version-0-4-9-2021-07-16">
 | 
				
			||||||
<h2>Version 0.4.9 (2021/07/16)<a class="headerlink" href="#version-0-4-9-2021-07-16" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.9 (2021/07/16)<a class="headerlink" href="#version-0-4-9-2021-07-16" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id31">
 | 
					<section id="id33">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id32">
 | 
					<section id="id34">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id34" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/83">#83</a> - allow using configured tile server to generate static maps<br /><strong>Note</strong>: to keep using the default tile server, set environment variable <code class="docutils literal notranslate"><span class="pre">DEFAULT_STATICMAP</span></code> to <code class="docutils literal notranslate"><span class="pre">True</span></code></p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/83">#83</a> - allow using configured tile server to generate static maps<br /><strong>Note</strong>: to keep using the default tile server, set environment variable <code class="docutils literal notranslate"><span class="pre">DEFAULT_STATICMAP</span></code> to <code class="docutils literal notranslate"><span class="pre">True</span></code></p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/81">#81</a> - display remaining characters in textarea</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/81">#81</a> - display remaining characters in textarea</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id33">
 | 
					<section id="id35">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id35" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/82">#82</a> - a user can not modify his birth day</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/82">#82</a> - a user can not modify his birth day</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/80">#80</a> - can not save notes with control characters</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/80">#80</a> - can not save notes with control characters</p></li>
 | 
				
			||||||
@@ -665,10 +689,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-8-2021-07-03">
 | 
					<section id="version-0-4-8-2021-07-03">
 | 
				
			||||||
<h2>Version 0.4.8 (2021/07/03)<a class="headerlink" href="#version-0-4-8-2021-07-03" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.8 (2021/07/03)<a class="headerlink" href="#version-0-4-8-2021-07-03" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id34">
 | 
					<section id="id36">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id34" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id35">
 | 
					<section id="id37">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id35" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/79">#79</a> - Fails to start after make rebuild</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/79">#79</a> - Fails to start after make rebuild</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -678,17 +702,17 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-7-2021-04-07">
 | 
					<section id="version-0-4-7-2021-04-07">
 | 
				
			||||||
<h2>Version 0.4.7 (2021/04/07)<a class="headerlink" href="#version-0-4-7-2021-04-07" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.7 (2021/04/07)<a class="headerlink" href="#version-0-4-7-2021-04-07" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id36">
 | 
					<section id="id38">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id37">
 | 
					<section id="id39">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/75">#75</a> - Workouts on the same day are not displayed in right order</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/75">#75</a> - Workouts on the same day are not displayed in right order</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id38">
 | 
					<section id="id40">
 | 
				
			||||||
<h3>Misc<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Misc<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Update Python and Javascript dependencies<br /><strong>IMPORTANT</strong>: Due to <a class="reference external" href="https://docs.sqlalchemy.org/en/14/changelog/changelog_14.html#change-3687655465c25a39b968b4f5f6e9170b">SQLAlchemy update (1.4+)</a>, engine URLs starting with <code class="docutils literal notranslate"><span class="pre">postgres://</span></code> are no longer supported. Please update <code class="docutils literal notranslate"><span class="pre">DATABASE_URL</span></code> with <code class="docutils literal notranslate"><span class="pre">postgresql://</span></code>.</p></li>
 | 
					<li><p>Update Python and Javascript dependencies<br /><strong>IMPORTANT</strong>: Due to <a class="reference external" href="https://docs.sqlalchemy.org/en/14/changelog/changelog_14.html#change-3687655465c25a39b968b4f5f6e9170b">SQLAlchemy update (1.4+)</a>, engine URLs starting with <code class="docutils literal notranslate"><span class="pre">postgres://</span></code> are no longer supported. Please update <code class="docutils literal notranslate"><span class="pre">DATABASE_URL</span></code> with <code class="docutils literal notranslate"><span class="pre">postgresql://</span></code>.</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -697,10 +721,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-6-2021-02-21">
 | 
					<section id="version-0-4-6-2021-02-21">
 | 
				
			||||||
<h2>Version 0.4.6 (2021/02/21)<a class="headerlink" href="#version-0-4-6-2021-02-21" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.6 (2021/02/21)<a class="headerlink" href="#version-0-4-6-2021-02-21" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id39">
 | 
					<section id="id41">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id41" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id40">
 | 
					<section id="id42">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/72">#72</a> - Error message when file exceeding size is incorrect</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/72">#72</a> - Error message when file exceeding size is incorrect</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/71">#71</a> - max size or max number of files must be greater than 0</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/71">#71</a> - max size or max number of files must be greater than 0</p></li>
 | 
				
			||||||
@@ -712,10 +736,10 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-5-2021-02-17">
 | 
					<section id="version-0-4-5-2021-02-17">
 | 
				
			||||||
<h2>Version 0.4.5 (2021/02/17)<a class="headerlink" href="#version-0-4-5-2021-02-17" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.5 (2021/02/17)<a class="headerlink" href="#version-0-4-5-2021-02-17" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id41">
 | 
					<section id="id43">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id41" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id42">
 | 
					<section id="id44">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/66">#66</a> - invalid gpx limit used when importing zip archive</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/66">#66</a> - invalid gpx limit used when importing zip archive</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/64">#64</a> - Only 50 workouts per month shown in calendar</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/64">#64</a> - Only 50 workouts per month shown in calendar</p></li>
 | 
				
			||||||
@@ -726,17 +750,17 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-4-2021-01-31">
 | 
					<section id="version-0-4-4-2021-01-31">
 | 
				
			||||||
<h2>Version 0.4.4 (2021/01/31)<a class="headerlink" href="#version-0-4-4-2021-01-31" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.4 (2021/01/31)<a class="headerlink" href="#version-0-4-4-2021-01-31" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id43">
 | 
					<section id="id45">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id44">
 | 
					<section id="id46">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/62">#62</a> - Error when sending reset password email</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/62">#62</a> - Error when sending reset password email</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id45">
 | 
					<section id="id47">
 | 
				
			||||||
<h3>Misc<a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Misc<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Refactoring before introducing new features.</p></li>
 | 
					<li><p>Refactoring before introducing new features.</p></li>
 | 
				
			||||||
<li><p>Add docker files for evaluation purposes.</p></li>
 | 
					<li><p>Add docker files for evaluation purposes.</p></li>
 | 
				
			||||||
@@ -746,16 +770,16 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-3-2021-01-10">
 | 
					<section id="version-0-4-3-2021-01-10">
 | 
				
			||||||
<h2>Version 0.4.3 (2021/01/10)<a class="headerlink" href="#version-0-4-3-2021-01-10" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.3 (2021/01/10)<a class="headerlink" href="#version-0-4-3-2021-01-10" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id46">
 | 
					<section id="id48">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id47">
 | 
					<section id="id49">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/58">#58</a> - Standardize terms used for workouts<br /><strong>Note:</strong> Database model, upload directory for workouts and API endpoints are also updated.</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/58">#58</a> - Standardize terms used for workouts<br /><strong>Note:</strong> Database model, upload directory for workouts and API endpoints are also updated.</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id48">
 | 
					<section id="id50">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/59">#59</a> - No message displayed on uploading image error</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/59">#59</a> - No message displayed on uploading image error</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -765,18 +789,18 @@
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-2-2021-01-03">
 | 
					<section id="version-0-4-2-2021-01-03">
 | 
				
			||||||
<h2>Version 0.4.2 (2021/01/03)<a class="headerlink" href="#version-0-4-2-2021-01-03" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.2 (2021/01/03)<a class="headerlink" href="#version-0-4-2-2021-01-03" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id49">
 | 
					<section id="id51">
 | 
				
			||||||
<h3>Misc<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Misc<a class="headerlink" href="#id51" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<p>No new features in this release, only some refactorings before introducing
 | 
					<p>No new features in this release, only some refactorings before introducing
 | 
				
			||||||
new features.</p>
 | 
					new features.</p>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-4-1-2020-12-31">
 | 
					<section id="version-0-4-1-2020-12-31">
 | 
				
			||||||
<h2>Version 0.4.1 (2020/12/31)<a class="headerlink" href="#version-0-4-1-2020-12-31" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.4.1 (2020/12/31)<a class="headerlink" href="#version-0-4-1-2020-12-31" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id50">
 | 
					<section id="id52">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id51">
 | 
					<section id="id53">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id51" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/57">#57</a> - Use uuid for activities</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/57">#57</a> - Use uuid for activities</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -792,10 +816,10 @@ new features.</p>
 | 
				
			|||||||
<li><p>It’s now possible to change the tile provider for maps. The default tile server is now <strong>OpenStreetMap</strong>’s standard tile layer (replacing <strong>ThunderForest Outdoors</strong>),
 | 
					<li><p>It’s now possible to change the tile provider for maps. The default tile server is now <strong>OpenStreetMap</strong>’s standard tile layer (replacing <strong>ThunderForest Outdoors</strong>),
 | 
				
			||||||
see <a class="reference external" href="https://samr1.github.io/FitTrackee/installation.html#map-tile-server">Map tile server in documentation</a>.</p></li>
 | 
					see <a class="reference external" href="https://samr1.github.io/FitTrackee/installation.html#map-tile-server">Map tile server in documentation</a>.</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<section id="id52">
 | 
					<section id="id54">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id53">
 | 
					<section id="id55">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id55" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/54">#54</a> - Tile server can be changed</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/54">#54</a> - Tile server can be changed</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/53">#53</a> - Simplify FitTrackee installation</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/53">#53</a> - Simplify FitTrackee installation</p></li>
 | 
				
			||||||
@@ -811,10 +835,10 @@ see <a class="reference external" href="https://samr1.github.io/FitTrackee/insta
 | 
				
			|||||||
<li><p>FitTrackee administration is now available (see <a class="reference external" href="https://samr1.github.io/FitTrackee/features.html#administration">documentation</a>)<br />⚠️ Warning: some application parameters move from environment variables to database (see <a class="reference external" href="https://samr1.github.io/FitTrackee/installation.html#environment-variables">installation</a>).</p></li>
 | 
					<li><p>FitTrackee administration is now available (see <a class="reference external" href="https://samr1.github.io/FitTrackee/features.html#administration">documentation</a>)<br />⚠️ Warning: some application parameters move from environment variables to database (see <a class="reference external" href="https://samr1.github.io/FitTrackee/installation.html#environment-variables">installation</a>).</p></li>
 | 
				
			||||||
<li><p>in order to send emails, Redis is now a mandatory dependency</p></li>
 | 
					<li><p>in order to send emails, Redis is now a mandatory dependency</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<section id="id54">
 | 
					<section id="id56">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id55">
 | 
					<section id="id57">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id55" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/50">#50</a> - A user can reset his password</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/50">#50</a> - A user can reset his password</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/17">#17</a> - A user can delete his account</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/17">#17</a> - A user can delete his account</p></li>
 | 
				
			||||||
@@ -826,8 +850,8 @@ see <a class="reference external" href="https://samr1.github.io/FitTrackee/insta
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-2-5-fix-and-improvements-2020-01-31">
 | 
					<section id="version-0-2-5-fix-and-improvements-2020-01-31">
 | 
				
			||||||
<h2>Version 0.2.5 - Fix and improvements (2020/01/31)<a class="headerlink" href="#version-0-2-5-fix-and-improvements-2020-01-31" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.2.5 - Fix and improvements (2020/01/31)<a class="headerlink" href="#version-0-2-5-fix-and-improvements-2020-01-31" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id56">
 | 
					<section id="id58">
 | 
				
			||||||
<h3>Misc<a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Misc<a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<p>This version contains minor fix and improvements on client side:</p>
 | 
					<p>This version contains minor fix and improvements on client side:</p>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/commit/4c3fc343d51b9c27d3ebab71df648bcf7d7bae59">4c3fc34</a> - empty user data on logout</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/commit/4c3fc343d51b9c27d3ebab71df648bcf7d7bae59">4c3fc34</a> - empty user data on logout</p></li>
 | 
				
			||||||
@@ -840,10 +864,10 @@ add URL interceptors to simplify routes definition</p></li>
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-2-4-minor-fix-2020-01-30">
 | 
					<section id="version-0-2-4-minor-fix-2020-01-30">
 | 
				
			||||||
<h2>Version 0.2.4 - Minor fix (2020/01/30)<a class="headerlink" href="#version-0-2-4-minor-fix-2020-01-30" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.2.4 - Minor fix (2020/01/30)<a class="headerlink" href="#version-0-2-4-minor-fix-2020-01-30" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id57">
 | 
					<section id="id59">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id59" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id58">
 | 
					<section id="id60">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/47">#47</a> - timezone drop-down is not displayed correctly</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/47">#47</a> - timezone drop-down is not displayed correctly</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/46">#46</a> - calendar cannot display more than 5 or 6 activities on the same day</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/46">#46</a> - calendar cannot display more than 5 or 6 activities on the same day</p></li>
 | 
				
			||||||
@@ -854,17 +878,17 @@ add URL interceptors to simplify routes definition</p></li>
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-2-3-fittrackee-available-in-french-2019-12-29">
 | 
					<section id="version-0-2-3-fittrackee-available-in-french-2019-12-29">
 | 
				
			||||||
<h2>Version 0.2.3 - FitTrackee available in French (2019/12/29)<a class="headerlink" href="#version-0-2-3-fittrackee-available-in-french-2019-12-29" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.2.3 - FitTrackee available in French (2019/12/29)<a class="headerlink" href="#version-0-2-3-fittrackee-available-in-french-2019-12-29" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id59">
 | 
					<section id="id61">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id59" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id61" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id60">
 | 
					<section id="id62">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id62" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/43">#43</a> - Display weekend days with a different background color on calendar</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/43">#43</a> - Display weekend days with a different background color on calendar</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/40">#40</a> - Localize FitTrackee (i18n)</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/40">#40</a> - Localize FitTrackee (i18n)</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id61">
 | 
					<section id="id63">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id61" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/44">#44</a> - Cannot edit an activity that does not have a gpx file</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/44">#44</a> - Cannot edit an activity that does not have a gpx file</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -874,10 +898,10 @@ add URL interceptors to simplify routes definition</p></li>
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-2-2-statistics-fix-2019-09-23">
 | 
					<section id="version-0-2-2-statistics-fix-2019-09-23">
 | 
				
			||||||
<h2>Version 0.2.2 - Statistics fix (2019/09/23)<a class="headerlink" href="#version-0-2-2-statistics-fix-2019-09-23" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.2.2 - Statistics fix (2019/09/23)<a class="headerlink" href="#version-0-2-2-statistics-fix-2019-09-23" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id62">
 | 
					<section id="id64">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id62" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id63">
 | 
					<section id="id65">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/41">#41</a> - User statistics are incorrect</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/41">#41</a> - User statistics are incorrect</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -887,10 +911,10 @@ add URL interceptors to simplify routes definition</p></li>
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-2-1-fix-and-improvements-2019-09-01">
 | 
					<section id="version-0-2-1-fix-and-improvements-2019-09-01">
 | 
				
			||||||
<h2>Version 0.2.1 - Fix and improvements (2019/09/01)<a class="headerlink" href="#version-0-2-1-fix-and-improvements-2019-09-01" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.2.1 - Fix and improvements (2019/09/01)<a class="headerlink" href="#version-0-2-1-fix-and-improvements-2019-09-01" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id64">
 | 
					<section id="id66">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id65">
 | 
					<section id="id67">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/4">#4</a> - Show points on the map when mouse over the chart</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/4">#4</a> - Show points on the map when mouse over the chart</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/14">#14</a> - Display segments informations</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/14">#14</a> - Display segments informations</p></li>
 | 
				
			||||||
@@ -901,15 +925,15 @@ add URL interceptors to simplify routes definition</p></li>
 | 
				
			|||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/37">#37</a> - Display map on activities list</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/37">#37</a> - Display map on activities list</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id66">
 | 
					<section id="id68">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/34">#34</a> - Weather is not displayed anymore</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/34">#34</a> - Weather is not displayed anymore</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id67">
 | 
					<section id="id69">
 | 
				
			||||||
<h3>Misc<a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Misc<a class="headerlink" href="#id69" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><strong><a class="reference external" href="https://poetry.eustace.io/">Poetry</a></strong> replaces <strong><a class="reference external" href="https://docs.pipenv.org">pipenv</a></strong> for Python packages management</p></li>
 | 
					<li><p><strong><a class="reference external" href="https://poetry.eustace.io/">Poetry</a></strong> replaces <strong><a class="reference external" href="https://docs.pipenv.org">pipenv</a></strong> for Python packages management</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -918,17 +942,17 @@ add URL interceptors to simplify routes definition</p></li>
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-2-0-statistics-2019-07-07">
 | 
					<section id="version-0-2-0-statistics-2019-07-07">
 | 
				
			||||||
<h2>Version 0.2.0 - Statistics (2019/07/07)<a class="headerlink" href="#version-0-2-0-statistics-2019-07-07" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.2.0 - Statistics (2019/07/07)<a class="headerlink" href="#version-0-2-0-statistics-2019-07-07" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id68">
 | 
					<section id="id70">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id70" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id69">
 | 
					<section id="id71">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id69" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id71" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/13">#13</a> - Detailed statistics</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/Fittrackee/issues/13">#13</a> - Detailed statistics</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id70">
 | 
					<section id="id72">
 | 
				
			||||||
<h3>Misc<a class="headerlink" href="#id70" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Misc<a class="headerlink" href="#id72" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Update dependencies</p></li>
 | 
					<li><p>Update dependencies</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
@@ -937,17 +961,17 @@ add URL interceptors to simplify routes definition</p></li>
 | 
				
			|||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="version-0-1-1-fix-and-improvements-2019-02-07">
 | 
					<section id="version-0-1-1-fix-and-improvements-2019-02-07">
 | 
				
			||||||
<h2>Version 0.1.1 - Fix and improvements (2019/02/07)<a class="headerlink" href="#version-0-1-1-fix-and-improvements-2019-02-07" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Version 0.1.1 - Fix and improvements (2019/02/07)<a class="headerlink" href="#version-0-1-1-fix-and-improvements-2019-02-07" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<section id="id71">
 | 
					<section id="id73">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id71" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id73" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id72">
 | 
					<section id="id74">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id72" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id74" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/25">#25</a> - Display records on calendar</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/25">#25</a> - Display records on calendar</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/22">#22</a> - Add a total on current month statistics</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/22">#22</a> - Add a total on current month statistics</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id73">
 | 
					<section id="id75">
 | 
				
			||||||
<h4>Bugs Fixed<a class="headerlink" href="#id73" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>Bugs Fixed<a class="headerlink" href="#id75" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/31">#31</a> - Use moving duration for stats</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/31">#31</a> - Use moving duration for stats</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/29">#29</a> - Pause duration calculation with segments</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/29">#29</a> - Pause duration calculation with segments</p></li>
 | 
				
			||||||
@@ -996,10 +1020,10 @@ add URL interceptors to simplify routes definition</p></li>
 | 
				
			|||||||
<li><p>no administration for now</p></li>
 | 
					<li><p>no administration for now</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<p>➡️ more informations: see <a class="reference external" href="https://samr1.github.io/FitTrackee/">documentation</a>  and <a class="reference external" href="https://github.com/SamR1/FitTrackee/issues">current issues</a></p>
 | 
					<p>➡️ more informations: see <a class="reference external" href="https://samr1.github.io/FitTrackee/">documentation</a>  and <a class="reference external" href="https://github.com/SamR1/FitTrackee/issues">current issues</a></p>
 | 
				
			||||||
<section id="id74">
 | 
					<section id="id76">
 | 
				
			||||||
<h3>Issues Closed<a class="headerlink" href="#id74" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Issues Closed<a class="headerlink" href="#id76" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
<section id="id75">
 | 
					<section id="id77">
 | 
				
			||||||
<h4>New Features<a class="headerlink" href="#id75" title="Permalink to this headline">¶</a></h4>
 | 
					<h4>New Features<a class="headerlink" href="#id77" title="Permalink to this headline">¶</a></h4>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/11">#11</a> - Timezone support</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/11">#11</a> - Timezone support</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/10">#10</a> - Add a note to an activity</p></li>
 | 
					<li><p><a class="reference external" href="https://github.com/SamR1/FitTrackee/issues/10">#10</a> - Add a note to an activity</p></li>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										236
									
								
								docs/cli.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,236 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					  <head>
 | 
				
			||||||
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <title>Command line interface — FitTrackee 0.6.5
 | 
				
			||||||
 | 
					 documentation</title>
 | 
				
			||||||
 | 
					    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
				
			||||||
 | 
					    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
				
			||||||
 | 
					    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
 | 
				
			||||||
 | 
					    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
 | 
				
			||||||
 | 
					    <script src="_static/jquery.js"></script>
 | 
				
			||||||
 | 
					    <script src="_static/underscore.js"></script>
 | 
				
			||||||
 | 
					    <script src="_static/doctools.js"></script>
 | 
				
			||||||
 | 
					    <link rel="index" title="Index" href="genindex.html" />
 | 
				
			||||||
 | 
					    <link rel="search" title="Search" href="search.html" />
 | 
				
			||||||
 | 
					    <link rel="next" title="API documentation" href="api/index.html" />
 | 
				
			||||||
 | 
					    <link rel="prev" title="Installation" href="installation.html" />
 | 
				
			||||||
 | 
					<meta charset='utf-8'>
 | 
				
			||||||
 | 
					<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
				
			||||||
 | 
					<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
 | 
				
			||||||
 | 
					<meta name="apple-mobile-web-app-capable" content="yes">
 | 
				
			||||||
 | 
					<script type="text/javascript" src="_static/js/jquery-1.12.4.min.js"></script>
 | 
				
			||||||
 | 
					<script type="text/javascript" src="_static/js/jquery-fix.js"></script>
 | 
				
			||||||
 | 
					<script type="text/javascript" src="_static/bootstrap-3.4.1/js/bootstrap.min.js"></script>
 | 
				
			||||||
 | 
					<script type="text/javascript" src="_static/bootstrap-sphinx.js"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head><body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <div id="navbar" class="navbar navbar-default navbar-fixed-top">
 | 
				
			||||||
 | 
					    <div class="container">
 | 
				
			||||||
 | 
					      <div class="navbar-header">
 | 
				
			||||||
 | 
					        <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
 | 
				
			||||||
 | 
					        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
 | 
				
			||||||
 | 
					          <span class="icon-bar"></span>
 | 
				
			||||||
 | 
					          <span class="icon-bar"></span>
 | 
				
			||||||
 | 
					          <span class="icon-bar"></span>
 | 
				
			||||||
 | 
					        </button>
 | 
				
			||||||
 | 
					        <a class="navbar-brand" href="index.html">
 | 
				
			||||||
 | 
					          FitTrackee</a>
 | 
				
			||||||
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
 | 
					</b></span>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="collapse navbar-collapse nav-collapse">
 | 
				
			||||||
 | 
					          <ul class="nav navbar-nav">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					                <li><a href="https://github.com/SamR1/FitTrackee">GitHub</a></li>
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					              <li class="dropdown globaltoc-container">
 | 
				
			||||||
 | 
					  <a role="button"
 | 
				
			||||||
 | 
					     id="dLabelGlobalToc"
 | 
				
			||||||
 | 
					     data-toggle="dropdown"
 | 
				
			||||||
 | 
					     data-target="#"
 | 
				
			||||||
 | 
					     href="index.html">Docs <b class="caret"></b></a>
 | 
				
			||||||
 | 
					  <ul class="dropdown-menu globaltoc"
 | 
				
			||||||
 | 
					      role="menu"
 | 
				
			||||||
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1 current"><a class="current reference internal" href="#">Command line interface</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					                <li class="dropdown">
 | 
				
			||||||
 | 
					  <a role="button"
 | 
				
			||||||
 | 
					     id="dLabelLocalToc"
 | 
				
			||||||
 | 
					     data-toggle="dropdown"
 | 
				
			||||||
 | 
					     data-target="#"
 | 
				
			||||||
 | 
					     href="#">Page <b class="caret"></b></a>
 | 
				
			||||||
 | 
					  <ul class="dropdown-menu localtoc"
 | 
				
			||||||
 | 
					      role="menu"
 | 
				
			||||||
 | 
					      aria-labelledby="dLabelLocalToc"><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#">Command line interface</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#database">Database</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#ftcli-db-upgrade"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">db</span> <span class="pre">upgrade</span></code></a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#ftcli-db-drop"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">db</span> <span class="pre">drop</span></code></a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#users">Users</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#ftcli-users-update"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">update</span></code></a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					  <li>
 | 
				
			||||||
 | 
					    <a href="installation.html" title="Previous Chapter: Installation"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« Installation</span>
 | 
				
			||||||
 | 
					    </a>
 | 
				
			||||||
 | 
					  </li>
 | 
				
			||||||
 | 
					  <li>
 | 
				
			||||||
 | 
					    <a href="api/index.html" title="Next Chapter: API documentation"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">API documentation »</span>
 | 
				
			||||||
 | 
					    </a>
 | 
				
			||||||
 | 
					  </li>
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					              <li class="hidden-sm">
 | 
				
			||||||
 | 
					<div id="sourcelink">
 | 
				
			||||||
 | 
					  <a href="_sources/cli.rst.txt"
 | 
				
			||||||
 | 
					     rel="nofollow">Source</a>
 | 
				
			||||||
 | 
					</div></li>
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					          </ul>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					<form class="navbar-form navbar-right" action="search.html" method="get">
 | 
				
			||||||
 | 
					 <div class="form-group">
 | 
				
			||||||
 | 
					  <input type="text" name="q" class="form-control" placeholder="Search" />
 | 
				
			||||||
 | 
					 </div>
 | 
				
			||||||
 | 
					  <input type="hidden" name="check_keywords" value="yes" />
 | 
				
			||||||
 | 
					  <input type="hidden" name="area" value="default" />
 | 
				
			||||||
 | 
					</form>
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="container">
 | 
				
			||||||
 | 
					  <div class="row">
 | 
				
			||||||
 | 
					    <div class="body col-md-12 content" role="main">
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <section id="command-line-interface">
 | 
				
			||||||
 | 
					<h1>Command line interface<a class="headerlink" href="#command-line-interface" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
 | 
					<p>A command line interface (CLI) is available to manage database and users.</p>
 | 
				
			||||||
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ ftcli
 | 
				
			||||||
 | 
					Usage: ftcli <span class="o">[</span>OPTIONS<span class="o">]</span> COMMAND <span class="o">[</span>ARGS<span class="o">]</span>...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FitTrackee Command Line Interface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Options:
 | 
				
			||||||
 | 
					  --help  Show this message and exit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Commands:
 | 
				
			||||||
 | 
					  db     Manage database.
 | 
				
			||||||
 | 
					  users  Manage users.
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="admonition warning">
 | 
				
			||||||
 | 
					<p class="admonition-title">Warning</p>
 | 
				
			||||||
 | 
					<div class="line-block">
 | 
				
			||||||
 | 
					<div class="line">The following commands are now deprecated and will be removed in a next version:</div>
 | 
				
			||||||
 | 
					<div class="line">- <code class="docutils literal notranslate"><span class="pre">fittrackee_set_admin</span></code></div>
 | 
				
			||||||
 | 
					<div class="line">- <code class="docutils literal notranslate"><span class="pre">fittrackee_upgrade_db</span></code></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<section id="database">
 | 
				
			||||||
 | 
					<h2>Database<a class="headerlink" href="#database" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<section id="ftcli-db-upgrade">
 | 
				
			||||||
 | 
					<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">db</span> <span class="pre">upgrade</span></code><a class="headerlink" href="#ftcli-db-upgrade" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
 | 
					<div class="versionadded">
 | 
				
			||||||
 | 
					<p><span class="versionmodified added">New in version 0.6.5.</span></p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<p>Apply migrations.</p>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					<section id="ftcli-db-drop">
 | 
				
			||||||
 | 
					<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">db</span> <span class="pre">drop</span></code><a class="headerlink" href="#ftcli-db-drop" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
 | 
					<div class="versionadded">
 | 
				
			||||||
 | 
					<p><span class="versionmodified added">New in version 0.6.5.</span></p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<p>Empty database and delete uploaded files, only on development environments.</p>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					<section id="users">
 | 
				
			||||||
 | 
					<h2>Users<a class="headerlink" href="#users" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<section id="ftcli-users-update">
 | 
				
			||||||
 | 
					<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">update</span></code><a class="headerlink" href="#ftcli-users-update" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
 | 
					<div class="versionadded">
 | 
				
			||||||
 | 
					<p><span class="versionmodified added">New in version 0.6.5.</span></p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<p>Modify a user account (admin rights, active status, email and password).</p>
 | 
				
			||||||
 | 
					<table class="colwidths-given table-bordered docutils align-default">
 | 
				
			||||||
 | 
					<colgroup>
 | 
				
			||||||
 | 
					<col style="width: 33%" />
 | 
				
			||||||
 | 
					<col style="width: 67%" />
 | 
				
			||||||
 | 
					</colgroup>
 | 
				
			||||||
 | 
					<thead>
 | 
				
			||||||
 | 
					<tr class="row-odd"><th class="head"><p>Options</p></th>
 | 
				
			||||||
 | 
					<th class="head"><p>Description</p></th>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					</thead>
 | 
				
			||||||
 | 
					<tbody>
 | 
				
			||||||
 | 
					<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">--set-admin</span> <span class="pre">BOOLEAN</span></code></p></td>
 | 
				
			||||||
 | 
					<td><p>Add/remove admin rights (when adding admin rights, it also activates user account if not active).</p></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">--activate</span></code></p></td>
 | 
				
			||||||
 | 
					<td><p>Activate user account.</p></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">--reset-password</span></code></p></td>
 | 
				
			||||||
 | 
					<td><p>Reset user password (a new password will be displayed).</p></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">--update-email</span> <span class="pre">EMAIL</span></code></p></td>
 | 
				
			||||||
 | 
					<td><p>Update user email.</p></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					</tbody>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<footer class="footer">
 | 
				
			||||||
 | 
					  <div class="container">
 | 
				
			||||||
 | 
					    <p class="pull-right">
 | 
				
			||||||
 | 
					      <a href="#">Back to top</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    </p>
 | 
				
			||||||
 | 
					    <p>
 | 
				
			||||||
 | 
					        © Copyright 2018 - 2022, SamR1.<br/>
 | 
				
			||||||
 | 
					      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 4.5.0.<br/>
 | 
				
			||||||
 | 
					    </p>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</footer>
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Features — FitTrackee 0.6.4
 | 
					    <title>Features — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="index.html">
 | 
					        <a class="navbar-brand" href="index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Features</a></li>
 | 
					<li class="toctree-l1 current"><a class="current reference internal" href="#">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
				
			||||||
@@ -233,11 +234,12 @@
 | 
				
			|||||||
<h2>Account & preferences<a class="headerlink" href="#account-preferences" title="Permalink to this headline">¶</a></h2>
 | 
					<h2>Account & preferences<a class="headerlink" href="#account-preferences" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>A user can create, update and deleted his account.</p></li>
 | 
					<li><p>A user can create, update and deleted his account.</p></li>
 | 
				
			||||||
<li><p>After registration, the user account is inactive and an email with confirmation instructions is sent to activate it. A user with an inactive account cannot log in. (<em>new in 0.6.0</em>)</p></li>
 | 
					<li><p>After registration, the user account is inactive and an email with confirmation instructions is sent to activate it.
 | 
				
			||||||
 | 
					A user with an inactive account cannot log in. (<em>new in 0.6.0</em>)</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="admonition note">
 | 
					<div class="admonition note">
 | 
				
			||||||
<p class="admonition-title">Note</p>
 | 
					<p class="admonition-title">Note</p>
 | 
				
			||||||
<p>The command line to add admin rights activates the account if it is inactive.</p>
 | 
					<p>In case email sending is not configured, a <a class="reference external" href="cli.html#ftcli-users-update">command line</a> allows to activate users account.</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>A user can set language, timezone and first day of week.</p></li>
 | 
					<li><p>A user can set language, timezone and first day of week.</p></li>
 | 
				
			||||||
@@ -280,6 +282,10 @@
 | 
				
			|||||||
<p class="admonition-title">Warning</p>
 | 
					<p class="admonition-title">Warning</p>
 | 
				
			||||||
<p>Updating server configuration may be necessary to handle large files (like <a class="reference external" href="https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size">nginx</a> for instance).</p>
 | 
					<p>Updating server configuration may be necessary to handle large files (like <a class="reference external" href="https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size">nginx</a> for instance).</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="admonition note">
 | 
				
			||||||
 | 
					<p class="admonition-title">Note</p>
 | 
				
			||||||
 | 
					<p>If email sending is disabled, a warning is displayed.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
</li>
 | 
					</li>
 | 
				
			||||||
<li><p><strong>Users</strong></p>
 | 
					<li><p><strong>Users</strong></p>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
@@ -289,7 +295,7 @@
 | 
				
			|||||||
<li><p>add/remove administration rights</p></li>
 | 
					<li><p>add/remove administration rights</p></li>
 | 
				
			||||||
<li><p>activate his account (<em>new in 0.6.0</em>)</p></li>
 | 
					<li><p>activate his account (<em>new in 0.6.0</em>)</p></li>
 | 
				
			||||||
<li><p>update his email (in case his account is locked) (<em>new in 0.6.0</em>)</p></li>
 | 
					<li><p>update his email (in case his account is locked) (<em>new in 0.6.0</em>)</p></li>
 | 
				
			||||||
<li><p>reset his password (in case his account is locked) (<em>new in 0.6.0</em>)</p></li>
 | 
					<li><p>reset his password (in case his account is locked) (<em>new in 0.6.0</em>). If email sending is disabled, it is only possible via CLI.</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</dd>
 | 
					</dd>
 | 
				
			||||||
</dl>
 | 
					</dl>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
  <head>
 | 
					  <head>
 | 
				
			||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
				
			||||||
    <title>Index — FitTrackee 0.6.4
 | 
					    <title>Index — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -37,7 +37,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="index.html">
 | 
					        <a class="navbar-brand" href="index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -58,6 +58,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul>
 | 
					      aria-labelledby="dLabelGlobalToc"><ul>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
  <head>
 | 
					  <head>
 | 
				
			||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
				
			||||||
    <title>HTTP Routing Table — FitTrackee 0.6.4
 | 
					    <title>HTTP Routing Table — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -44,7 +44,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="index.html">
 | 
					        <a class="navbar-brand" href="index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -65,6 +65,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul>
 | 
					      aria-labelledby="dLabelGlobalToc"><ul>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>FitTrackee — FitTrackee 0.6.4
 | 
					    <title>FitTrackee — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -39,7 +39,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="#">
 | 
					        <a class="navbar-brand" href="#">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,6 +60,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul>
 | 
					      aria-labelledby="dLabelGlobalToc"><ul>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
				
			||||||
@@ -153,6 +154,7 @@ Map</a>.</div>
 | 
				
			|||||||
<ul>
 | 
					<ul>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Installation — FitTrackee 0.6.4
 | 
					    <title>Installation — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -16,7 +16,7 @@
 | 
				
			|||||||
    <script src="_static/doctools.js"></script>
 | 
					    <script src="_static/doctools.js"></script>
 | 
				
			||||||
    <link rel="index" title="Index" href="genindex.html" />
 | 
					    <link rel="index" title="Index" href="genindex.html" />
 | 
				
			||||||
    <link rel="search" title="Search" href="search.html" />
 | 
					    <link rel="search" title="Search" href="search.html" />
 | 
				
			||||||
    <link rel="next" title="API documentation" href="api/index.html" />
 | 
					    <link rel="next" title="Command line interface" href="cli.html" />
 | 
				
			||||||
    <link rel="prev" title="Features" href="features.html" />
 | 
					    <link rel="prev" title="Features" href="features.html" />
 | 
				
			||||||
<meta charset='utf-8'>
 | 
					<meta charset='utf-8'>
 | 
				
			||||||
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
					<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="index.html">
 | 
					        <a class="navbar-brand" href="index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Installation</a></li>
 | 
					<li class="toctree-l1 current"><a class="current reference internal" href="#">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
				
			||||||
@@ -123,7 +124,7 @@
 | 
				
			|||||||
    </a>
 | 
					    </a>
 | 
				
			||||||
  </li>
 | 
					  </li>
 | 
				
			||||||
  <li>
 | 
					  <li>
 | 
				
			||||||
    <a href="api/index.html" title="Next Chapter: API documentation"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">API documentation »</span>
 | 
					    <a href="cli.html" title="Next Chapter: Command line interface"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Command line ... »</span>
 | 
				
			||||||
    </a>
 | 
					    </a>
 | 
				
			||||||
  </li>
 | 
					  </li>
 | 
				
			||||||
              
 | 
					              
 | 
				
			||||||
@@ -191,9 +192,8 @@
 | 
				
			|||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Python 3.7+</p></li>
 | 
					<li><p>Python 3.7+</p></li>
 | 
				
			||||||
<li><p>PostgreSQL database (10+)</p></li>
 | 
					<li><p>PostgreSQL database (10+)</p></li>
 | 
				
			||||||
<li><p>SMTP provider</p></li>
 | 
					<li><p>SMTP provider and Redis for task queue (if email sending is enabled)</p></li>
 | 
				
			||||||
<li><p>Redis for task queue (to send emails)</p></li>
 | 
					<li><p>API key from <a class="reference external" href="https://darksky.net/dev">Dark Sky</a> (not mandatory)</p></li>
 | 
				
			||||||
<li><p>API key from <a class="reference external" href="https://darksky.net/dev">Dark Sky</a> [not mandatory]</p></li>
 | 
					 | 
				
			||||||
<li><p><a class="reference external" href="https://poetry.eustace.io">Poetry</a> (for installation from sources only)</p></li>
 | 
					<li><p><a class="reference external" href="https://poetry.eustace.io">Poetry</a> (for installation from sources only)</p></li>
 | 
				
			||||||
<li><p><a class="reference external" href="https://yarnpkg.com">Yarn</a> (for development only)</p></li>
 | 
					<li><p><a class="reference external" href="https://yarnpkg.com">Yarn</a> (for development only)</p></li>
 | 
				
			||||||
<li><p>Docker and Docker Compose (for development or evaluation purposes)</p></li>
 | 
					<li><p>Docker and Docker Compose (for development or evaluation purposes)</p></li>
 | 
				
			||||||
@@ -352,6 +352,18 @@ see <a class="reference external" href="https://docs.sqlalchemy.org/en/13/core/p
 | 
				
			|||||||
<p><span class="versionmodified added">New in version 0.3.0.</span></p>
 | 
					<p><span class="versionmodified added">New in version 0.3.0.</span></p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<p>Email URL with credentials, see <a class="reference external" href="installation.html#emails">Emails</a>.</p>
 | 
					<p>Email URL with credentials, see <a class="reference external" href="installation.html#emails">Emails</a>.</p>
 | 
				
			||||||
 | 
					<div class="versionchanged">
 | 
				
			||||||
 | 
					<p><span class="versionmodified changed">Changed in version 0.6.5.</span></p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<dl class="field-list simple">
 | 
				
			||||||
 | 
					<dt class="field-odd">Default</dt>
 | 
				
			||||||
 | 
					<dd class="field-odd"><p>empty string</p>
 | 
				
			||||||
 | 
					</dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					<div class="admonition danger">
 | 
				
			||||||
 | 
					<p class="admonition-title">Danger</p>
 | 
				
			||||||
 | 
					<p>If the email URL is empty, email sending will be disabled.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
<div class="admonition warning">
 | 
					<div class="admonition warning">
 | 
				
			||||||
<p class="admonition-title">Warning</p>
 | 
					<p class="admonition-title">Warning</p>
 | 
				
			||||||
<p>If the email URL is invalid, the application may not start.</p>
 | 
					<p>If the email URL is invalid, the application may not start.</p>
 | 
				
			||||||
@@ -468,8 +480,8 @@ see <a class="reference external" href="https://docs.sqlalchemy.org/en/13/core/p
 | 
				
			|||||||
<div class="line">- Sending emails with Office365 may not work if SMTP auth is disabled.</div>
 | 
					<div class="line">- Sending emails with Office365 may not work if SMTP auth is disabled.</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="versionadded">
 | 
					<div class="versionchanged">
 | 
				
			||||||
<p><span class="versionmodified added">New in version 0.5.3.</span></p>
 | 
					<p><span class="versionmodified changed">Changed in version 0.5.3.</span></p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="line-block">
 | 
					<div class="line-block">
 | 
				
			||||||
<div class="line">Credentials can be omitted: <code class="docutils literal notranslate"><span class="pre">smtp://smtp.example.com:25</span></code>.</div>
 | 
					<div class="line">Credentials can be omitted: <code class="docutils literal notranslate"><span class="pre">smtp://smtp.example.com:25</span></code>.</div>
 | 
				
			||||||
@@ -488,6 +500,13 @@ see <a class="reference external" href="https://docs.sqlalchemy.org/en/13/core/p
 | 
				
			|||||||
<li><p>email change (to old and new email adresses)</p></li>
 | 
					<li><p>email change (to old and new email adresses)</p></li>
 | 
				
			||||||
<li><p>password change</p></li>
 | 
					<li><p>password change</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
 | 
					<div class="versionchanged">
 | 
				
			||||||
 | 
					<p><span class="versionmodified changed">Changed in version 0.6.5.</span></p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="line-block">
 | 
				
			||||||
 | 
					<div class="line">For single-user instance, it is possible to disable email sending with an empty <code class="docutils literal notranslate"><span class="pre">EMAIL_URL</span></code> (in this case, no need to start dramatiq workers).</div>
 | 
				
			||||||
 | 
					<div class="line">A <a class="reference external" href="cli.html#ftcli-users-update">CLI</a> is available to activate account and modify email and password.</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="map-tile-server">
 | 
					<section id="map-tile-server">
 | 
				
			||||||
<h3>Map tile server<a class="headerlink" href="#map-tile-server" title="Permalink to this headline">¶</a></h3>
 | 
					<h3>Map tile server<a class="headerlink" href="#map-tile-server" title="Permalink to this headline">¶</a></h3>
 | 
				
			||||||
@@ -552,7 +571,7 @@ $ <span class="nb">source</span> .env
 | 
				
			|||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Initialize database schema</p></li>
 | 
					<li><p>Initialize database schema</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ fittrackee_upgrade_db
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ ftcli db upgrade
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
@@ -562,7 +581,7 @@ $ <span class="nb">source</span> .env
 | 
				
			|||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Start task queue workers</p></li>
 | 
					<li><p>Start task queue workers if email sending is enabled.</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ fittrackee_worker --processes <span class="m">2</span>
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ fittrackee_worker --processes <span class="m">2</span>
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
@@ -577,7 +596,7 @@ $ <span class="nb">source</span> .env
 | 
				
			|||||||
<li><p>Open <a class="reference external" href="http://localhost:3000">http://localhost:3000</a> and register</p></li>
 | 
					<li><p>Open <a class="reference external" href="http://localhost:3000">http://localhost:3000</a> and register</p></li>
 | 
				
			||||||
<li><p>To set admin rights to the newly created account, use the following command line:</p></li>
 | 
					<li><p>To set admin rights to the newly created account, use the following command line:</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ fittrackee_set_admin <username>
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ ftcli users update <username> --set-admin <span class="nb">true</span>
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="admonition note">
 | 
					<div class="admonition note">
 | 
				
			||||||
@@ -638,7 +657,7 @@ $ make install-db
 | 
				
			|||||||
<li><p>Open <a class="reference external" href="http://localhost:3000">http://localhost:3000</a> and register</p></li>
 | 
					<li><p>Open <a class="reference external" href="http://localhost:3000">http://localhost:3000</a> and register</p></li>
 | 
				
			||||||
<li><p>To set admin rights to the newly created account, use the following command line:</p></li>
 | 
					<li><p>To set admin rights to the newly created account, use the following command line:</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ make set-admin <span class="nv">USERNAME</span><span class="o">=</span><username>
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ make user-set-admin <span class="nv">USERNAME</span><span class="o">=</span><username>
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="admonition note">
 | 
					<div class="admonition note">
 | 
				
			||||||
@@ -655,11 +674,11 @@ $ make install-db
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Download the last release (for now, it is the release v0.6.4):</p></li>
 | 
					<li><p>Download the last release (for now, it is the release v0.6.5):</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://github.com/SamR1/FitTrackee/archive/v0.6.4.tar.gz
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://github.com/SamR1/FitTrackee/archive/v0.6.5.tar.gz
 | 
				
			||||||
$ tar -xzf v0.6.4.tar.gz
 | 
					$ tar -xzf v0.6.5.tar.gz
 | 
				
			||||||
$ mv FitTrackee-0.6.4 FitTrackee
 | 
					$ mv FitTrackee-0.6.5 FitTrackee
 | 
				
			||||||
$ <span class="nb">cd</span> FitTrackee
 | 
					$ <span class="nb">cd</span> FitTrackee
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
@@ -684,11 +703,15 @@ database credentials</strong>):</p></li>
 | 
				
			|||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ make run
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ make run
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="admonition note">
 | 
				
			||||||
 | 
					<p class="admonition-title">Note</p>
 | 
				
			||||||
 | 
					<p>If email sending is disabled: <code class="docutils literal notranslate"><span class="pre">$</span> <span class="pre">make</span> <span class="pre">run-server</span></code></p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Open <a class="reference external" href="http://localhost:5000">http://localhost:5000</a> and register</p></li>
 | 
					<li><p>Open <a class="reference external" href="http://localhost:5000">http://localhost:5000</a> and register</p></li>
 | 
				
			||||||
<li><p>To set admin rights to the newly created account, use the following command line:</p></li>
 | 
					<li><p>To set admin rights to the newly created account, use the following command line:</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ make set-admin <span class="nv">USERNAME</span><span class="o">=</span><username>
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ make user-set-admin <span class="nv">USERNAME</span><span class="o">=</span><username>
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="admonition note">
 | 
					<div class="admonition note">
 | 
				
			||||||
@@ -727,11 +750,11 @@ $ <span class="nb">source</span> .env
 | 
				
			|||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Upgrade database if needed (see changelog for migrations):</p></li>
 | 
					<li><p>Upgrade database if needed (see changelog for migrations):</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ fittrackee_upgrade_db
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ ftcli db upgrade
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Restart the application and task queue workers.</p></li>
 | 
					<li><p>Restart the application and task queue workers (if email sending is enabled).</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
<section id="id3">
 | 
					<section id="id3">
 | 
				
			||||||
@@ -775,11 +798,11 @@ $ <span class="nb">source</span> .env
 | 
				
			|||||||
<ul class="simple">
 | 
					<ul class="simple">
 | 
				
			||||||
<li><p>Stop the application</p></li>
 | 
					<li><p>Stop the application</p></li>
 | 
				
			||||||
<li><p>Change to the directory where FitTrackee directory is located</p></li>
 | 
					<li><p>Change to the directory where FitTrackee directory is located</p></li>
 | 
				
			||||||
<li><p>Download the last release (for now, it is the release v0.6.4) and overwrite existing files:</p></li>
 | 
					<li><p>Download the last release (for now, it is the release v0.6.5) and overwrite existing files:</p></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://github.com/SamR1/FitTrackee/archive/v0.6.4.tar.gz
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://github.com/SamR1/FitTrackee/archive/v0.6.5.tar.gz
 | 
				
			||||||
$ tar -xzf v0.6.4.tar.gz
 | 
					$ tar -xzf v0.6.5.tar.gz
 | 
				
			||||||
$ cp -R FitTrackee-0.6.4/* FitTrackee/
 | 
					$ cp -R FitTrackee-0.6.5/* FitTrackee/
 | 
				
			||||||
$ <span class="nb">cd</span> FitTrackee
 | 
					$ <span class="nb">cd</span> FitTrackee
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
@@ -802,6 +825,10 @@ $ <span class="nb">cd</span> FitTrackee
 | 
				
			|||||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ make run
 | 
					<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ make run
 | 
				
			||||||
</pre></div>
 | 
					</pre></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="admonition note">
 | 
				
			||||||
 | 
					<p class="admonition-title">Note</p>
 | 
				
			||||||
 | 
					<p>If email sending is disabled: <code class="docutils literal notranslate"><span class="pre">$</span> <span class="pre">make</span> <span class="pre">run-server</span></code></p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								docs/objects.inv
									
									
									
									
									
								
							
							
						
						@@ -4,7 +4,7 @@
 | 
				
			|||||||
  <head>
 | 
					  <head>
 | 
				
			||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
				
			||||||
    <title>Search — FitTrackee 0.6.4
 | 
					    <title>Search — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -44,7 +44,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="index.html">
 | 
					        <a class="navbar-brand" href="index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -65,6 +65,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul>
 | 
					      aria-labelledby="dLabelGlobalToc"><ul>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Administrator — FitTrackee 0.6.4
 | 
					    <title>Administrator — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Troubleshooting — FitTrackee 0.6.4
 | 
					    <title>Troubleshooting — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Troubleshooting</a></li>
 | 
					<li class="toctree-l1 current"><a class="current reference internal" href="#">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <meta charset="utf-8" />
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>User — FitTrackee 0.6.4
 | 
					    <title>User — FitTrackee 0.6.5
 | 
				
			||||||
 documentation</title>
 | 
					 documentation</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
					    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
				
			||||||
@@ -40,7 +40,7 @@
 | 
				
			|||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <a class="navbar-brand" href="../index.html">
 | 
					        <a class="navbar-brand" href="../index.html">
 | 
				
			||||||
          FitTrackee</a>
 | 
					          FitTrackee</a>
 | 
				
			||||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.4
 | 
					        <span class="navbar-text navbar-version pull-left"><b>0.6.5
 | 
				
			||||||
</b></span>
 | 
					</b></span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +61,7 @@
 | 
				
			|||||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
					      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
				
			||||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Troubleshooting</a></li>
 | 
					<li class="toctree-l1 current"><a class="reference internal" href="index.html">Troubleshooting</a></li>
 | 
				
			||||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
					<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
| 
		 Before Width: | Height: | Size: 539 KiB After Width: | Height: | Size: 539 KiB  | 
| 
		 Before Width: | Height: | Size: 368 KiB After Width: | Height: | Size: 369 KiB  | 
| 
		 Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 202 KiB  | 
| 
		 Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB  | 
| 
		 Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB  | 
| 
		 Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB  | 
							
								
								
									
										67
									
								
								docsrc/source/cli.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					Command line interface
 | 
				
			||||||
 | 
					######################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A command line interface (CLI) is available to manage database and users.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. code-block:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $ ftcli
 | 
				
			||||||
 | 
					    Usage: ftcli [OPTIONS] COMMAND [ARGS]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      FitTrackee Command Line Interface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Options:
 | 
				
			||||||
 | 
					      --help  Show this message and exit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Commands:
 | 
				
			||||||
 | 
					      db     Manage database.
 | 
				
			||||||
 | 
					      users  Manage users.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. warning::
 | 
				
			||||||
 | 
					    | The following commands are now deprecated and will be removed in a next version:
 | 
				
			||||||
 | 
					    | - ``fittrackee_set_admin``
 | 
				
			||||||
 | 
					    | - ``fittrackee_upgrade_db``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Database
 | 
				
			||||||
 | 
					~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``ftcli db upgrade``
 | 
				
			||||||
 | 
					""""""""""""""""""""
 | 
				
			||||||
 | 
					.. versionadded:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Apply migrations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``ftcli db drop``
 | 
				
			||||||
 | 
					"""""""""""""""""
 | 
				
			||||||
 | 
					.. versionadded:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Empty database and delete uploaded files, only on development environments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Users
 | 
				
			||||||
 | 
					~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``ftcli users update``
 | 
				
			||||||
 | 
					""""""""""""""""""""""
 | 
				
			||||||
 | 
					.. versionadded:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Modify a user account (admin rights, active status, email and password).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. cssclass:: table-bordered
 | 
				
			||||||
 | 
					.. list-table::
 | 
				
			||||||
 | 
					   :widths: 25 50
 | 
				
			||||||
 | 
					   :header-rows: 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   * - Options
 | 
				
			||||||
 | 
					     - Description
 | 
				
			||||||
 | 
					   * - ``--set-admin BOOLEAN``
 | 
				
			||||||
 | 
					     - Add/remove admin rights (when adding admin rights, it also activates user account if not active).
 | 
				
			||||||
 | 
					   * - ``--activate``
 | 
				
			||||||
 | 
					     - Activate user account.
 | 
				
			||||||
 | 
					   * - ``--reset-password``
 | 
				
			||||||
 | 
					     - Reset user password (a new password will be displayed).
 | 
				
			||||||
 | 
					   * - ``--update-email EMAIL``
 | 
				
			||||||
 | 
					     - Update user email.
 | 
				
			||||||
@@ -60,10 +60,11 @@ Workouts
 | 
				
			|||||||
Account & preferences
 | 
					Account & preferences
 | 
				
			||||||
^^^^^^^^^^^^^^^^^^^^^
 | 
					^^^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
- A user can create, update and deleted his account.
 | 
					- A user can create, update and deleted his account.
 | 
				
			||||||
- After registration, the user account is inactive and an email with confirmation instructions is sent to activate it. A user with an inactive account cannot log in. (*new in 0.6.0*)
 | 
					- After registration, the user account is inactive and an email with confirmation instructions is sent to activate it.
 | 
				
			||||||
 | 
					  A user with an inactive account cannot log in. (*new in 0.6.0*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
  The command line to add admin rights activates the account if it is inactive.
 | 
					  In case email sending is not configured, a `command line <cli.html#ftcli-users-update>`__ allows to activate users account.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- A user can set language, timezone and first day of week.
 | 
					- 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 reset his password (*new in 0.3.0*)
 | 
				
			||||||
@@ -97,6 +98,9 @@ Administration
 | 
				
			|||||||
  .. warning::
 | 
					  .. warning::
 | 
				
			||||||
      Updating server configuration may be necessary to handle large files (like `nginx <https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>`_ for instance).
 | 
					      Updating server configuration may be necessary to handle large files (like `nginx <https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>`_ for instance).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .. note::
 | 
				
			||||||
 | 
					      If email sending is disabled, a warning is displayed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Users**
 | 
					- **Users**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,7 +109,7 @@ Administration
 | 
				
			|||||||
      - add/remove administration rights
 | 
					      - add/remove administration rights
 | 
				
			||||||
      - activate his account (*new in 0.6.0*)
 | 
					      - activate his account (*new in 0.6.0*)
 | 
				
			||||||
      - update his email (in case his account is locked) (*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*)
 | 
					      - reset his password (in case his account is locked) (*new in 0.6.0*). If email sending is disabled, it is only possible via CLI.
 | 
				
			||||||
  - delete a user
 | 
					  - delete a user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Sports**
 | 
					- **Sports**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@ Table of contents
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   features
 | 
					   features
 | 
				
			||||||
   installation
 | 
					   installation
 | 
				
			||||||
 | 
					   cli
 | 
				
			||||||
   api/index
 | 
					   api/index
 | 
				
			||||||
   troubleshooting/index
 | 
					   troubleshooting/index
 | 
				
			||||||
   changelog
 | 
					   changelog
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,9 +22,8 @@ Prerequisites
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
-  Python 3.7+
 | 
					-  Python 3.7+
 | 
				
			||||||
-  PostgreSQL database (10+)
 | 
					-  PostgreSQL database (10+)
 | 
				
			||||||
-  SMTP provider
 | 
					-  SMTP provider and Redis for task queue (if email sending is enabled)
 | 
				
			||||||
-  Redis for task queue (to send emails)
 | 
					-  API key from `Dark Sky <https://darksky.net/dev>`__ (not mandatory)
 | 
				
			||||||
-  API key from `Dark Sky <https://darksky.net/dev>`__ [not mandatory]
 | 
					 | 
				
			||||||
-  `Poetry <https://poetry.eustace.io>`__ (for installation from sources only)
 | 
					-  `Poetry <https://poetry.eustace.io>`__ (for installation from sources only)
 | 
				
			||||||
-  `Yarn <https://yarnpkg.com>`__ (for development only)
 | 
					-  `Yarn <https://yarnpkg.com>`__ (for development only)
 | 
				
			||||||
-  Docker and Docker Compose (for development or evaluation purposes)
 | 
					-  Docker and Docker Compose (for development or evaluation purposes)
 | 
				
			||||||
@@ -133,6 +132,13 @@ deployment method.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Email URL with credentials, see `Emails <installation.html#emails>`__.
 | 
					    Email URL with credentials, see `Emails <installation.html#emails>`__.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. versionchanged:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    :default: empty string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. danger::
 | 
				
			||||||
 | 
					        If the email URL is empty, email sending will be disabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .. warning::
 | 
					    .. warning::
 | 
				
			||||||
        If the email URL is invalid, the application may not start.
 | 
					        If the email URL is invalid, the application may not start.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -214,7 +220,7 @@ To send emails, a valid ``EMAIL_URL`` must be provided:
 | 
				
			|||||||
    | - If the email URL is invalid, the application may not start.
 | 
					    | - If the email URL is invalid, the application may not start.
 | 
				
			||||||
    | - Sending emails with Office365 may not work if SMTP auth is disabled.
 | 
					    | - Sending emails with Office365 may not work if SMTP auth is disabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. versionadded:: 0.5.3
 | 
					.. versionchanged:: 0.5.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Credentials can be omitted: ``smtp://smtp.example.com:25``.
 | 
					| Credentials can be omitted: ``smtp://smtp.example.com:25``.
 | 
				
			||||||
| If ``:<port>`` is omitted, the port defaults to 25.
 | 
					| If ``:<port>`` is omitted, the port defaults to 25.
 | 
				
			||||||
@@ -229,6 +235,11 @@ Emails sent by FitTrackee are:
 | 
				
			|||||||
- email change (to old and new email adresses)
 | 
					- email change (to old and new email adresses)
 | 
				
			||||||
- password change
 | 
					- password change
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 0.6.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| For single-user instance, it is possible to disable email sending with an empty ``EMAIL_URL`` (in this case, no need to start dramatiq workers).
 | 
				
			||||||
 | 
					| A `CLI <cli.html#ftcli-users-update>`__ is available to activate account and modify email and password.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Map tile server
 | 
					Map tile server
 | 
				
			||||||
^^^^^^^^^^^^^^^
 | 
					^^^^^^^^^^^^^^^
 | 
				
			||||||
@@ -288,7 +299,7 @@ For instance, copy and update ``.env`` file from ``.env.example`` and source the
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.. code-block:: bash
 | 
					.. code-block:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $ fittrackee_upgrade_db
 | 
					    $ ftcli db upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Start the application
 | 
					- Start the application
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -296,7 +307,7 @@ For instance, copy and update ``.env`` file from ``.env.example`` and source the
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $ fittrackee
 | 
					    $ fittrackee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Start task queue workers
 | 
					- Start task queue workers if email sending is enabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: bash
 | 
					.. code-block:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -311,7 +322,7 @@ For instance, copy and update ``.env`` file from ``.env.example`` and source the
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ fittrackee_set_admin <username>
 | 
					   $ ftcli users update <username> --set-admin true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
    If the user account is inactive, it activates it.
 | 
					    If the user account is inactive, it activates it.
 | 
				
			||||||
@@ -373,7 +384,7 @@ Dev environment
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ make set-admin USERNAME=<username>
 | 
					   $ make user-set-admin USERNAME=<username>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
    If the user account is inactive, it activates it.
 | 
					    If the user account is inactive, it activates it.
 | 
				
			||||||
@@ -384,13 +395,13 @@ Production environment
 | 
				
			|||||||
.. warning::
 | 
					.. warning::
 | 
				
			||||||
    | Note that FitTrackee is under heavy development, some features may be unstable.
 | 
					    | Note that FitTrackee is under heavy development, some features may be unstable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-  Download the last release (for now, it is the release v0.6.4):
 | 
					-  Download the last release (for now, it is the release v0.6.5):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.4.tar.gz
 | 
					   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.5.tar.gz
 | 
				
			||||||
   $ tar -xzf v0.6.4.tar.gz
 | 
					   $ tar -xzf v0.6.5.tar.gz
 | 
				
			||||||
   $ mv FitTrackee-0.6.4 FitTrackee
 | 
					   $ mv FitTrackee-0.6.5 FitTrackee
 | 
				
			||||||
   $ cd FitTrackee
 | 
					   $ cd FitTrackee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-  Create **.env** from example and update it
 | 
					-  Create **.env** from example and update it
 | 
				
			||||||
@@ -415,13 +426,16 @@ Production environment
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   $ make run
 | 
					   $ make run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. note::
 | 
				
			||||||
 | 
					    If email sending is disabled: ``$ make run-server``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Open http://localhost:5000 and register
 | 
					- Open http://localhost:5000 and register
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- To set admin rights to the newly created account, use the following command line:
 | 
					- To set admin rights to the newly created account, use the following command line:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ make set-admin USERNAME=<username>
 | 
					   $ make user-set-admin USERNAME=<username>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
    If the user account is inactive, it activates it.
 | 
					    If the user account is inactive, it activates it.
 | 
				
			||||||
@@ -457,9 +471,9 @@ From PyPI
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.. code-block:: bash
 | 
					.. code-block:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $ fittrackee_upgrade_db
 | 
					    $ ftcli db upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Restart the application and task queue workers.
 | 
					- Restart the application and task queue workers (if email sending is enabled).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
From sources
 | 
					From sources
 | 
				
			||||||
@@ -507,13 +521,13 @@ Prod environment
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
- Change to the directory where FitTrackee directory is located
 | 
					- Change to the directory where FitTrackee directory is located
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Download the last release (for now, it is the release v0.6.4) and overwrite existing files:
 | 
					- Download the last release (for now, it is the release v0.6.5) and overwrite existing files:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code:: bash
 | 
					.. code:: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.4.tar.gz
 | 
					   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.5.tar.gz
 | 
				
			||||||
   $ tar -xzf v0.6.4.tar.gz
 | 
					   $ tar -xzf v0.6.5.tar.gz
 | 
				
			||||||
   $ cp -R FitTrackee-0.6.4/* FitTrackee/
 | 
					   $ cp -R FitTrackee-0.6.5/* FitTrackee/
 | 
				
			||||||
   $ cd FitTrackee
 | 
					   $ cd FitTrackee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Update **.env** if needed (see `Environment variables <installation.html#environment-variables>`__).
 | 
					- Update **.env** if needed (see `Environment variables <installation.html#environment-variables>`__).
 | 
				
			||||||
@@ -536,6 +550,8 @@ Prod environment
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   $ make run
 | 
					   $ make run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. note::
 | 
				
			||||||
 | 
					    If email sending is disabled: ``$ make run-server``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Deployment
 | 
					Deployment
 | 
				
			||||||
~~~~~~~~~~
 | 
					~~~~~~~~~~
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,6 @@
 | 
				
			|||||||
import logging
 | 
					import logging
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
import shutil
 | 
					 | 
				
			||||||
from importlib import import_module, reload
 | 
					from importlib import import_module, reload
 | 
				
			||||||
from typing import Any
 | 
					from typing import Any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -21,7 +20,7 @@ from sqlalchemy.exc import ProgrammingError
 | 
				
			|||||||
from fittrackee.emails.email import EmailService
 | 
					from fittrackee.emails.email import EmailService
 | 
				
			||||||
from fittrackee.request import CustomRequest
 | 
					from fittrackee.request import CustomRequest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VERSION = __version__ = '0.6.4'
 | 
					VERSION = __version__ = '0.6.5'
 | 
				
			||||||
db = SQLAlchemy()
 | 
					db = SQLAlchemy()
 | 
				
			||||||
bcrypt = Bcrypt()
 | 
					bcrypt = Bcrypt()
 | 
				
			||||||
migrate = Migrate()
 | 
					migrate = Migrate()
 | 
				
			||||||
@@ -42,7 +41,7 @@ class CustomFlask(Flask):
 | 
				
			|||||||
    request_class = CustomRequest
 | 
					    request_class = CustomRequest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def create_app() -> Flask:
 | 
					def create_app(init_email: bool = True) -> Flask:
 | 
				
			||||||
    # instantiate the app
 | 
					    # instantiate the app
 | 
				
			||||||
    app = CustomFlask(
 | 
					    app = CustomFlask(
 | 
				
			||||||
        __name__, static_folder='dist/static', template_folder='dist'
 | 
					        __name__, static_folder='dist/static', template_folder='dist'
 | 
				
			||||||
@@ -65,8 +64,15 @@ def create_app() -> Flask:
 | 
				
			|||||||
    migrate.init_app(app, db)
 | 
					    migrate.init_app(app, db)
 | 
				
			||||||
    dramatiq.init_app(app)
 | 
					    dramatiq.init_app(app)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # set up email
 | 
					    # set up email if 'EMAIL_URL' is initialized
 | 
				
			||||||
 | 
					    if init_email:
 | 
				
			||||||
 | 
					        if app.config['EMAIL_URL']:
 | 
				
			||||||
            email_service.init_email(app)
 | 
					            email_service.init_email(app)
 | 
				
			||||||
 | 
					            app.config['CAN_SEND_EMAILS'] = True
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            appLog.warning(
 | 
				
			||||||
 | 
					                'EMAIL_URL is not provided, email sending is deactivated.'
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # get configuration from database
 | 
					    # get configuration from database
 | 
				
			||||||
    from .application.utils import (
 | 
					    from .application.utils import (
 | 
				
			||||||
@@ -147,17 +153,4 @@ def create_app() -> Flask:
 | 
				
			|||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return render_template('index.html')
 | 
					            return render_template('index.html')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @app.cli.command('drop-db')
 | 
					 | 
				
			||||||
    def drop_db() -> None:
 | 
					 | 
				
			||||||
        """Empty database and delete uploaded files for dev environments."""
 | 
					 | 
				
			||||||
        if app_settings == 'fittrackee.config.ProductionConfig':
 | 
					 | 
				
			||||||
            print('This is a production server, aborting!')
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
        db.engine.execute("DROP TABLE IF EXISTS alembic_version;")
 | 
					 | 
				
			||||||
        db.drop_all()
 | 
					 | 
				
			||||||
        db.session.commit()
 | 
					 | 
				
			||||||
        print('Database dropped.')
 | 
					 | 
				
			||||||
        shutil.rmtree(app.config['UPLOAD_FOLDER'], ignore_errors=True)
 | 
					 | 
				
			||||||
        print('Uploaded files deleted.')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return app
 | 
					    return app
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,16 +3,23 @@
 | 
				
			|||||||
import os
 | 
					import os
 | 
				
			||||||
from typing import Dict, Optional
 | 
					from typing import Dict, Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import click
 | 
				
			||||||
import gunicorn.app.base
 | 
					import gunicorn.app.base
 | 
				
			||||||
from flask import Flask
 | 
					from flask import Flask
 | 
				
			||||||
from flask_migrate import upgrade
 | 
					from flask_migrate import upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from fittrackee import create_app
 | 
					from fittrackee import create_app
 | 
				
			||||||
 | 
					from fittrackee.users.exceptions import UserNotFoundException
 | 
				
			||||||
 | 
					from fittrackee.users.utils.admin import UserManagerService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HOST = os.getenv('HOST', '0.0.0.0')
 | 
					HOST = os.getenv('HOST', '0.0.0.0')
 | 
				
			||||||
PORT = os.getenv('PORT', '5000')
 | 
					PORT = os.getenv('PORT', '5000')
 | 
				
			||||||
WORKERS = os.getenv('APP_WORKERS', 1)
 | 
					WORKERS = os.getenv('APP_WORKERS', 1)
 | 
				
			||||||
BASEDIR = os.path.abspath(os.path.dirname(__file__))
 | 
					BASEDIR = os.path.abspath(os.path.dirname(__file__))
 | 
				
			||||||
 | 
					WARNING_MESSAGE = (
 | 
				
			||||||
 | 
					    "\nThis command is deprecated, it will be removed in a next version.\n"
 | 
				
			||||||
 | 
					    "Please use ftcli instead.\n"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
app = create_app()
 | 
					app = create_app()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,7 +44,39 @@ class StandaloneApplication(gunicorn.app.base.BaseApplication):
 | 
				
			|||||||
        return self.application
 | 
					        return self.application
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# DEPRECATED COMMANDS
 | 
				
			||||||
 | 
					@click.group()
 | 
				
			||||||
 | 
					def users_cli() -> None:
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@users_cli.command('set_admin')
 | 
				
			||||||
 | 
					@click.argument('username')
 | 
				
			||||||
 | 
					def set_admin(username: str) -> None:
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    [deprecated] Set admin rights for given user.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    It will be removed in a next version.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    print(WARNING_MESSAGE)
 | 
				
			||||||
 | 
					    with app.app_context():
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            user_manager_service = UserManagerService(username)
 | 
				
			||||||
 | 
					            user_manager_service.update(
 | 
				
			||||||
 | 
					                is_admin=True,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            print(f"User '{username}' updated.")
 | 
				
			||||||
 | 
					        except UserNotFoundException:
 | 
				
			||||||
 | 
					            print(f"User '{username}' not found.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def upgrade_db() -> None:
 | 
					def upgrade_db() -> None:
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    [deprecated] Apply migrations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    It will be removed in a next version.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    print(WARNING_MESSAGE)
 | 
				
			||||||
    with app.app_context():
 | 
					    with app.app_context():
 | 
				
			||||||
        upgrade(directory=BASEDIR + '/migrations')
 | 
					        upgrade(directory=BASEDIR + '/migrations')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,12 +42,13 @@ def get_application_config() -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
        "data": {
 | 
					        "data": {
 | 
				
			||||||
          "admin_contact": "admin@example.com",
 | 
					          "admin_contact": "admin@example.com",
 | 
				
			||||||
          "gpx_limit_import": 10,
 | 
					          "gpx_limit_import": 10,
 | 
				
			||||||
 | 
					          "is_email_sending_enabled": true,
 | 
				
			||||||
          "is_registration_enabled": false,
 | 
					          "is_registration_enabled": false,
 | 
				
			||||||
          "max_single_file_size": 1048576,
 | 
					          "max_single_file_size": 1048576,
 | 
				
			||||||
          "max_users": 0,
 | 
					          "max_users": 0,
 | 
				
			||||||
          "max_zip_file_size": 10485760,
 | 
					          "max_zip_file_size": 10485760,
 | 
				
			||||||
          "map_attribution": "© <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"
 | 
					          "map_attribution": "© <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"
 | 
				
			||||||
          "version": "0.6.4"
 | 
					          "version": "0.6.5"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "status": "success"
 | 
					        "status": "success"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -91,12 +92,13 @@ def update_application_config(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
        "data": {
 | 
					        "data": {
 | 
				
			||||||
          "admin_contact": "admin@example.com",
 | 
					          "admin_contact": "admin@example.com",
 | 
				
			||||||
          "gpx_limit_import": 10,
 | 
					          "gpx_limit_import": 10,
 | 
				
			||||||
 | 
					          "is_email_sending_enabled": true,
 | 
				
			||||||
          "is_registration_enabled": false,
 | 
					          "is_registration_enabled": false,
 | 
				
			||||||
          "max_single_file_size": 1048576,
 | 
					          "max_single_file_size": 1048576,
 | 
				
			||||||
          "max_users": 10,
 | 
					          "max_users": 10,
 | 
				
			||||||
          "max_zip_file_size": 10485760,
 | 
					          "max_zip_file_size": 10485760,
 | 
				
			||||||
          "map_attribution": "© <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"
 | 
					          "map_attribution": "© <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"
 | 
				
			||||||
          "version": "0.6.4"
 | 
					          "version": "0.6.5"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "status": "success"
 | 
					        "status": "success"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,6 +46,7 @@ class AppConfig(BaseModel):
 | 
				
			|||||||
        return {
 | 
					        return {
 | 
				
			||||||
            'admin_contact': self.admin_contact,
 | 
					            'admin_contact': self.admin_contact,
 | 
				
			||||||
            'gpx_limit_import': self.gpx_limit_import,
 | 
					            'gpx_limit_import': self.gpx_limit_import,
 | 
				
			||||||
 | 
					            'is_email_sending_enabled': current_app.config['CAN_SEND_EMAILS'],
 | 
				
			||||||
            'is_registration_enabled': self.is_registration_enabled,
 | 
					            'is_registration_enabled': self.is_registration_enabled,
 | 
				
			||||||
            'max_single_file_size': self.max_single_file_size,
 | 
					            'max_single_file_size': self.max_single_file_size,
 | 
				
			||||||
            'max_zip_file_size': self.max_zip_file_size,
 | 
					            'max_zip_file_size': self.max_zip_file_size,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								fittrackee/cli/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					import click
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from fittrackee.migrations.commands import db_cli
 | 
				
			||||||
 | 
					from fittrackee.users.commands import users_cli
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@click.group()
 | 
				
			||||||
 | 
					def cli() -> None:
 | 
				
			||||||
 | 
					    """FitTrackee Command Line Interface"""
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cli.add_command(db_cli)
 | 
				
			||||||
 | 
					cli.add_command(users_cli)
 | 
				
			||||||
							
								
								
									
										3
									
								
								fittrackee/cli/app.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					from fittrackee import create_app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app = create_app(init_email=False)
 | 
				
			||||||
@@ -29,6 +29,7 @@ class BaseConfig:
 | 
				
			|||||||
    UI_URL = os.environ.get('UI_URL')
 | 
					    UI_URL = os.environ.get('UI_URL')
 | 
				
			||||||
    EMAIL_URL = os.environ.get('EMAIL_URL')
 | 
					    EMAIL_URL = os.environ.get('EMAIL_URL')
 | 
				
			||||||
    SENDER_EMAIL = os.environ.get('SENDER_EMAIL')
 | 
					    SENDER_EMAIL = os.environ.get('SENDER_EMAIL')
 | 
				
			||||||
 | 
					    CAN_SEND_EMAILS = False
 | 
				
			||||||
    DRAMATIQ_BROKER = broker
 | 
					    DRAMATIQ_BROKER = broker
 | 
				
			||||||
    TILE_SERVER = {
 | 
					    TILE_SERVER = {
 | 
				
			||||||
        'URL': os.environ.get(
 | 
					        'URL': os.environ.get(
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								fittrackee/dist/index.html
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1 +1 @@
 | 
				
			|||||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/static/css/fork-awesome.min.css"/><link rel="stylesheet" href="/static/css/leaflet.css"/><title>FitTrackee</title><script defer="defer" src="/static/js/chunk-vendors.6b8389c5.js"></script><script defer="defer" src="/static/js/app.756f8c8c.js"></script><link href="/static/css/app.3729aa92.css" rel="stylesheet"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#4DBA87"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="fittrackee_client"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#4DBA87"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but FitTrackee doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
 | 
					<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/static/css/fork-awesome.min.css"/><link rel="stylesheet" href="/static/css/leaflet.css"/><title>FitTrackee</title><script defer="defer" src="/static/js/chunk-vendors.6b8389c5.js"></script><script defer="defer" src="/static/js/app.2222dbc7.js"></script><link href="/static/css/app.e8b7692c.css" rel="stylesheet"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#4DBA87"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="fittrackee_client"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#4DBA87"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but FitTrackee doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
 | 
				
			||||||
							
								
								
									
										2
									
								
								fittrackee/dist/service-worker.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										2
									
								
								fittrackee/dist/service-worker.js.map
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										1
									
								
								fittrackee/dist/static/css/app.3729aa92.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										1
									
								
								fittrackee/dist/static/css/app.e8b7692c.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/app.2222dbc7.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								fittrackee/dist/static/js/app.2222dbc7.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/app.756f8c8c.js
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,2 +1,2 @@
 | 
				
			|||||||
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[845],{4264:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(5793),a=r(2715),s=r(3577),u=r(2119),o=r(7167),c=r(8602),i=r(9917);const l={key:0,id:"account-confirmation",class:"center-card with-margin"},E={class:"error-message"};var d=(0,n.aZ)({setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),d=(0,i.o)(),S=(0,n.Fl)((()=>d.getters[c.SY.GETTERS.ERROR_MESSAGES])),_=(0,n.Fl)((()=>t.query.token));function m(){_.value?d.dispatch(c.YN.ACTIONS.CONFIRM_ACCOUNT,{token:_.value}):r.push("/")}return(0,n.wF)((()=>m())),(0,n.Ah)((()=>d.commit(c.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(e,t)=>{const r=(0,n.up)("router-link");return(0,a.SU)(S)?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n.Wm)(r,{class:"links",to:"/account-confirmation/resend"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("buttons.ACCOUNT-CONFIRMATION-RESEND"))+"? ",1)])),_:1})])])):(0,n.kq)("",!0)}}}),S=r(3744);const _=(0,S.Z)(d,[["__scopeId","data-v-785df978"]]);var m=_},8160:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(5793),a=r(2715),s=r(3577),u=r(2119),o=r(7167),c=r(8602),i=r(9917);const l={key:0,id:"email-update",class:"center-card with-margin"},E={class:"error-message"};var d=(0,n.aZ)({setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),d=(0,i.o)(),S=(0,n.Fl)((()=>d.getters[c.YN.GETTERS.AUTH_USER_PROFILE])),_=(0,n.Fl)((()=>d.getters[c.YN.GETTERS.IS_AUTHENTICATED])),m=(0,n.Fl)((()=>d.getters[c.SY.GETTERS.ERROR_MESSAGES])),R=(0,n.Fl)((()=>t.query.token));function T(){R.value?d.dispatch(c.YN.ACTIONS.CONFIRM_EMAIL,{token:R.value,refreshUser:_.value}):r.push("/")}return(0,n.wF)((()=>T())),(0,n.Ah)((()=>d.commit(c.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(0,n.YP)((()=>m.value),(e=>{S.value.username&&e&&r.push("/")})),(e,t)=>{const r=(0,n.up)("router-link"),u=(0,n.up)("i18n-t");return(0,a.SU)(m)&&!(0,a.SU)(S).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n._)("span",null,[(0,n.Wm)(u,{keypath:"user.PROFILE.ERRORED_EMAIL_UPDATE"},{default:(0,n.w5)((()=>[(0,n.Wm)(r,{to:"/login"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("user.LOG_IN")),1)])),_:1})])),_:1})])])])):(0,n.kq)("",!0)}}}),S=r(3744);const _=(0,S.Z)(d,[["__scopeId","data-v-8c2ec9ce"]]);var m=_},6266:function(e,t,r){r.r(t),r.d(t,{default:function(){return S}});var n=r(5793),a=r(2715),s=r(8602),u=r(9917);const o=e=>((0,n.dD)("data-v-05463732"),e=e(),(0,n.Cn)(),e),c={key:0,id:"profile",class:"container view"},i=o((()=>(0,n._)("div",{id:"bottom"},null,-1)));var l=(0,n.aZ)({setup(e){const t=(0,u.o)(),r=(0,n.Fl)((()=>t.getters[s.YN.GETTERS.AUTH_USER_PROFILE]));return(e,t)=>{const s=(0,n.up)("router-view");return(0,a.SU)(r).username?((0,n.wg)(),(0,n.iD)("div",c,[(0,n.Wm)(s,{user:(0,a.SU)(r)},null,8,["user"]),i])):(0,n.kq)("",!0)}}}),E=r(3744);const d=(0,E.Z)(l,[["__scopeId","data-v-05463732"]]);var S=d},9453:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(5793),a=r(2715),s=r(2119),u=r(2179),o=r(4317),c=r(8602),i=r(9917);const l={key:0,id:"user",class:"view"},E={class:"box"};var d=(0,n.aZ)({props:{fromAdmin:{type:Boolean}},setup(e){const t=e,{fromAdmin:r}=(0,a.BK)(t),d=(0,s.yj)(),S=(0,i.o)(),_=(0,n.Fl)((()=>S.getters[c.RT.GETTERS.USER]));return(0,n.wF)((()=>{d.params.username&&"string"===typeof d.params.username&&S.dispatch(c.RT.ACTIONS.GET_USER,d.params.username)})),(0,n.Jd)((()=>{S.dispatch(c.RT.ACTIONS.EMPTY_USER)})),(e,t)=>(0,a.SU)(_).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(u.Z,{user:(0,a.SU)(_)},null,8,["user"]),(0,n._)("div",E,[(0,n.Wm)(o.Z,{user:(0,a.SU)(_),"from-admin":(0,a.SU)(r)},null,8,["user","from-admin"])])])):(0,n.kq)("",!0)}}),S=r(3744);const _=(0,S.Z)(d,[["__scopeId","data-v-af7007f4"]]);var m=_}}]);
 | 
					"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[845],{4264:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(5793),a=r(2715),s=r(3577),u=r(2119),o=r(7167),c=r(8602),i=r(9917);const l={key:0,id:"account-confirmation",class:"center-card with-margin"},E={class:"error-message"};var d=(0,n.aZ)({setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),d=(0,i.o)(),S=(0,n.Fl)((()=>d.getters[c.SY.GETTERS.ERROR_MESSAGES])),_=(0,n.Fl)((()=>t.query.token));function m(){_.value?d.dispatch(c.YN.ACTIONS.CONFIRM_ACCOUNT,{token:_.value}):r.push("/")}return(0,n.wF)((()=>m())),(0,n.Ah)((()=>d.commit(c.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(e,t)=>{const r=(0,n.up)("router-link");return(0,a.SU)(S)?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n.Wm)(r,{class:"links",to:"/account-confirmation/resend"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("buttons.ACCOUNT-CONFIRMATION-RESEND"))+"? ",1)])),_:1})])])):(0,n.kq)("",!0)}}}),S=r(3744);const _=(0,S.Z)(d,[["__scopeId","data-v-785df978"]]);var m=_},8160:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(5793),a=r(2715),s=r(3577),u=r(2119),o=r(7167),c=r(8602),i=r(9917);const l={key:0,id:"email-update",class:"center-card with-margin"},E={class:"error-message"};var d=(0,n.aZ)({setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),d=(0,i.o)(),S=(0,n.Fl)((()=>d.getters[c.YN.GETTERS.AUTH_USER_PROFILE])),_=(0,n.Fl)((()=>d.getters[c.YN.GETTERS.IS_AUTHENTICATED])),m=(0,n.Fl)((()=>d.getters[c.SY.GETTERS.ERROR_MESSAGES])),R=(0,n.Fl)((()=>t.query.token));function T(){R.value?d.dispatch(c.YN.ACTIONS.CONFIRM_EMAIL,{token:R.value,refreshUser:_.value}):r.push("/")}return(0,n.wF)((()=>T())),(0,n.Ah)((()=>d.commit(c.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(0,n.YP)((()=>m.value),(e=>{S.value.username&&e&&r.push("/")})),(e,t)=>{const r=(0,n.up)("router-link"),u=(0,n.up)("i18n-t");return(0,a.SU)(m)&&!(0,a.SU)(S).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n._)("span",null,[(0,n.Wm)(u,{keypath:"user.PROFILE.ERRORED_EMAIL_UPDATE"},{default:(0,n.w5)((()=>[(0,n.Wm)(r,{to:"/login"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("user.LOG_IN")),1)])),_:1})])),_:1})])])])):(0,n.kq)("",!0)}}}),S=r(3744);const _=(0,S.Z)(d,[["__scopeId","data-v-8c2ec9ce"]]);var m=_},6266:function(e,t,r){r.r(t),r.d(t,{default:function(){return S}});var n=r(5793),a=r(2715),s=r(8602),u=r(9917);const o=e=>((0,n.dD)("data-v-05463732"),e=e(),(0,n.Cn)(),e),c={key:0,id:"profile",class:"container view"},i=o((()=>(0,n._)("div",{id:"bottom"},null,-1)));var l=(0,n.aZ)({setup(e){const t=(0,u.o)(),r=(0,n.Fl)((()=>t.getters[s.YN.GETTERS.AUTH_USER_PROFILE]));return(e,t)=>{const s=(0,n.up)("router-view");return(0,a.SU)(r).username?((0,n.wg)(),(0,n.iD)("div",c,[(0,n.Wm)(s,{user:(0,a.SU)(r)},null,8,["user"]),i])):(0,n.kq)("",!0)}}}),E=r(3744);const d=(0,E.Z)(l,[["__scopeId","data-v-05463732"]]);var S=d},9453:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(5793),a=r(2715),s=r(2119),u=r(2179),o=r(4980),c=r(8602),i=r(9917);const l={key:0,id:"user",class:"view"},E={class:"box"};var d=(0,n.aZ)({props:{fromAdmin:{type:Boolean}},setup(e){const t=e,{fromAdmin:r}=(0,a.BK)(t),d=(0,s.yj)(),S=(0,i.o)(),_=(0,n.Fl)((()=>S.getters[c.RT.GETTERS.USER]));return(0,n.wF)((()=>{d.params.username&&"string"===typeof d.params.username&&S.dispatch(c.RT.ACTIONS.GET_USER,d.params.username)})),(0,n.Jd)((()=>{S.dispatch(c.RT.ACTIONS.EMPTY_USER)})),(e,t)=>(0,a.SU)(_).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(u.Z,{user:(0,a.SU)(_)},null,8,["user"]),(0,n._)("div",E,[(0,n.Wm)(o.Z,{user:(0,a.SU)(_),"from-admin":(0,a.SU)(r)},null,8,["user","from-admin"])])])):(0,n.kq)("",!0)}}),S=r(3744);const _=(0,S.Z)(d,[["__scopeId","data-v-af7007f4"]]);var m=_}}]);
 | 
				
			||||||
//# sourceMappingURL=profile.6a52c2c3.js.map
 | 
					//# sourceMappingURL=profile.52d627f4.js.map
 | 
				
			||||||
							
								
								
									
										44
									
								
								fittrackee/migrations/commands.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import click
 | 
				
			||||||
 | 
					from flask_migrate import upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from fittrackee import db
 | 
				
			||||||
 | 
					from fittrackee.cli.app import app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BASEDIR = os.path.abspath(os.path.dirname(__file__))
 | 
				
			||||||
 | 
					app_settings = os.getenv('APP_SETTINGS', 'fittrackee.config.ProductionConfig')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@click.group(name='db')
 | 
				
			||||||
 | 
					def db_cli() -> None:
 | 
				
			||||||
 | 
					    """Manage database."""
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@db_cli.command('upgrade')
 | 
				
			||||||
 | 
					def upgrade_db() -> None:
 | 
				
			||||||
 | 
					    """Apply migrations."""
 | 
				
			||||||
 | 
					    with app.app_context():
 | 
				
			||||||
 | 
					        upgrade(directory=BASEDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@db_cli.command('drop')
 | 
				
			||||||
 | 
					def drop_db() -> None:
 | 
				
			||||||
 | 
					    """Empty database and delete uploaded files for dev environments."""
 | 
				
			||||||
 | 
					    with app.app_context():
 | 
				
			||||||
 | 
					        if app_settings == 'fittrackee.config.ProductionConfig':
 | 
				
			||||||
 | 
					            click.echo(
 | 
				
			||||||
 | 
					                click.style(
 | 
				
			||||||
 | 
					                    'This is a production server, aborting!', bold=True
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                err=True,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        db.engine.execute("DROP TABLE IF EXISTS alembic_version;")
 | 
				
			||||||
 | 
					        db.drop_all()
 | 
				
			||||||
 | 
					        db.session.commit()
 | 
				
			||||||
 | 
					        click.echo('Database dropped.')
 | 
				
			||||||
 | 
					        shutil.rmtree(app.config['UPLOAD_FOLDER'], ignore_errors=True)
 | 
				
			||||||
 | 
					        click.echo('Uploaded files deleted.')
 | 
				
			||||||
@@ -24,6 +24,7 @@ class TestConfigModel:
 | 
				
			|||||||
            serialized_app_config['gpx_limit_import']
 | 
					            serialized_app_config['gpx_limit_import']
 | 
				
			||||||
            == app_config.gpx_limit_import
 | 
					            == app_config.gpx_limit_import
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					        assert serialized_app_config['is_email_sending_enabled'] is True
 | 
				
			||||||
        assert serialized_app_config['is_registration_enabled'] is True
 | 
					        assert serialized_app_config['is_registration_enabled'] is True
 | 
				
			||||||
        assert (
 | 
					        assert (
 | 
				
			||||||
            serialized_app_config['max_single_file_size']
 | 
					            serialized_app_config['max_single_file_size']
 | 
				
			||||||
@@ -49,3 +50,11 @@ class TestConfigModel:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        assert app_config.is_registration_enabled is False
 | 
					        assert app_config.is_registration_enabled is False
 | 
				
			||||||
        assert serialized_app_config['is_registration_enabled'] is False
 | 
					        assert serialized_app_config['is_registration_enabled'] is False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_returns_email_sending_disabled_when_no_email_url_provided(
 | 
				
			||||||
 | 
					        self, app_wo_email_activation: Flask, user_1: User, user_2: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        app_config = AppConfig.query.first()
 | 
				
			||||||
 | 
					        serialized_app_config = app_config.serialize()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert serialized_app_config['is_email_sending_enabled'] is False
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								fittrackee/tests/fixtures/fixtures_app.py
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -146,6 +146,12 @@ def app_wo_email_auth(monkeypatch: pytest.MonkeyPatch) -> Generator:
 | 
				
			|||||||
    yield from get_app(with_config=True)
 | 
					    yield from get_app(with_config=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.fixture
 | 
				
			||||||
 | 
					def app_wo_email_activation(monkeypatch: pytest.MonkeyPatch) -> Generator:
 | 
				
			||||||
 | 
					    monkeypatch.setenv('EMAIL_URL', '')
 | 
				
			||||||
 | 
					    yield from get_app(with_config=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@pytest.fixture
 | 
					@pytest.fixture
 | 
				
			||||||
def app_wo_domain() -> Generator:
 | 
					def app_wo_domain() -> Generator:
 | 
				
			||||||
    yield from get_app(with_config=True)
 | 
					    yield from get_app(with_config=True)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -294,6 +294,31 @@ class TestUserRegistration(ApiTestCaseMixin):
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_does_not_call_account_confirmation_email_when_email_sending_is_disabled(  # noqa
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        app_wo_email_activation: Flask,
 | 
				
			||||||
 | 
					        account_confirmation_email_mock: Mock,
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client = app_wo_email_activation.test_client()
 | 
				
			||||||
 | 
					        email = self.random_email()
 | 
				
			||||||
 | 
					        username = self.random_string()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = client.post(
 | 
				
			||||||
 | 
					            '/api/auth/register',
 | 
				
			||||||
 | 
					            data=json.dumps(
 | 
				
			||||||
 | 
					                dict(
 | 
				
			||||||
 | 
					                    username=username,
 | 
				
			||||||
 | 
					                    email=email,
 | 
				
			||||||
 | 
					                    password='12345678',
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					            environ_base={'HTTP_USER_AGENT': USER_AGENT},
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert response.status_code == 200
 | 
				
			||||||
 | 
					        account_confirmation_email_mock.send.assert_not_called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @pytest.mark.parametrize(
 | 
					    @pytest.mark.parametrize(
 | 
				
			||||||
        'text_transformation',
 | 
					        'text_transformation',
 | 
				
			||||||
        ['upper', 'lower'],
 | 
					        ['upper', 'lower'],
 | 
				
			||||||
@@ -773,6 +798,36 @@ class TestUserAccountUpdate(ApiTestCaseMixin):
 | 
				
			|||||||
        assert new_email == user_1.email_to_confirm
 | 
					        assert new_email == user_1.email_to_confirm
 | 
				
			||||||
        assert user_1.confirmation_token is not None
 | 
					        assert user_1.confirmation_token is not None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_updates_email_when_email_sending_is_disabled(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        app_wo_email_activation: Flask,
 | 
				
			||||||
 | 
					        user_1: User,
 | 
				
			||||||
 | 
					        email_updated_to_current_address_mock: MagicMock,
 | 
				
			||||||
 | 
					        email_updated_to_new_address_mock: MagicMock,
 | 
				
			||||||
 | 
					        password_change_email_mock: MagicMock,
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client, auth_token = self.get_test_client_and_auth_token(
 | 
				
			||||||
 | 
					            app_wo_email_activation, user_1.email
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        new_email = 'new.email@example.com'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = client.patch(
 | 
				
			||||||
 | 
					            '/api/auth/profile/edit/account',
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					            data=json.dumps(
 | 
				
			||||||
 | 
					                dict(
 | 
				
			||||||
 | 
					                    email=new_email,
 | 
				
			||||||
 | 
					                    password='12345678',
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            headers=dict(Authorization=f'Bearer {auth_token}'),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert response.status_code == 200
 | 
				
			||||||
 | 
					        assert user_1.email == new_email
 | 
				
			||||||
 | 
					        assert user_1.email_to_confirm is None
 | 
				
			||||||
 | 
					        assert user_1.confirmation_token is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_calls_email_updated_to_current_email_send_when_new_email_provided(  # noqa
 | 
					    def test_it_calls_email_updated_to_current_email_send_when_new_email_provided(  # noqa
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
        app: Flask,
 | 
					        app: Flask,
 | 
				
			||||||
@@ -1107,6 +1162,37 @@ class TestUserAccountUpdate(ApiTestCaseMixin):
 | 
				
			|||||||
        email_updated_to_new_address_mock.send.assert_called_once()
 | 
					        email_updated_to_new_address_mock.send.assert_called_once()
 | 
				
			||||||
        password_change_email_mock.send.assert_called_once()
 | 
					        password_change_email_mock.send.assert_called_once()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_does_not_calls_all_email_send_when_email_sending_is_disabled(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        app_wo_email_activation: Flask,
 | 
				
			||||||
 | 
					        user_1: User,
 | 
				
			||||||
 | 
					        email_updated_to_current_address_mock: MagicMock,
 | 
				
			||||||
 | 
					        email_updated_to_new_address_mock: MagicMock,
 | 
				
			||||||
 | 
					        password_change_email_mock: MagicMock,
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client, auth_token = self.get_test_client_and_auth_token(
 | 
				
			||||||
 | 
					            app_wo_email_activation, user_1.email
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        client.patch(
 | 
				
			||||||
 | 
					            '/api/auth/profile/edit/account',
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					            data=json.dumps(
 | 
				
			||||||
 | 
					                dict(
 | 
				
			||||||
 | 
					                    email='new.email@example.com',
 | 
				
			||||||
 | 
					                    password='12345678',
 | 
				
			||||||
 | 
					                    new_password=self.random_string(),
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            headers=dict(Authorization=f'Bearer {auth_token}'),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assert_no_emails_sent(
 | 
				
			||||||
 | 
					            email_updated_to_current_address_mock,
 | 
				
			||||||
 | 
					            email_updated_to_new_address_mock,
 | 
				
			||||||
 | 
					            password_change_email_mock,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestUserPreferencesUpdate(ApiTestCaseMixin):
 | 
					class TestUserPreferencesUpdate(ApiTestCaseMixin):
 | 
				
			||||||
    def test_it_returns_error_if_payload_is_empty(
 | 
					    def test_it_returns_error_if_payload_is_empty(
 | 
				
			||||||
@@ -1648,6 +1734,21 @@ class TestPasswordResetRequest(ApiTestCaseMixin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        self.assert_400(response)
 | 
					        self.assert_400(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_returns_error_when_email_sending_is_disabled(
 | 
				
			||||||
 | 
					        self, app_wo_email_activation: Flask
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client = app_wo_email_activation.test_client()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = client.post(
 | 
				
			||||||
 | 
					            '/api/auth/password/reset-request',
 | 
				
			||||||
 | 
					            data=json.dumps(dict(email='test@test.com')),
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assert_404_with_message(
 | 
				
			||||||
 | 
					            response, 'the requested URL was not found on the server'
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_requests_password_reset_when_user_exists(
 | 
					    def test_it_requests_password_reset_when_user_exists(
 | 
				
			||||||
        self, app: Flask, user_1: User, user_reset_password_email: Mock
 | 
					        self, app: Flask, user_1: User, user_reset_password_email: Mock
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
@@ -1873,7 +1974,7 @@ class TestPasswordUpdate(ApiTestCaseMixin):
 | 
				
			|||||||
        assert data['status'] == 'success'
 | 
					        assert data['status'] == 'success'
 | 
				
			||||||
        assert data['message'] == 'password updated'
 | 
					        assert data['message'] == 'password updated'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_send_email_after_successful_update(
 | 
					    def test_it_sends_email_after_successful_update(
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
        app: Flask,
 | 
					        app: Flask,
 | 
				
			||||||
        user_1: User,
 | 
					        user_1: User,
 | 
				
			||||||
@@ -1908,6 +2009,29 @@ class TestPasswordUpdate(ApiTestCaseMixin):
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_does_not_send_email_when_email_sending_is_disabled(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        app_wo_email_activation: Flask,
 | 
				
			||||||
 | 
					        user_1: User,
 | 
				
			||||||
 | 
					        password_change_email_mock: MagicMock,
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        token = get_user_token(user_1.id, password_reset=True)
 | 
				
			||||||
 | 
					        client = app_wo_email_activation.test_client()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        client.post(
 | 
				
			||||||
 | 
					            '/api/auth/password/update',
 | 
				
			||||||
 | 
					            data=json.dumps(
 | 
				
			||||||
 | 
					                dict(
 | 
				
			||||||
 | 
					                    token=token,
 | 
				
			||||||
 | 
					                    password=self.random_string(),
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					            environ_base={'HTTP_USER_AGENT': USER_AGENT},
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        password_change_email_mock.send.assert_not_called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestEmailUpdateWitUnauthenticatedUser(ApiTestCaseMixin):
 | 
					class TestEmailUpdateWitUnauthenticatedUser(ApiTestCaseMixin):
 | 
				
			||||||
    def test_it_returns_error_if_token_is_missing(self, app: Flask) -> None:
 | 
					    def test_it_returns_error_if_token_is_missing(self, app: Flask) -> None:
 | 
				
			||||||
@@ -2138,3 +2262,18 @@ class TestResendAccountConfirmationEmail(ApiTestCaseMixin):
 | 
				
			|||||||
                ),
 | 
					                ),
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_returns_error_if_email_sending_is_disabled(
 | 
				
			||||||
 | 
					        self, app_wo_email_activation: Flask, inactive_user: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client = app_wo_email_activation.test_client()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = client.post(
 | 
				
			||||||
 | 
					            '/api/auth/account/resend-confirmation',
 | 
				
			||||||
 | 
					            data=json.dumps(dict(email=inactive_user.email)),
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assert_404_with_message(
 | 
				
			||||||
 | 
					            response, 'the requested URL was not found on the server'
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1077,6 +1077,27 @@ class TestUpdateUser(ApiTestCaseMixin):
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_does_not_call_password_change_email_when_email_sending_is_disabled(  # noqa
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        app_wo_email_activation: Flask,
 | 
				
			||||||
 | 
					        user_1_admin: User,
 | 
				
			||||||
 | 
					        user_2: User,
 | 
				
			||||||
 | 
					        user_password_change_email_mock: MagicMock,
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client, auth_token = self.get_test_client_and_auth_token(
 | 
				
			||||||
 | 
					            app_wo_email_activation, user_1_admin.email
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = client.patch(
 | 
				
			||||||
 | 
					            f'/api/users/{user_2.username}',
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					            data=json.dumps(dict(reset_password=True)),
 | 
				
			||||||
 | 
					            headers=dict(Authorization=f'Bearer {auth_token}'),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert response.status_code == 200
 | 
				
			||||||
 | 
					        user_password_change_email_mock.send.assert_not_called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_calls_reset_password_email_when_password_reset_is_successful(
 | 
					    def test_it_calls_reset_password_email_when_password_reset_is_successful(
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
        app: Flask,
 | 
					        app: Flask,
 | 
				
			||||||
@@ -1118,6 +1139,27 @@ class TestUpdateUser(ApiTestCaseMixin):
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_does_not_call_reset_password_email_when_email_sending_is_disabled(  # noqa
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        app_wo_email_activation: Flask,
 | 
				
			||||||
 | 
					        user_1_admin: User,
 | 
				
			||||||
 | 
					        user_2: User,
 | 
				
			||||||
 | 
					        user_reset_password_email: MagicMock,
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client, auth_token = self.get_test_client_and_auth_token(
 | 
				
			||||||
 | 
					            app_wo_email_activation, user_1_admin.email
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = client.patch(
 | 
				
			||||||
 | 
					            f'/api/users/{user_2.username}',
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					            data=json.dumps(dict(reset_password=True)),
 | 
				
			||||||
 | 
					            headers=dict(Authorization=f'Bearer {auth_token}'),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert response.status_code == 200
 | 
				
			||||||
 | 
					        user_reset_password_email.send.assert_not_called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_returns_error_when_updating_email_with_invalid_address(
 | 
					    def test_it_returns_error_when_updating_email_with_invalid_address(
 | 
				
			||||||
        self, app: Flask, user_1_admin: User, user_2: User
 | 
					        self, app: Flask, user_1_admin: User, user_2: User
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
@@ -1172,27 +1214,48 @@ class TestUpdateUser(ApiTestCaseMixin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        user_email_updated_to_new_address_mock.send.assert_not_called()
 | 
					        user_email_updated_to_new_address_mock.send.assert_not_called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_updates_user_email(
 | 
					    def test_it_updates_user_email_to_confirm_when_email_sending_is_enabled(
 | 
				
			||||||
        self, app: Flask, user_1_admin: User, user_2: User
 | 
					        self, app: Flask, user_1_admin: User, user_2: User
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
        client, auth_token = self.get_test_client_and_auth_token(
 | 
					        client, auth_token = self.get_test_client_and_auth_token(
 | 
				
			||||||
            app, user_1_admin.email
 | 
					            app, user_1_admin.email
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					        new_email = 'new.' + user_2.email
 | 
				
			||||||
        user_2_email = user_2.email
 | 
					        user_2_email = user_2.email
 | 
				
			||||||
        user_2_confirmation_token = user_2.confirmation_token
 | 
					        user_2_confirmation_token = user_2.confirmation_token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        response = client.patch(
 | 
					        response = client.patch(
 | 
				
			||||||
            f'/api/users/{user_2.username}',
 | 
					            f'/api/users/{user_2.username}',
 | 
				
			||||||
            content_type='application/json',
 | 
					            content_type='application/json',
 | 
				
			||||||
            data=json.dumps(dict(new_email='new.' + user_2.email)),
 | 
					            data=json.dumps(dict(new_email=new_email)),
 | 
				
			||||||
            headers=dict(Authorization=f'Bearer {auth_token}'),
 | 
					            headers=dict(Authorization=f'Bearer {auth_token}'),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert response.status_code == 200
 | 
					        assert response.status_code == 200
 | 
				
			||||||
        assert user_2.email == user_2_email
 | 
					        assert user_2.email == user_2_email
 | 
				
			||||||
        assert user_2.email_to_confirm == 'new.' + user_2.email
 | 
					        assert user_2.email_to_confirm == new_email
 | 
				
			||||||
        assert user_2.confirmation_token != user_2_confirmation_token
 | 
					        assert user_2.confirmation_token != user_2_confirmation_token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_updates_user_email_when_email_sending_is_disabled(
 | 
				
			||||||
 | 
					        self, app_wo_email_activation: Flask, user_1_admin: User, user_2: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client, auth_token = self.get_test_client_and_auth_token(
 | 
				
			||||||
 | 
					            app_wo_email_activation, user_1_admin.email
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        new_email = 'new.' + user_2.email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = client.patch(
 | 
				
			||||||
 | 
					            f'/api/users/{user_2.username}',
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					            data=json.dumps(dict(new_email=new_email)),
 | 
				
			||||||
 | 
					            headers=dict(Authorization=f'Bearer {auth_token}'),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert response.status_code == 200
 | 
				
			||||||
 | 
					        assert user_2.email == new_email
 | 
				
			||||||
 | 
					        assert user_2.email_to_confirm is None
 | 
				
			||||||
 | 
					        assert user_2.confirmation_token is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_calls_email_updated_to_new_address_when_password_reset_is_successful(  # noqa
 | 
					    def test_it_calls_email_updated_to_new_address_when_password_reset_is_successful(  # noqa
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
        app: Flask,
 | 
					        app: Flask,
 | 
				
			||||||
@@ -1229,6 +1292,28 @@ class TestUpdateUser(ApiTestCaseMixin):
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_does_not_call_email_updated_to_new_address_when_email_sending_is_disabled(  # noqa
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        app_wo_email_activation: Flask,
 | 
				
			||||||
 | 
					        user_1_admin: User,
 | 
				
			||||||
 | 
					        user_2: User,
 | 
				
			||||||
 | 
					        user_email_updated_to_new_address_mock: MagicMock,
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        client, auth_token = self.get_test_client_and_auth_token(
 | 
				
			||||||
 | 
					            app_wo_email_activation, user_1_admin.email
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        new_email = 'new.' + user_2.email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = client.patch(
 | 
				
			||||||
 | 
					            f'/api/users/{user_2.username}',
 | 
				
			||||||
 | 
					            content_type='application/json',
 | 
				
			||||||
 | 
					            data=json.dumps(dict(new_email=new_email)),
 | 
				
			||||||
 | 
					            headers=dict(Authorization=f'Bearer {auth_token}'),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert response.status_code == 200
 | 
				
			||||||
 | 
					        user_email_updated_to_new_address_mock.send.assert_not_called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_activates_user_account(
 | 
					    def test_it_activates_user_account(
 | 
				
			||||||
        self, app: Flask, user_1_admin: User, inactive_user: User
 | 
					        self, app: Flask, user_1_admin: User, inactive_user: User
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,10 +3,14 @@ from unittest.mock import patch
 | 
				
			|||||||
import pytest
 | 
					import pytest
 | 
				
			||||||
from flask import Flask
 | 
					from flask import Flask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from fittrackee import bcrypt
 | 
				
			||||||
from fittrackee.tests.utils import random_string
 | 
					from fittrackee.tests.utils import random_string
 | 
				
			||||||
from fittrackee.users.exceptions import UserNotFoundException
 | 
					from fittrackee.users.exceptions import (
 | 
				
			||||||
 | 
					    InvalidEmailException,
 | 
				
			||||||
 | 
					    UserNotFoundException,
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
from fittrackee.users.models import User
 | 
					from fittrackee.users.models import User
 | 
				
			||||||
from fittrackee.users.utils.admin import set_admin_rights
 | 
					from fittrackee.users.utils.admin import UserManagerService
 | 
				
			||||||
from fittrackee.users.utils.controls import (
 | 
					from fittrackee.users.utils.controls import (
 | 
				
			||||||
    check_password,
 | 
					    check_password,
 | 
				
			||||||
    check_username,
 | 
					    check_username,
 | 
				
			||||||
@@ -14,37 +18,166 @@ from fittrackee.users.utils.controls import (
 | 
				
			|||||||
    register_controls,
 | 
					    register_controls,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from ..utils import random_email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestSetAdminRights:
 | 
					
 | 
				
			||||||
 | 
					class TestUserManagerService:
 | 
				
			||||||
    def test_it_raises_exception_if_user_does_not_exist(
 | 
					    def test_it_raises_exception_if_user_does_not_exist(
 | 
				
			||||||
        self, app: Flask
 | 
					        self, app: Flask
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=random_string())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with pytest.raises(UserNotFoundException):
 | 
					        with pytest.raises(UserNotFoundException):
 | 
				
			||||||
            set_admin_rights(random_string())
 | 
					            user_manager_service.update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_does_not_update_user_when_no_args_provided(
 | 
				
			||||||
 | 
					        self, app: Flask, user_1: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        _, user_updated, _ = user_manager_service.update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert user_updated is False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_returns_user(self, app: Flask, user_1: User) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user, _, _ = user_manager_service.update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert user == user_1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_sets_admin_right_for_a_given_user(
 | 
					    def test_it_sets_admin_right_for_a_given_user(
 | 
				
			||||||
        self, app: Flask, user_1: User
 | 
					        self, app: Flask, user_1: User
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
        set_admin_rights(user_1.username)
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(is_admin=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert user_1.admin is True
 | 
					        assert user_1.admin is True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_return_updated_user_flag_to_true(
 | 
				
			||||||
 | 
					        self, app: Flask, user_1: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        _, user_updated, _ = user_manager_service.update(is_admin=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert user_updated is True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_does_not_raise_exception_when_user_has_already_admin_right(
 | 
					    def test_it_does_not_raise_exception_when_user_has_already_admin_right(
 | 
				
			||||||
        self, app: Flask, user_1_admin: User
 | 
					        self, app: Flask, user_1_admin: User
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
        set_admin_rights(user_1_admin.username)
 | 
					        user_manager_service = UserManagerService(
 | 
				
			||||||
 | 
					            username=user_1_admin.username
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(is_admin=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert user_1_admin.admin is True
 | 
					        assert user_1_admin.admin is True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_it_activates_account_if_user_is_inactive(
 | 
					    def test_it_activates_account_if_user_is_inactive(
 | 
				
			||||||
        self, app: Flask, inactive_user: User
 | 
					        self, app: Flask, inactive_user: User
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
        set_admin_rights(inactive_user.username)
 | 
					        user_manager_service = UserManagerService(
 | 
				
			||||||
 | 
					            username=inactive_user.username
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(is_admin=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert inactive_user.admin is True
 | 
					        assert inactive_user.admin is True
 | 
				
			||||||
        assert inactive_user.is_active is True
 | 
					        assert inactive_user.is_active is True
 | 
				
			||||||
        assert inactive_user.confirmation_token is None
 | 
					        assert inactive_user.confirmation_token is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_activates_given_user_account(
 | 
				
			||||||
 | 
					        self, app: Flask, inactive_user: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(
 | 
				
			||||||
 | 
					            username=inactive_user.username
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(activate=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert inactive_user.is_active is True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_empties_confirmation_token(
 | 
				
			||||||
 | 
					        self, app: Flask, inactive_user: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(
 | 
				
			||||||
 | 
					            username=inactive_user.username
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(activate=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert inactive_user.confirmation_token is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_does_not_raise_error_if_user_account_already_activated(
 | 
				
			||||||
 | 
					        self, app: Flask, user_1: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(activate=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert user_1.is_active is True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_resets_user_password(self, app: Flask, user_1: User) -> None:
 | 
				
			||||||
 | 
					        previous_password = user_1.password
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(reset_password=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert user_1.password != previous_password
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_new_password_is_encrypted(self, app: Flask, user_1: User) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        _, _, new_password = user_manager_service.update(reset_password=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert bcrypt.check_password_hash(user_1.password, new_password)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_raises_exception_if_provided_email_is_invalid(
 | 
				
			||||||
 | 
					        self, app: Flask, user_1: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					        with pytest.raises(
 | 
				
			||||||
 | 
					            InvalidEmailException, match='valid email must be provided'
 | 
				
			||||||
 | 
					        ):
 | 
				
			||||||
 | 
					            user_manager_service.update(new_email=random_string())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_raises_exception_if_provided_email_is_current_user_email(
 | 
				
			||||||
 | 
					        self, app: Flask, user_1: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					        with pytest.raises(
 | 
				
			||||||
 | 
					            InvalidEmailException,
 | 
				
			||||||
 | 
					            match='new email must be different than curent email',
 | 
				
			||||||
 | 
					        ):
 | 
				
			||||||
 | 
					            user_manager_service.update(new_email=user_1.email)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_updates_user_email_to_confirm(
 | 
				
			||||||
 | 
					        self, app: Flask, user_1: User
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        new_email = random_email()
 | 
				
			||||||
 | 
					        current_email = user_1.email
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(new_email=new_email)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert user_1.email == current_email
 | 
				
			||||||
 | 
					        assert user_1.email_to_confirm == new_email
 | 
				
			||||||
 | 
					        assert user_1.confirmation_token is not None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_it_updates_user_email(self, app: Flask, user_1: User) -> None:
 | 
				
			||||||
 | 
					        new_email = random_email()
 | 
				
			||||||
 | 
					        user_manager_service = UserManagerService(username=user_1.username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user_manager_service.update(
 | 
				
			||||||
 | 
					            new_email=new_email, with_confirmation=False
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert user_1.email == new_email
 | 
				
			||||||
 | 
					        assert user_1.email_to_confirm is None
 | 
				
			||||||
 | 
					        assert user_1.confirmation_token is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestIsValidEmail:
 | 
					class TestIsValidEmail:
 | 
				
			||||||
    @pytest.mark.parametrize(
 | 
					    @pytest.mark.parametrize(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,9 +40,11 @@ from .utils.token import decode_user_token
 | 
				
			|||||||
auth_blueprint = Blueprint('auth', __name__)
 | 
					auth_blueprint = Blueprint('auth', __name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HEX_COLOR_REGEX = regex = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"
 | 
					HEX_COLOR_REGEX = regex = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"
 | 
				
			||||||
 | 
					NOT_FOUND_MESSAGE = 'the requested URL was not found on the server'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def send_account_confirmation_email(user: User) -> None:
 | 
					def send_account_confirmation_email(user: User) -> None:
 | 
				
			||||||
 | 
					    if current_app.config['CAN_SEND_EMAILS']:
 | 
				
			||||||
        ui_url = current_app.config['UI_URL']
 | 
					        ui_url = current_app.config['UI_URL']
 | 
				
			||||||
        email_data = {
 | 
					        email_data = {
 | 
				
			||||||
            'username': user.username,
 | 
					            'username': user.username,
 | 
				
			||||||
@@ -505,7 +507,7 @@ def update_user_account(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    update authenticated user email and password
 | 
					    update authenticated user email and password
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    It sends emails:
 | 
					    It sends emails if sending is enabled:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - Password change
 | 
					    - Password change
 | 
				
			||||||
    - Email change:
 | 
					    - Email change:
 | 
				
			||||||
@@ -634,8 +636,12 @@ def update_user_account(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
    try:
 | 
					    try:
 | 
				
			||||||
        if email_to_confirm != auth_user.email:
 | 
					        if email_to_confirm != auth_user.email:
 | 
				
			||||||
            if is_valid_email(email_to_confirm):
 | 
					            if is_valid_email(email_to_confirm):
 | 
				
			||||||
 | 
					                if current_app.config['CAN_SEND_EMAILS']:
 | 
				
			||||||
                    auth_user.email_to_confirm = email_to_confirm
 | 
					                    auth_user.email_to_confirm = email_to_confirm
 | 
				
			||||||
                    auth_user.confirmation_token = secrets.token_urlsafe(30)
 | 
					                    auth_user.confirmation_token = secrets.token_urlsafe(30)
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    auth_user.email = email_to_confirm
 | 
				
			||||||
 | 
					                    auth_user.confirmation_token = None
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                error_messages = 'email: valid email must be provided\n'
 | 
					                error_messages = 'email: valid email must be provided\n'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -652,6 +658,7 @@ def update_user_account(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        db.session.commit()
 | 
					        db.session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if current_app.config['CAN_SEND_EMAILS']:
 | 
				
			||||||
            ui_url = current_app.config['UI_URL']
 | 
					            ui_url = current_app.config['UI_URL']
 | 
				
			||||||
            user_data = {
 | 
					            user_data = {
 | 
				
			||||||
                'language': (
 | 
					                'language': (
 | 
				
			||||||
@@ -688,7 +695,10 @@ def update_user_account(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
                        )
 | 
					                        )
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            user_data = {**user_data, **{'email': auth_user.email_to_confirm}}
 | 
					                user_data = {
 | 
				
			||||||
 | 
					                    **user_data,
 | 
				
			||||||
 | 
					                    **{'email': auth_user.email_to_confirm},
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                email_updated_to_new_address.send(user_data, email_data)
 | 
					                email_updated_to_new_address.send(user_data, email_data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
@@ -1139,6 +1149,8 @@ def request_password_reset() -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    handle password reset request
 | 
					    handle password reset request
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If email sending is disabled, this endpoint is not available
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    **Example request**:
 | 
					    **Example request**:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .. sourcecode:: http
 | 
					    .. sourcecode:: http
 | 
				
			||||||
@@ -1162,8 +1174,12 @@ def request_password_reset() -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    :statuscode 200: password reset request processed
 | 
					    :statuscode 200: password reset request processed
 | 
				
			||||||
    :statuscode 400: invalid payload
 | 
					    :statuscode 400: invalid payload
 | 
				
			||||||
 | 
					    :statuscode 404: the requested URL was not found on the server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					    if not current_app.config['CAN_SEND_EMAILS']:
 | 
				
			||||||
 | 
					        return NotFoundErrorResponse(NOT_FOUND_MESSAGE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    post_data = request.get_json()
 | 
					    post_data = request.get_json()
 | 
				
			||||||
    if not post_data or post_data.get('email') is None:
 | 
					    if not post_data or post_data.get('email') is None:
 | 
				
			||||||
        return InvalidPayloadErrorResponse()
 | 
					        return InvalidPayloadErrorResponse()
 | 
				
			||||||
@@ -1203,6 +1219,8 @@ def update_password() -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    update user password after password reset request
 | 
					    update user password after password reset request
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    It sends emails if sending is enabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    **Example request**:
 | 
					    **Example request**:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .. sourcecode:: http
 | 
					    .. sourcecode:: http
 | 
				
			||||||
@@ -1259,9 +1277,12 @@ def update_password() -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
        ).decode()
 | 
					        ).decode()
 | 
				
			||||||
        db.session.commit()
 | 
					        db.session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if current_app.config['CAN_SEND_EMAILS']:
 | 
				
			||||||
            password_change_email.send(
 | 
					            password_change_email.send(
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                'language': ('en' if user.language is None else user.language),
 | 
					                    'language': (
 | 
				
			||||||
 | 
					                        'en' if user.language is None else user.language
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
                    'email': user.email,
 | 
					                    'email': user.email,
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -1406,6 +1427,8 @@ def resend_account_confirmation_email() -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    resend email with instructions to confirm account
 | 
					    resend email with instructions to confirm account
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If email sending is disabled, this endpoint is not available
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    **Example request**:
 | 
					    **Example request**:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .. sourcecode:: http
 | 
					    .. sourcecode:: http
 | 
				
			||||||
@@ -1429,9 +1452,13 @@ def resend_account_confirmation_email() -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    :statuscode 200: confirmation email resent
 | 
					    :statuscode 200: confirmation email resent
 | 
				
			||||||
    :statuscode 400: invalid payload
 | 
					    :statuscode 400: invalid payload
 | 
				
			||||||
 | 
					    :statuscode 404: the requested URL was not found on the server
 | 
				
			||||||
    :statuscode 500: error, please try again or contact the administrator
 | 
					    :statuscode 500: error, please try again or contact the administrator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					    if not current_app.config['CAN_SEND_EMAILS']:
 | 
				
			||||||
 | 
					        return NotFoundErrorResponse(NOT_FOUND_MESSAGE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    post_data = request.get_json()
 | 
					    post_data = request.get_json()
 | 
				
			||||||
    if not post_data or post_data.get('email') is None:
 | 
					    if not post_data or post_data.get('email') is None:
 | 
				
			||||||
        return InvalidPayloadErrorResponse()
 | 
					        return InvalidPayloadErrorResponse()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										62
									
								
								fittrackee/users/commands.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					from typing import Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import click
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from fittrackee.cli.app import app
 | 
				
			||||||
 | 
					from fittrackee.users.exceptions import UserNotFoundException
 | 
				
			||||||
 | 
					from fittrackee.users.utils.admin import UserManagerService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@click.group(name='users')
 | 
				
			||||||
 | 
					def users_cli() -> None:
 | 
				
			||||||
 | 
					    """Manage users."""
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@users_cli.command('update')
 | 
				
			||||||
 | 
					@click.argument('username')
 | 
				
			||||||
 | 
					@click.option(
 | 
				
			||||||
 | 
					    '--set-admin',
 | 
				
			||||||
 | 
					    type=bool,
 | 
				
			||||||
 | 
					    help='Add/remove admin rights (when adding admin rights, '
 | 
				
			||||||
 | 
					    'it also activates user account if not active).',
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					@click.option('--activate', is_flag=True, help='Activate user account.')
 | 
				
			||||||
 | 
					@click.option(
 | 
				
			||||||
 | 
					    '--reset-password',
 | 
				
			||||||
 | 
					    is_flag=True,
 | 
				
			||||||
 | 
					    help='Reset user password (a new password will be displayed).',
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					@click.option('--update-email', type=str, help='Update user email.')
 | 
				
			||||||
 | 
					def manage_user(
 | 
				
			||||||
 | 
					    username: str,
 | 
				
			||||||
 | 
					    set_admin: Optional[bool],
 | 
				
			||||||
 | 
					    activate: bool,
 | 
				
			||||||
 | 
					    reset_password: bool,
 | 
				
			||||||
 | 
					    update_email: Optional[str],
 | 
				
			||||||
 | 
					) -> None:
 | 
				
			||||||
 | 
					    """Manage given user account."""
 | 
				
			||||||
 | 
					    with app.app_context():
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            user_manager_service = UserManagerService(username)
 | 
				
			||||||
 | 
					            _, is_user_updated, password = user_manager_service.update(
 | 
				
			||||||
 | 
					                is_admin=set_admin,
 | 
				
			||||||
 | 
					                with_confirmation=False,
 | 
				
			||||||
 | 
					                activate=activate,
 | 
				
			||||||
 | 
					                reset_password=reset_password,
 | 
				
			||||||
 | 
					                new_email=update_email,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            if is_user_updated:
 | 
				
			||||||
 | 
					                click.echo(f"User '{username}' updated.")
 | 
				
			||||||
 | 
					                if password:
 | 
				
			||||||
 | 
					                    click.echo(f"The new password is: {password}")
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                click.echo("No updates.")
 | 
				
			||||||
 | 
					        except UserNotFoundException:
 | 
				
			||||||
 | 
					            click.echo(
 | 
				
			||||||
 | 
					                f"User '{username}' not found.\n"
 | 
				
			||||||
 | 
					                "Check the provided user name (case sensitive).",
 | 
				
			||||||
 | 
					                err=True,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            click.echo(f'An error occurred: {e}', err=True)
 | 
				
			||||||
@@ -1,2 +1,6 @@
 | 
				
			|||||||
 | 
					class InvalidEmailException(Exception):
 | 
				
			||||||
 | 
					    ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UserNotFoundException(Exception):
 | 
					class UserNotFoundException(Exception):
 | 
				
			||||||
    ...
 | 
					    ...
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,11 @@
 | 
				
			|||||||
import os
 | 
					import os
 | 
				
			||||||
import secrets
 | 
					 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
from typing import Any, Dict, Tuple, Union
 | 
					from typing import Any, Dict, Tuple, Union
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import click
 | 
					 | 
				
			||||||
from flask import Blueprint, current_app, request, send_file
 | 
					from flask import Blueprint, current_app, request, send_file
 | 
				
			||||||
from sqlalchemy import exc
 | 
					from sqlalchemy import exc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from fittrackee import bcrypt, db
 | 
					from fittrackee import db
 | 
				
			||||||
from fittrackee.emails.tasks import (
 | 
					from fittrackee.emails.tasks import (
 | 
				
			||||||
    email_updated_to_new_address,
 | 
					    email_updated_to_new_address,
 | 
				
			||||||
    password_change_email,
 | 
					    password_change_email,
 | 
				
			||||||
@@ -22,31 +20,19 @@ from fittrackee.responses import (
 | 
				
			|||||||
    UserNotFoundErrorResponse,
 | 
					    UserNotFoundErrorResponse,
 | 
				
			||||||
    handle_error_and_return_response,
 | 
					    handle_error_and_return_response,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from fittrackee.users.utils.controls import is_valid_email
 | 
					 | 
				
			||||||
from fittrackee.utils import get_readable_duration
 | 
					from fittrackee.utils import get_readable_duration
 | 
				
			||||||
from fittrackee.workouts.models import Record, Workout, WorkoutSegment
 | 
					from fittrackee.workouts.models import Record, Workout, WorkoutSegment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .decorators import authenticate, authenticate_as_admin
 | 
					from .decorators import authenticate, authenticate_as_admin
 | 
				
			||||||
from .exceptions import UserNotFoundException
 | 
					from .exceptions import InvalidEmailException, UserNotFoundException
 | 
				
			||||||
from .models import User, UserSportPreference
 | 
					from .models import User, UserSportPreference
 | 
				
			||||||
from .utils.admin import set_admin_rights
 | 
					from .utils.admin import UserManagerService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
users_blueprint = Blueprint('users', __name__)
 | 
					users_blueprint = Blueprint('users', __name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
USER_PER_PAGE = 10
 | 
					USER_PER_PAGE = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@users_blueprint.cli.command('set-admin')
 | 
					 | 
				
			||||||
@click.argument('username')
 | 
					 | 
				
			||||||
def set_admin(username: str) -> None:
 | 
					 | 
				
			||||||
    """Set admin rights for given user"""
 | 
					 | 
				
			||||||
    try:
 | 
					 | 
				
			||||||
        set_admin_rights(username)
 | 
					 | 
				
			||||||
        print(f"User '{username}' updated.")
 | 
					 | 
				
			||||||
    except UserNotFoundException:
 | 
					 | 
				
			||||||
        print(f"User '{username}' not found.")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@users_blueprint.route('/users', methods=['GET'])
 | 
					@users_blueprint.route('/users', methods=['GET'])
 | 
				
			||||||
@authenticate_as_admin
 | 
					@authenticate_as_admin
 | 
				
			||||||
def get_users(auth_user: User) -> Dict:
 | 
					def get_users(auth_user: User) -> Dict:
 | 
				
			||||||
@@ -414,8 +400,9 @@ def update_user(auth_user: User, user_name: str) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
    Update user account
 | 
					    Update user account
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - add/remove admin rights (regardless user account status)
 | 
					    - add/remove admin rights (regardless user account status)
 | 
				
			||||||
    - reset password (and send email to update user password)
 | 
					    - reset password (and send email to update user password,
 | 
				
			||||||
    - update user email (and send email to update user password)
 | 
					      if sending enabled)
 | 
				
			||||||
 | 
					    - update user email (and send email to new user email, if sending enabled)
 | 
				
			||||||
    - activate account for an inactive user
 | 
					    - activate account for an inactive user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Only user with admin rights can modify another user
 | 
					    Only user with admin rights can modify another user
 | 
				
			||||||
@@ -530,46 +517,22 @@ def update_user(auth_user: User, user_name: str) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
    if not user_data:
 | 
					    if not user_data:
 | 
				
			||||||
        return InvalidPayloadErrorResponse()
 | 
					        return InvalidPayloadErrorResponse()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    send_password_emails = False
 | 
					 | 
				
			||||||
    send_new_address_email = False
 | 
					 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        user = User.query.filter_by(username=user_name).first()
 | 
					        reset_password = user_data.get('reset_password', False)
 | 
				
			||||||
        if not user:
 | 
					        new_email = user_data.get('new_email')
 | 
				
			||||||
            return UserNotFoundErrorResponse()
 | 
					        user_manager_service = UserManagerService(username=user_name)
 | 
				
			||||||
 | 
					        user, _, _ = user_manager_service.update(
 | 
				
			||||||
        if 'admin' in user_data:
 | 
					            is_admin=user_data.get('admin'),
 | 
				
			||||||
            user.admin = user_data['admin']
 | 
					            activate=user_data.get('activate', False),
 | 
				
			||||||
 | 
					            reset_password=reset_password,
 | 
				
			||||||
        if user_data.get('activate', False):
 | 
					            new_email=new_email,
 | 
				
			||||||
            user.is_active = True
 | 
					            with_confirmation=current_app.config['CAN_SEND_EMAILS'],
 | 
				
			||||||
            user.confirmation_token = None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if user_data.get('reset_password', False):
 | 
					 | 
				
			||||||
            new_password = secrets.token_urlsafe(30)
 | 
					 | 
				
			||||||
            user.password = bcrypt.generate_password_hash(
 | 
					 | 
				
			||||||
                new_password, current_app.config.get('BCRYPT_LOG_ROUNDS')
 | 
					 | 
				
			||||||
            ).decode()
 | 
					 | 
				
			||||||
            send_password_emails = True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if 'new_email' in user_data:
 | 
					 | 
				
			||||||
            if is_valid_email(user_data['new_email']):
 | 
					 | 
				
			||||||
                if user_data['new_email'] == user.email:
 | 
					 | 
				
			||||||
                    return InvalidPayloadErrorResponse(
 | 
					 | 
				
			||||||
                        'new email must be different than curent email'
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                user.email_to_confirm = user_data['new_email']
 | 
					 | 
				
			||||||
                user.confirmation_token = secrets.token_urlsafe(30)
 | 
					 | 
				
			||||||
                send_new_address_email = True
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                return InvalidPayloadErrorResponse(
 | 
					 | 
				
			||||||
                    'valid email must be provided'
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        db.session.commit()
 | 
					        if current_app.config['CAN_SEND_EMAILS']:
 | 
				
			||||||
 | 
					 | 
				
			||||||
            user_language = 'en' if user.language is None else user.language
 | 
					            user_language = 'en' if user.language is None else user.language
 | 
				
			||||||
            ui_url = current_app.config['UI_URL']
 | 
					            ui_url = current_app.config['UI_URL']
 | 
				
			||||||
        if send_password_emails:
 | 
					            if reset_password:
 | 
				
			||||||
                user_data = {
 | 
					                user_data = {
 | 
				
			||||||
                    'language': user_language,
 | 
					                    'language': user_language,
 | 
				
			||||||
                    'email': user.email,
 | 
					                    'email': user.email,
 | 
				
			||||||
@@ -581,7 +544,9 @@ def update_user(auth_user: User, user_name: str) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
                        'fittrackee_url': ui_url,
 | 
					                        'fittrackee_url': ui_url,
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            password_reset_token = user.encode_password_reset_token(user.id)
 | 
					                password_reset_token = user.encode_password_reset_token(
 | 
				
			||||||
 | 
					                    user.id
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
                reset_password_email.send(
 | 
					                reset_password_email.send(
 | 
				
			||||||
                    user_data,
 | 
					                    user_data,
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
@@ -593,13 +558,14 @@ def update_user(auth_user: User, user_name: str) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        'username': user.username,
 | 
					                        'username': user.username,
 | 
				
			||||||
                        'password_reset_url': (
 | 
					                        'password_reset_url': (
 | 
				
			||||||
                        f'{ui_url}/password-reset?token={password_reset_token}'
 | 
					                            f'{ui_url}/password-reset?'
 | 
				
			||||||
 | 
					                            f'token={password_reset_token}'
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        'fittrackee_url': ui_url,
 | 
					                        'fittrackee_url': ui_url,
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if send_new_address_email:
 | 
					            if new_email:
 | 
				
			||||||
                user_data = {
 | 
					                user_data = {
 | 
				
			||||||
                    'language': user_language,
 | 
					                    'language': user_language,
 | 
				
			||||||
                    'email': user.email_to_confirm,
 | 
					                    'email': user.email_to_confirm,
 | 
				
			||||||
@@ -618,6 +584,10 @@ def update_user(auth_user: User, user_name: str) -> Union[Dict, HttpResponse]:
 | 
				
			|||||||
            'status': 'success',
 | 
					            'status': 'success',
 | 
				
			||||||
            'data': {'users': [user.serialize(auth_user)]},
 | 
					            'data': {'users': [user.serialize(auth_user)]},
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    except UserNotFoundException:
 | 
				
			||||||
 | 
					        return UserNotFoundErrorResponse()
 | 
				
			||||||
 | 
					    except InvalidEmailException as e:
 | 
				
			||||||
 | 
					        return InvalidPayloadErrorResponse(str(e))
 | 
				
			||||||
    except exc.StatementError as e:
 | 
					    except exc.StatementError as e:
 | 
				
			||||||
        return handle_error_and_return_response(e, db=db)
 | 
					        return handle_error_and_return_response(e, db=db)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,86 @@
 | 
				
			|||||||
from fittrackee import db
 | 
					import secrets
 | 
				
			||||||
 | 
					from typing import Optional, Tuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ..exceptions import UserNotFoundException
 | 
					from flask import current_app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from fittrackee import bcrypt, db
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from ..exceptions import InvalidEmailException, UserNotFoundException
 | 
				
			||||||
from ..models import User
 | 
					from ..models import User
 | 
				
			||||||
 | 
					from ..utils.controls import is_valid_email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def set_admin_rights(username: str) -> None:
 | 
					class UserManagerService:
 | 
				
			||||||
    user = User.query.filter_by(username=username).first()
 | 
					    def __init__(self, username: str):
 | 
				
			||||||
 | 
					        self.username = username
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _get_user(self) -> User:
 | 
				
			||||||
 | 
					        user = User.query.filter_by(username=self.username).first()
 | 
				
			||||||
        if not user:
 | 
					        if not user:
 | 
				
			||||||
            raise UserNotFoundException()
 | 
					            raise UserNotFoundException()
 | 
				
			||||||
    user.admin = True
 | 
					        return user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _update_admin_rights(self, user: User, is_admin: bool) -> None:
 | 
				
			||||||
 | 
					        user.admin = is_admin
 | 
				
			||||||
 | 
					        if is_admin:
 | 
				
			||||||
 | 
					            self._activate_user(user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def _activate_user(user: User) -> None:
 | 
				
			||||||
        user.is_active = True
 | 
					        user.is_active = True
 | 
				
			||||||
        user.confirmation_token = None
 | 
					        user.confirmation_token = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def _reset_user_password(user: User) -> str:
 | 
				
			||||||
 | 
					        new_password = secrets.token_urlsafe(30)
 | 
				
			||||||
 | 
					        user.password = bcrypt.generate_password_hash(
 | 
				
			||||||
 | 
					            new_password, current_app.config.get('BCRYPT_LOG_ROUNDS')
 | 
				
			||||||
 | 
					        ).decode()
 | 
				
			||||||
 | 
					        return new_password
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def _update_user_email(
 | 
				
			||||||
 | 
					        user: User, new_email: str, with_confirmation: bool
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        if not is_valid_email(new_email):
 | 
				
			||||||
 | 
					            raise InvalidEmailException('valid email must be provided')
 | 
				
			||||||
 | 
					        if user.email == new_email:
 | 
				
			||||||
 | 
					            raise InvalidEmailException(
 | 
				
			||||||
 | 
					                'new email must be different than curent email'
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        if with_confirmation:
 | 
				
			||||||
 | 
					            user.email_to_confirm = new_email
 | 
				
			||||||
 | 
					            user.confirmation_token = secrets.token_urlsafe(30)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            user.email = new_email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def update(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        is_admin: Optional[bool] = None,
 | 
				
			||||||
 | 
					        activate: bool = False,
 | 
				
			||||||
 | 
					        reset_password: bool = False,
 | 
				
			||||||
 | 
					        new_email: Optional[str] = None,
 | 
				
			||||||
 | 
					        with_confirmation: bool = True,
 | 
				
			||||||
 | 
					    ) -> Tuple[User, bool, Optional[str]]:
 | 
				
			||||||
 | 
					        user_updated = False
 | 
				
			||||||
 | 
					        new_password = None
 | 
				
			||||||
 | 
					        user = self._get_user()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if is_admin is not None:
 | 
				
			||||||
 | 
					            self._update_admin_rights(user, is_admin)
 | 
				
			||||||
 | 
					            user_updated = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if activate:
 | 
				
			||||||
 | 
					            self._activate_user(user)
 | 
				
			||||||
 | 
					            user_updated = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if reset_password:
 | 
				
			||||||
 | 
					            new_password = self._reset_user_password(user)
 | 
				
			||||||
 | 
					            user_updated = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if new_email is not None:
 | 
				
			||||||
 | 
					            self._update_user_email(user, new_email, with_confirmation)
 | 
				
			||||||
 | 
					            user_updated = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        db.session.commit()
 | 
					        db.session.commit()
 | 
				
			||||||
 | 
					        return user, user_updated, new_password
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "fittrackee_client",
 | 
					  "name": "fittrackee_client",
 | 
				
			||||||
  "version": "0.6.4",
 | 
					  "version": "0.6.5",
 | 
				
			||||||
  "private": true,
 | 
					  "private": true,
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "serve": "vue-cli-service serve",
 | 
					    "serve": "vue-cli-service serve",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@
 | 
				
			|||||||
                {{ $t('admin.APPLICATION') }}
 | 
					                {{ $t('admin.APPLICATION') }}
 | 
				
			||||||
              </router-link>
 | 
					              </router-link>
 | 
				
			||||||
            </dt>
 | 
					            </dt>
 | 
				
			||||||
            <dd>
 | 
					            <dd class="application-config-details">
 | 
				
			||||||
              {{ $t('admin.UPDATE_APPLICATION_DESCRIPTION') }}<br />
 | 
					              {{ $t('admin.UPDATE_APPLICATION_DESCRIPTION') }}<br />
 | 
				
			||||||
              <span class="registration-status">
 | 
					              <span class="registration-status">
 | 
				
			||||||
                {{
 | 
					                {{
 | 
				
			||||||
@@ -22,6 +22,13 @@
 | 
				
			|||||||
                  )
 | 
					                  )
 | 
				
			||||||
                }}
 | 
					                }}
 | 
				
			||||||
              </span>
 | 
					              </span>
 | 
				
			||||||
 | 
					              <span
 | 
				
			||||||
 | 
					                class="email-sending-status"
 | 
				
			||||||
 | 
					                v-if="!appConfig.is_email_sending_enabled"
 | 
				
			||||||
 | 
					              >
 | 
				
			||||||
 | 
					                <i class="fa fa-exclamation-triangle" aria-hidden="true" />
 | 
				
			||||||
 | 
					                {{ $t('admin.EMAIL_SENDING_DISABLED') }}
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
            </dd>
 | 
					            </dd>
 | 
				
			||||||
            <dt>
 | 
					            <dt>
 | 
				
			||||||
              <router-link to="/admin/sports">
 | 
					              <router-link to="/admin/sports">
 | 
				
			||||||
@@ -82,10 +89,15 @@
 | 
				
			|||||||
        dd {
 | 
					        dd {
 | 
				
			||||||
          margin-bottom: $default-margin * 3;
 | 
					          margin-bottom: $default-margin * 3;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        .application-config-details {
 | 
				
			||||||
 | 
					          display: flex;
 | 
				
			||||||
 | 
					          flex-direction: column;
 | 
				
			||||||
 | 
					          .email-sending-status,
 | 
				
			||||||
          .registration-status {
 | 
					          .registration-status {
 | 
				
			||||||
            font-weight: bold;
 | 
					            font-weight: bold;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,7 +93,10 @@
 | 
				
			|||||||
          {{ $t('admin.UPDATE_USER_EMAIL') }}
 | 
					          {{ $t('admin.UPDATE_USER_EMAIL') }}
 | 
				
			||||||
        </button>
 | 
					        </button>
 | 
				
			||||||
        <button
 | 
					        <button
 | 
				
			||||||
          v-if="authUser.username !== user.username"
 | 
					          v-if="
 | 
				
			||||||
 | 
					            authUser.username !== user.username &&
 | 
				
			||||||
 | 
					            appConfig.is_email_sending_enabled
 | 
				
			||||||
 | 
					          "
 | 
				
			||||||
          @click.prevent="updateDisplayModal('reset')"
 | 
					          @click.prevent="updateDisplayModal('reset')"
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          {{ $t('admin.RESET_USER_PASSWORD') }}
 | 
					          {{ $t('admin.RESET_USER_PASSWORD') }}
 | 
				
			||||||
@@ -124,6 +127,7 @@
 | 
				
			|||||||
  } from 'vue'
 | 
					  } from 'vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import { AUTH_USER_STORE, ROOT_STORE, USERS_STORE } from '@/store/constants'
 | 
					  import { AUTH_USER_STORE, ROOT_STORE, USERS_STORE } from '@/store/constants'
 | 
				
			||||||
 | 
					  import { TAppConfig } from '@/types/application'
 | 
				
			||||||
  import { IAuthUserProfile, IUserProfile } from '@/types/user'
 | 
					  import { IAuthUserProfile, IUserProfile } from '@/types/user'
 | 
				
			||||||
  import { useStore } from '@/use/useStore'
 | 
					  import { useStore } from '@/use/useStore'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -157,6 +161,9 @@
 | 
				
			|||||||
  const errorMessages: ComputedRef<string | string[] | null> = computed(
 | 
					  const errorMessages: ComputedRef<string | string[] | null> = computed(
 | 
				
			||||||
    () => store.getters[ROOT_STORE.GETTERS.ERROR_MESSAGES]
 | 
					    () => store.getters[ROOT_STORE.GETTERS.ERROR_MESSAGES]
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 | 
					  const appConfig: ComputedRef<TAppConfig> = computed(
 | 
				
			||||||
 | 
					    () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
  let displayModal: Ref<string> = ref('')
 | 
					  let displayModal: Ref<string> = ref('')
 | 
				
			||||||
  const formErrors = ref(false)
 | 
					  const formErrors = ref(false)
 | 
				
			||||||
  const displayUserEmailForm: Ref<boolean> = ref(false)
 | 
					  const displayUserEmailForm: Ref<boolean> = ref(false)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,13 @@
 | 
				
			|||||||
    <div class="profile-form form-box">
 | 
					    <div class="profile-form form-box">
 | 
				
			||||||
      <ErrorMessage :message="errorMessages" v-if="errorMessages" />
 | 
					      <ErrorMessage :message="errorMessages" v-if="errorMessages" />
 | 
				
			||||||
      <div class="info-box success-message" v-if="isSuccess">
 | 
					      <div class="info-box success-message" v-if="isSuccess">
 | 
				
			||||||
        {{ $t(`user.PROFILE.SUCCESSFUL_${emailUpdate ? 'EMAIL_' : ''}UPDATE`) }}
 | 
					        {{
 | 
				
			||||||
 | 
					          $t(
 | 
				
			||||||
 | 
					            `user.PROFILE.SUCCESSFUL_${
 | 
				
			||||||
 | 
					              emailUpdate && appConfig.is_email_sending_enabled ? 'EMAIL_' : ''
 | 
				
			||||||
 | 
					            }UPDATE`
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <form :class="{ errors: formErrors }" @submit.prevent="updateProfile">
 | 
					      <form :class="{ errors: formErrors }" @submit.prevent="updateProfile">
 | 
				
			||||||
        <label class="form-items" for="email">
 | 
					        <label class="form-items" for="email">
 | 
				
			||||||
@@ -77,6 +83,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  import PasswordInput from '@/components/Common/PasswordInput.vue'
 | 
					  import PasswordInput from '@/components/Common/PasswordInput.vue'
 | 
				
			||||||
  import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
 | 
					  import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
 | 
				
			||||||
 | 
					  import { TAppConfig } from '@/types/application'
 | 
				
			||||||
  import { IUserProfile, IUserAccountPayload } from '@/types/user'
 | 
					  import { IUserProfile, IUserAccountPayload } from '@/types/user'
 | 
				
			||||||
  import { useStore } from '@/use/useStore'
 | 
					  import { useStore } from '@/use/useStore'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -95,6 +102,9 @@
 | 
				
			|||||||
  const loading = computed(
 | 
					  const loading = computed(
 | 
				
			||||||
    () => store.getters[AUTH_USER_STORE.GETTERS.USER_LOADING]
 | 
					    () => store.getters[AUTH_USER_STORE.GETTERS.USER_LOADING]
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 | 
					  const appConfig: ComputedRef<TAppConfig> = computed(
 | 
				
			||||||
 | 
					    () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
  const isSuccess: ComputedRef<boolean> = computed(
 | 
					  const isSuccess: ComputedRef<boolean> = computed(
 | 
				
			||||||
    () => store.getters[AUTH_USER_STORE.GETTERS.IS_SUCCESS]
 | 
					    () => store.getters[AUTH_USER_STORE.GETTERS.IS_SUCCESS]
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,10 @@
 | 
				
			|||||||
          message="user.REGISTER_DISABLED"
 | 
					          message="user.REGISTER_DISABLED"
 | 
				
			||||||
          v-if="registration_disabled"
 | 
					          v-if="registration_disabled"
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
 | 
					        <AlertMessage
 | 
				
			||||||
 | 
					          message="admin.EMAIL_SENDING_DISABLED"
 | 
				
			||||||
 | 
					          v-if="sendingEmailDisabled"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          class="info-box success-message"
 | 
					          class="info-box success-message"
 | 
				
			||||||
          v-if="isSuccess || isRegistrationSuccess"
 | 
					          v-if="isSuccess || isRegistrationSuccess"
 | 
				
			||||||
@@ -23,7 +27,11 @@
 | 
				
			|||||||
          {{
 | 
					          {{
 | 
				
			||||||
            $t(
 | 
					            $t(
 | 
				
			||||||
              `user.PROFILE.SUCCESSFUL_${
 | 
					              `user.PROFILE.SUCCESSFUL_${
 | 
				
			||||||
                isRegistrationSuccess ? 'REGISTRATION' : 'UPDATE'
 | 
					                isRegistrationSuccess
 | 
				
			||||||
 | 
					                  ? `REGISTRATION${
 | 
				
			||||||
 | 
					                      appConfig.is_email_sending_enabled ? '_WITH_EMAIL' : ''
 | 
				
			||||||
 | 
					                    }`
 | 
				
			||||||
 | 
					                  : 'UPDATE'
 | 
				
			||||||
              }`
 | 
					              }`
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
          }}
 | 
					          }}
 | 
				
			||||||
@@ -52,7 +60,7 @@
 | 
				
			|||||||
            <input
 | 
					            <input
 | 
				
			||||||
              v-if="action !== 'reset'"
 | 
					              v-if="action !== 'reset'"
 | 
				
			||||||
              id="email"
 | 
					              id="email"
 | 
				
			||||||
              :disabled="registration_disabled"
 | 
					              :disabled="registration_disabled || sendingEmailDisabled"
 | 
				
			||||||
              required
 | 
					              required
 | 
				
			||||||
              @invalid="invalidateForm"
 | 
					              @invalid="invalidateForm"
 | 
				
			||||||
              type="email"
 | 
					              type="email"
 | 
				
			||||||
@@ -91,7 +99,10 @@
 | 
				
			|||||||
              @passwordError="invalidateForm"
 | 
					              @passwordError="invalidateForm"
 | 
				
			||||||
            />
 | 
					            />
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          <button type="submit" :disabled="registration_disabled">
 | 
					          <button
 | 
				
			||||||
 | 
					            type="submit"
 | 
				
			||||||
 | 
					            :disabled="registration_disabled || sendingEmailDisabled"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
            {{ $t(buttonText) }}
 | 
					            {{ $t(buttonText) }}
 | 
				
			||||||
          </button>
 | 
					          </button>
 | 
				
			||||||
        </form>
 | 
					        </form>
 | 
				
			||||||
@@ -99,8 +110,12 @@
 | 
				
			|||||||
          <router-link class="links" to="/register">
 | 
					          <router-link class="links" to="/register">
 | 
				
			||||||
            {{ $t('user.REGISTER') }}
 | 
					            {{ $t('user.REGISTER') }}
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
          -
 | 
					          <span v-if="appConfig.is_email_sending_enabled">-</span>
 | 
				
			||||||
          <router-link class="links" to="/password-reset/request">
 | 
					          <router-link
 | 
				
			||||||
 | 
					            v-if="appConfig.is_email_sending_enabled"
 | 
				
			||||||
 | 
					            class="links"
 | 
				
			||||||
 | 
					            to="/password-reset/request"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
            {{ $t('user.PASSWORD_FORGOTTEN') }}
 | 
					            {{ $t('user.PASSWORD_FORGOTTEN') }}
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
@@ -110,7 +125,12 @@
 | 
				
			|||||||
            {{ $t('user.LOGIN') }}
 | 
					            {{ $t('user.LOGIN') }}
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div v-if="['login', 'register'].includes(action)">
 | 
					        <div
 | 
				
			||||||
 | 
					          v-if="
 | 
				
			||||||
 | 
					            ['login', 'register'].includes(action) &&
 | 
				
			||||||
 | 
					            appConfig.is_email_sending_enabled
 | 
				
			||||||
 | 
					          "
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
          <router-link class="links" to="/account-confirmation/resend">
 | 
					          <router-link class="links" to="/account-confirmation/resend">
 | 
				
			||||||
            {{ $t('user.ACCOUNT_CONFIRMATION_NOT_RECEIVED') }}
 | 
					            {{ $t('user.ACCOUNT_CONFIRMATION_NOT_RECEIVED') }}
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
@@ -175,6 +195,11 @@
 | 
				
			|||||||
    () =>
 | 
					    () =>
 | 
				
			||||||
      props.action === 'register' && !appConfig.value.is_registration_enabled
 | 
					      props.action === 'register' && !appConfig.value.is_registration_enabled
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 | 
					  const sendingEmailDisabled: ComputedRef<boolean> = computed(
 | 
				
			||||||
 | 
					    () =>
 | 
				
			||||||
 | 
					      ['reset-request', 'account-confirmation-resend'].includes(props.action) &&
 | 
				
			||||||
 | 
					      !appConfig.value.is_email_sending_enabled
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
  const formErrors = ref(false)
 | 
					  const formErrors = ref(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function getButtonText(action: string): string {
 | 
					  function getButtonText(action: string): string {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@
 | 
				
			|||||||
  "CONFIRM_USER_PASSWORD_RESET": "Are you sure you want to reset {0} password?",
 | 
					  "CONFIRM_USER_PASSWORD_RESET": "Are you sure you want to reset {0} password?",
 | 
				
			||||||
  "CURRENT_EMAIL": "Current email",
 | 
					  "CURRENT_EMAIL": "Current email",
 | 
				
			||||||
  "DELETE_USER": "Delete user",
 | 
					  "DELETE_USER": "Delete user",
 | 
				
			||||||
 | 
					  "EMAIL_SENDING_DISABLED": "Email sending is disabled.",
 | 
				
			||||||
  "ENABLE_DISABLE_SPORTS": "Enable/disable sports.",
 | 
					  "ENABLE_DISABLE_SPORTS": "Enable/disable sports.",
 | 
				
			||||||
  "NEW_EMAIL": "New email",
 | 
					  "NEW_EMAIL": "New email",
 | 
				
			||||||
  "PASSWORD_RESET_SUCCESSFUL": "The password has been reset.",
 | 
					  "PASSWORD_RESET_SUCCESSFUL": "The password has been reset.",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,7 @@
 | 
				
			|||||||
    "signature expired, please log in again": "Signature expired. Please log in again.",
 | 
					    "signature expired, please log in again": "Signature expired. Please log in again.",
 | 
				
			||||||
    "successfully registered": "Successfully registered.",
 | 
					    "successfully registered": "Successfully registered.",
 | 
				
			||||||
    "user does not exist": "User does not exist.",
 | 
					    "user does not exist": "User does not exist.",
 | 
				
			||||||
    "valid email must be provided for admin contact": "A valid email must be provided for admininstrator contact",
 | 
					    "valid email must be provided for admin contact": "A valid email must be provided for administrator contact",
 | 
				
			||||||
    "you can not delete your account, no other user has admin rights": "You can not delete your account, no other user has admin rights.",
 | 
					    "you can not delete your account, no other user has admin rights": "You can not delete your account, no other user has admin rights.",
 | 
				
			||||||
    "you do not have permissions": "You do not have permissions."
 | 
					    "you do not have permissions": "You do not have permissions."
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -86,7 +86,8 @@
 | 
				
			|||||||
      "STOPPED_SPEED_THRESHOLD": "stopped speed threshold"
 | 
					      "STOPPED_SPEED_THRESHOLD": "stopped speed threshold"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "SUCCESSFUL_EMAIL_UPDATE": "Your account has been updated successfully. Please check your email to confirm your new email address.",
 | 
					    "SUCCESSFUL_EMAIL_UPDATE": "Your account has been updated successfully. Please check your email to confirm your new email address.",
 | 
				
			||||||
    "SUCCESSFUL_REGISTRATION": "A link to activate your account has been emailed to the address provided.",
 | 
					    "SUCCESSFUL_REGISTRATION": "Your account has been created successfully.",
 | 
				
			||||||
 | 
					    "SUCCESSFUL_REGISTRATION_WITH_EMAIL": "A link to activate your account has been emailed to the address provided.",
 | 
				
			||||||
    "SUCCESSFUL_UPDATE": "Your account has been updated successfully.",
 | 
					    "SUCCESSFUL_UPDATE": "Your account has been updated successfully.",
 | 
				
			||||||
    "UNITS": {
 | 
					    "UNITS": {
 | 
				
			||||||
      "LABEL": "Units for distance",
 | 
					      "LABEL": "Units for distance",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@
 | 
				
			|||||||
  "CONFIRM_USER_PASSWORD_RESET": "Êtes-vous sûr de vouloir réinitialiser le mot de passe de l'utilisateur {0} ?",
 | 
					  "CONFIRM_USER_PASSWORD_RESET": "Êtes-vous sûr de vouloir réinitialiser le mot de passe de l'utilisateur {0} ?",
 | 
				
			||||||
  "CURRENT_EMAIL": "Adresse email actuelle",
 | 
					  "CURRENT_EMAIL": "Adresse email actuelle",
 | 
				
			||||||
  "DELETE_USER": "Supprimer l'utilisateur",
 | 
					  "DELETE_USER": "Supprimer l'utilisateur",
 | 
				
			||||||
 | 
					  "EMAIL_SENDING_DISABLED": "L'envoi d'emails est désactivé.",
 | 
				
			||||||
  "ENABLE_DISABLE_SPORTS": "Activer/désactiver des sports.",
 | 
					  "ENABLE_DISABLE_SPORTS": "Activer/désactiver des sports.",
 | 
				
			||||||
  "NEW_EMAIL": "Nouvelle adresse email",
 | 
					  "NEW_EMAIL": "Nouvelle adresse email",
 | 
				
			||||||
  "PASSWORD_RESET_SUCCESSFUL": "Le mot de passe a été réinitialisé.",
 | 
					  "PASSWORD_RESET_SUCCESSFUL": "Le mot de passe a été réinitialisé.",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -91,7 +91,8 @@
 | 
				
			|||||||
      "STOPPED_SPEED_THRESHOLD": "seuil de vitesse arrêtée"
 | 
					      "STOPPED_SPEED_THRESHOLD": "seuil de vitesse arrêtée"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "SUCCESSFUL_EMAIL_UPDATE": "Votre compte a été modifié avec succès. Veuillez vérifier votre boite email pour valider votre nouvelle adresse email.",
 | 
					    "SUCCESSFUL_EMAIL_UPDATE": "Votre compte a été modifié avec succès. Veuillez vérifier votre boite email pour valider votre nouvelle adresse email.",
 | 
				
			||||||
    "SUCCESSFUL_REGISTRATION": "Un lien pour activer votre compte a été envoyé à l'adresse email fournie.",
 | 
					    "SUCCESSFUL_REGISTRATION": "Votre compte a été créé avec succès.",
 | 
				
			||||||
 | 
					    "SUCCESSFUL_REGISTRATION_WITH_EMAIL": "Un lien pour activer votre compte a été envoyé à l'adresse email fournie.",
 | 
				
			||||||
    "SUCCESSFUL_UPDATE": "Votre compte a été modifié avec succès.",
 | 
					    "SUCCESSFUL_UPDATE": "Votre compte a été modifié avec succès.",
 | 
				
			||||||
    "TIMEZONE": "Fuseau horaire"
 | 
					    "TIMEZONE": "Fuseau horaire"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,7 @@ export type TAppConfig = {
 | 
				
			|||||||
  [key: string]: number | boolean | string
 | 
					  [key: string]: number | boolean | string
 | 
				
			||||||
  admin_contact: string
 | 
					  admin_contact: string
 | 
				
			||||||
  gpx_limit_import: number
 | 
					  gpx_limit_import: number
 | 
				
			||||||
 | 
					  is_email_sending_enabled: boolean
 | 
				
			||||||
  is_registration_enabled: boolean
 | 
					  is_registration_enabled: boolean
 | 
				
			||||||
  map_attribution: string
 | 
					  map_attribution: string
 | 
				
			||||||
  max_single_file_size: number
 | 
					  max_single_file_size: number
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
[tool.poetry]
 | 
					[tool.poetry]
 | 
				
			||||||
name = "fittrackee"
 | 
					name = "fittrackee"
 | 
				
			||||||
version = "0.6.4"
 | 
					version = "0.6.5"
 | 
				
			||||||
description = "Self-hosted outdoor workout/activity tracker"
 | 
					description = "Self-hosted outdoor workout/activity tracker"
 | 
				
			||||||
authors = ["SamR1"]
 | 
					authors = ["SamR1"]
 | 
				
			||||||
license = "AGPL-3.0"
 | 
					license = "AGPL-3.0"
 | 
				
			||||||
@@ -63,9 +63,10 @@ Sphinx = "^4.5"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[tool.poetry.scripts]
 | 
					[tool.poetry.scripts]
 | 
				
			||||||
fittrackee = 'fittrackee.__main__:main'
 | 
					fittrackee = 'fittrackee.__main__:main'
 | 
				
			||||||
fittrackee_set_admin = 'fittrackee.users.users:set_admin'
 | 
					 | 
				
			||||||
fittrackee_upgrade_db = 'fittrackee.__main__:upgrade_db'
 | 
					 | 
				
			||||||
fittrackee_worker = 'flask_dramatiq:worker'
 | 
					fittrackee_worker = 'flask_dramatiq:worker'
 | 
				
			||||||
 | 
					ftcli = 'fittrackee.cli:cli'
 | 
				
			||||||
 | 
					fittrackee_set_admin = 'fittrackee.__main__:set_admin'  # deprecated
 | 
				
			||||||
 | 
					fittrackee_upgrade_db = 'fittrackee.__main__:upgrade_db'  # deprecated
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[tool.black]
 | 
					[tool.black]
 | 
				
			||||||
line-length = 79
 | 
					line-length = 79
 | 
				
			||||||
 
 | 
				
			|||||||