Merge branch 'release-v0.7.13'

This commit is contained in:
Sam 2023-03-05 16:00:28 +01:00
commit 21ea48853e
186 changed files with 5531 additions and 1227 deletions

View File

@ -1,5 +1,42 @@
# Change log # Change log
## Version 0.7.13 (2023/03/05)
This version allows to display the instance privacy policy. A user must agree to the privacy policy to register.
A default policy is available and a custom policy can be defined in the administration.
**Note:** After **FitTrackee** upgrade, a message will be displayed to all users in order to review the policy.
A user can now request a data export (containing user info, workout data and uploaded gpx files).
Lastly, additional information that may be useful to users can be displayed in **About** page.
### Features and enhancements
* [#301](https://github.com/SamR1/FitTrackee/issues/301) - add privacy policy
* [#304](https://github.com/SamR1/FitTrackee/issues/304) - add user data export
* [#305](https://github.com/SamR1/FitTrackee/issues/305) - add additional information in About page
### Bugs Fixed
* [PR#307](https://github.com/SamR1/FitTrackee/pull/307) - Minor fixes
* update workout and map files name
* fix error message when api is not running
* fix modal position
### Translations
* [PR#297](https://github.com/SamR1/FitTrackee/pull/297) - Translations update from Hosted Weblate (Dutch)
* [PR#308](https://github.com/SamR1/FitTrackee/pull/308) - Translations update from Hosted Weblate (Dutch)
* [PR#310](https://github.com/SamR1/FitTrackee/pull/310) - Translations update from Hosted Weblate (Dutch and German)
Thanks to the contributors:
- @bjornclauw
- @qwerty287
**Note:** This release contains database migration (see upgrade instructions in [documentation](https://samr1.github.io/FitTrackee/installation.html#upgrade))
## Version 0.7.12 (2023/02/16) ## Version 0.7.12 (2023/02/16)
### Translations ### Translations

View File

@ -1 +1 @@
0.7.12 0.7.13

View File

@ -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: ac8aa6be93dbbca43a66932db34df2ce config: 27f4394ace216ce3fd5ef2a67c1bf1ef
tags: 645f666f9bcd5a90fca523b33c5a78b7 tags: 645f666f9bcd5a90fca523b33c5a78b7

Binary file not shown.

Before

Width:  |  Height:  |  Size: 566 KiB

After

Width:  |  Height:  |  Size: 568 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 386 KiB

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -1,5 +1,5 @@
Authentication Authentication and account
############## ##########################
.. autoflask:: fittrackee:create_app() .. autoflask:: fittrackee:create_app()
:endpoints: :endpoints:
@ -18,4 +18,8 @@ Authentication
auth.update_user_account, auth.update_user_account,
auth.update_password, auth.update_password,
auth.update_email, auth.update_email,
auth.logout_user auth.logout_user,
auth.accept_privacy_policy,
auth.get_user_data_export,
auth.request_user_data_export,
auth.download_data_export

View File

@ -1,5 +1,42 @@
# Change log # Change log
## Version 0.7.13 (2023/03/05)
This version allows to display the instance privacy policy. A user must agree to the privacy policy to register.
A default policy is available and a custom policy can be defined in the administration.
**Note:** After **FitTrackee** upgrade, a message will be displayed to all users in order to review the policy.
A user can now request a data export (containing user info, workout data and uploaded gpx files).
Lastly, additional information that may be useful to users can be displayed in **About** page.
### Features and enhancements
* [#301](https://github.com/SamR1/FitTrackee/issues/301) - add privacy policy
* [#304](https://github.com/SamR1/FitTrackee/issues/304) - add user data export
* [#305](https://github.com/SamR1/FitTrackee/issues/305) - add additional information in About page
### Bugs Fixed
* [PR#307](https://github.com/SamR1/FitTrackee/pull/307) - Minor fixes
* update workout and map files name
* fix error message when api is not running
* fix modal position
### Translations
* [PR#297](https://github.com/SamR1/FitTrackee/pull/297) - Translations update from Hosted Weblate (Dutch)
* [PR#308](https://github.com/SamR1/FitTrackee/pull/308) - Translations update from Hosted Weblate (Dutch)
* [PR#310](https://github.com/SamR1/FitTrackee/pull/310) - Translations update from Hosted Weblate (Dutch and German)
Thanks to the contributors:
- @bjornclauw
- @qwerty287
**Note:** This release contains database migration (see upgrade instructions in [documentation](https://samr1.github.io/FitTrackee/installation.html#upgrade))
## Version 0.7.12 (2023/02/16) ## Version 0.7.12 (2023/02/16)
### Translations ### Translations

View File

@ -28,13 +28,6 @@ A command line interface (CLI) is available to manage database, OAuth2 tokens an
Database Database
~~~~~~~~ ~~~~~~~~
``ftcli db upgrade``
""""""""""""""""""""
.. versionadded:: 0.6.5
Apply migrations.
``ftcli db drop`` ``ftcli db drop``
""""""""""""""""" """""""""""""""""
.. versionadded:: 0.6.5 .. versionadded:: 0.6.5
@ -42,6 +35,13 @@ Apply migrations.
Empty database and delete uploaded files, only on development environments. Empty database and delete uploaded files, only on development environments.
``ftcli db upgrade``
""""""""""""""""""""
.. versionadded:: 0.6.5
Apply migrations.
OAuth2 OAuth2
~~~~~~ ~~~~~~
@ -66,6 +66,23 @@ Remove tokens expired for more than provided number of days
Users Users
~~~~~ ~~~~~
``ftcli users clean_archives``
""""""""""""""""""""""""""""""
.. versionadded:: 0.7.13
Delete export requests and related archives created more than provided number of days.
.. cssclass:: table-bordered
.. list-table::
:widths: 25 50
:header-rows: 1
* - Options
- Description
* - ``--days``
- Number of days.
``ftcli users clean_tokens`` ``ftcli users clean_tokens``
"""""""""""""""""""""""""""" """"""""""""""""""""""""""""
.. versionadded:: 0.7.0 .. versionadded:: 0.7.0
@ -83,6 +100,24 @@ Remove blacklisted tokens expired for more than provided number of days.
- Number of days. - Number of days.
``ftcli users export_archives``
"""""""""""""""""""""""""""""""
.. versionadded:: 0.7.13
Process incomplete user export requests.
Can be used if redis is not set (no dramatiq workers running).
.. cssclass:: table-bordered
.. list-table::
:widths: 25 50
:header-rows: 1
* - Options
- Description
* - ``--max``
- Maximum number of export requests to process.
``ftcli users update`` ``ftcli users update``
"""""""""""""""""""""" """"""""""""""""""""""
.. versionadded:: 0.6.5 .. versionadded:: 0.6.5

View File

@ -74,9 +74,10 @@ Workouts
Account & preferences Account & preferences
^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
- A user can create, update and deleted his account. - A user can create, update and deleted his account.
- The user must agree to the privacy policy to register. If a more recent policy is available, a message is displayed on the dashboard to review the new version (*new in 0.7.13*).
- On registration, the user account is created with selected language in dropdown as user preference (*new in 0.6.9*). - On registration, the user account is created with selected language in dropdown as user preference (*new in 0.6.9*).
- After registration, the user account is inactive and an email with confirmation instructions is sent to activate it. - 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*) A user with an inactive account cannot log in. (*new in 0.6.0*).
.. note:: .. note::
In case email sending is not configured, a `command line <cli.html#ftcli-users-update>`__ allows to activate users account. In case email sending is not configured, a `command line <cli.html#ftcli-users-update>`__ allows to activate users account.
@ -98,17 +99,25 @@ Account & preferences
| A workout with a disabled sport will still be displayed in the application. | A workout with a disabled sport will still be displayed in the application.
- A user can create `clients <apps.html>`__ for third-party applications (*new in 0.7.0*). - A user can create `clients <apps.html>`__ for third-party applications (*new in 0.7.0*).
- | A user can request a data export (*new in 0.7.13*).
| It generates a zip archive containing 2 ``json`` files (user info and workouts data) and all uploaded gpx files.
.. note::
For now, it's not possible to import these files into another **FitTrackee** instance.
Administration Administration
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
(*new in 0.3.0*) (*new in 0.3.0*)
- **Application** Application
"""""""""""
**Configuration**
The following parameters can be set: The following parameters can be set:
- active users limit. If 0, registration is enabled (no limit defined) - active users limit. If 0, registration is enabled (no limit defined).
- maximum size of gpx file (individually uploaded or in a zip archive) (*changed in 0.7.4*) - maximum size of gpx file (individually uploaded or in a zip archive) (*changed in 0.7.4*)
- maximum size of zip archive - maximum size of zip archive
- maximum number of files in the zip archive (*changed in 0.7.4*) - maximum number of files in the zip archive (*changed in 0.7.4*)
@ -120,19 +129,39 @@ Administration
.. note:: .. note::
If email sending is disabled, a warning is displayed. If email sending is disabled, a warning is displayed.
**About**
- **Users** (*new in 0.7.13*)
| It is possible displayed additional information that may be useful to users in **About** page.
| Markdown syntax can be used.
**Privacy policy**
(*new in 0.7.13*)
| A default privacy policy is available (originally adapted from the `Discourse <https://github.com/discourse/discourse>`__ privacy policy).
| A custom privacy policy can set if needed (Markdown syntax can be used). A policy update will display a message on users dashboard to review it.
.. note::
Only the default privacy policy is translated (if the translation is available).
Users
"""""
- display and filter users list - display and filter users list
- edit a user to: - edit a user to:
- 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*). If email sending is disabled, it is only possible via CLI. - 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
""""""
- enable or disable a sport (a sport can be disabled even if workout with this sport exists) - enable or disable a sport (a sport can be disabled even if workout with this sport exists)

View File

@ -26,13 +26,16 @@ Prerequisites
- Python 3.7+ - Python 3.7+
- PostgreSQL 11+ - PostgreSQL 11+
- optional - optional
- Redis for task queue (if email sending is enabled) and API rate limits - Redis for task queue (if email sending is enabled and for data export requests) and API rate limits
- SMTP provider (if email sending is enabled) - SMTP provider (if email sending is enabled)
- API key from a `weather data provider <installation.html#weather-data>`__ - API key from a `weather data provider <installation.html#weather-data>`__
- `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)
.. note::
| If registration is enabled, it is recommended to set Redis and a SMTP provider for email sending and data export requests.
.. note:: .. note::
| The following steps describe an installation on Linux systems (tested | The following steps describe an installation on Linux systems (tested
on Debian and Arch). on Debian and Arch).
@ -273,11 +276,13 @@ Emails sent by FitTrackee are:
- password reset request - password reset request
- email change (to old and new email adresses) - email change (to old and new email adresses)
- password change - password change
- notification when a data export archive is ready to download (*new in 0.7.13*)
.. versionchanged:: 0.6.5 .. 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). 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.
A `CLI <cli.html#ftcli-users-update>`__ is available to activate account, modify email and password and handle data export requests.
Map tile server Map tile server
@ -293,7 +298,7 @@ To keep using **ThunderForest Outdoors**, the configuration is:
- ``MAP_ATTRIBUTION=&copy; <a href="http://www.thunderforest.com/">Thunderforest</a>, &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors`` - ``MAP_ATTRIBUTION=&copy; <a href="http://www.thunderforest.com/">Thunderforest</a>, &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors``
.. note:: .. note::
| Check the terms of service of tile provider for map attribution | Check the terms of service of tile provider for map attribution.
.. versionchanged:: 0.6.10 .. versionchanged:: 0.6.10
@ -502,13 +507,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.7.12): - Download the last release (for now, it is the release v0.7.13):
.. code:: bash .. code:: bash
$ wget https://github.com/SamR1/FitTrackee/archive/v0.7.12.tar.gz $ wget https://github.com/SamR1/FitTrackee/archive/v0.7.13.tar.gz
$ tar -xzf v0.7.12.tar.gz $ tar -xzf v0.7.13.tar.gz
$ mv FitTrackee-0.7.12 FitTrackee $ mv FitTrackee-0.7.13 FitTrackee
$ cd FitTrackee $ cd FitTrackee
- Create **.env** from example and update it - Create **.env** from example and update it
@ -628,13 +633,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.7.12) and overwrite existing files: - Download the last release (for now, it is the release v0.7.13) and overwrite existing files:
.. code:: bash .. code:: bash
$ wget https://github.com/SamR1/FitTrackee/archive/v0.7.12.tar.gz $ wget https://github.com/SamR1/FitTrackee/archive/v0.7.13.tar.gz
$ tar -xzf v0.7.12.tar.gz $ tar -xzf v0.7.13.tar.gz
$ cp -R FitTrackee-0.7.12/* FitTrackee/ $ cp -R FitTrackee-0.7.13/* 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>`__).

View File

@ -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.7.12', VERSION: '0.7.13',
LANGUAGE: 'en', LANGUAGE: 'en',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,
BUILDER: 'html', BUILDER: 'html',

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Authentication &#8212; FitTrackee 0.7.12 <title>Authentication and account &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -82,7 +82,7 @@
<ul class="dropdown-menu localtoc" <ul class="dropdown-menu localtoc"
role="menu" role="menu"
aria-labelledby="dLabelLocalToc"><ul> aria-labelledby="dLabelLocalToc"><ul>
<li><a class="reference internal" href="#">Authentication</a></li> <li><a class="reference internal" href="#">Authentication and account</a></li>
</ul> </ul>
</ul> </ul>
</li> </li>
@ -130,8 +130,8 @@
<div class="row"> <div class="row">
<div class="body col-md-12 content" role="main"> <div class="body col-md-12 content" role="main">
<section id="authentication"> <section id="authentication-and-account">
<h1>Authentication<a class="headerlink" href="#authentication" title="Permalink to this heading"></a></h1> <h1>Authentication and account<a class="headerlink" href="#authentication-and-account" title="Permalink to this heading"></a></h1>
<dl class="http post"> <dl class="http post">
<dt class="sig sig-object http" id="post--api-auth-register"> <dt class="sig sig-object http" id="post--api-auth-register">
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/register</span></span><a class="headerlink" href="#post--api-auth-register" 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/register</span></span><a class="headerlink" href="#post--api-auth-register" title="Permalink to this definition"></a></dt>
@ -175,6 +175,7 @@ to activate it.</p>
<li><p><strong>password</strong> (<em>string</em>) password (8 characters required)</p></li> <li><p><strong>password</strong> (<em>string</em>) password (8 characters required)</p></li>
<li><p><strong>lang</strong> (<em>string</em>) user language preferences (if not provided or invalid, <li><p><strong>lang</strong> (<em>string</em>) user language preferences (if not provided or invalid,
fallback to en (english))</p></li> fallback to en (english))</p></li>
<li><p><strong>accepted_policy</strong> (<em>boolean</em>) true if user accepted privacy policy</p></li>
</ul> </ul>
</dd> </dd>
<dt class="field-even">Status Codes<span class="colon">:</span></dt> <dt class="field-even">Status Codes<span class="colon">:</span></dt>
@ -347,6 +348,7 @@ character “_” allowed</p></li>
<span class="p">{</span> <span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;data&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">&quot;data&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;accepted_privacy_policy&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Sat, 25 Fev 2023 13:52:58 GMT&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;admin&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;admin&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;bio&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;bio&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;birth_date&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;birth_date&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
@ -689,6 +691,7 @@ character “_” allowed</p></li>
<li><p><strong>language</strong> (<em>string</em>) language preferences</p></li> <li><p><strong>language</strong> (<em>string</em>) language preferences</p></li>
<li><p><strong>timezone</strong> (<em>string</em>) user time zone</p></li> <li><p><strong>timezone</strong> (<em>string</em>) user time zone</p></li>
<li><p><strong>weekm</strong> (<em>boolean</em>) does week start on Monday?</p></li> <li><p><strong>weekm</strong> (<em>boolean</em>) does week start on Monday?</p></li>
<li><p><strong>weekm</strong> does week start on Monday?</p></li>
</ul> </ul>
</dd> </dd>
<dt class="field-even">Request Headers<span class="colon">:</span></dt> <dt class="field-even">Request Headers<span class="colon">:</span></dt>
@ -1224,6 +1227,209 @@ for other reasons.</p></li>
</dl> </dl>
</dd></dl> </dd></dl>
<dl class="http post">
<dt class="sig sig-object http" id="post--api-auth-account-privacy-policy">
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/account/privacy-policy</span></span><a class="headerlink" href="#post--api-auth-account-privacy-policy" title="Permalink to this definition"></a></dt>
<dd><p>The authenticated user accepts the privacy policy.</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">/auth/account/privacy-policy</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>
</pre></div>
</div>
<p><strong>Example response</strong>:</p>
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
<span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;success&quot;</span>
<span class="p">}</span>
</pre></div>
</div>
<dl class="field-list simple">
<dt class="field-odd">Request JSON Object<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>accepted_policy</strong> (<em>boolean</em>) true if user accepted privacy policy</p></li>
</ul>
</dd>
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
<dd class="field-even"><ul class="simple">
<li><p><span><a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7235#section-4.2">Authorization</a></span> OAuth 2.0 Bearer Token</p></li>
</ul>
</dd>
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
<dd class="field-odd"><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> success</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> <ul>
<li><p>invalid payload</p></li>
</ul>
</p></li>
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> <ul>
<li><p>provide a valid auth token</p></li>
<li><p>signature expired, please log in again</p></li>
<li><p>invalid token, please log in again</p></li>
</ul>
</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> internal server error</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="http get">
<dt class="sig sig-object http" id="get--api-auth-account-export">
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/auth/account/export</span></span><a class="headerlink" href="#get--api-auth-account-export" title="Permalink to this definition"></a></dt>
<dd><p>Get a data export info for authenticated user if a request exists.</p>
<p>It returns:</p>
<ul class="simple">
<li><p>export creation date</p></li>
<li><p>export status (<code class="docutils literal notranslate"><span class="pre">in_progress</span></code>, <code class="docutils literal notranslate"><span class="pre">successful</span></code> and <code class="docutils literal notranslate"><span class="pre">errored</span></code>)</p></li>
<li><p>file name and size (in bytes) when export is successful</p></li>
</ul>
<p><strong>Example request</strong>:</p>
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/auth/account/export</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>
</pre></div>
</div>
<p><strong>Example response</strong>:</p>
<ul class="simple">
<li><p>if a request exists</p></li>
</ul>
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
<span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;success&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;request&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;created_at&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Wed, 01 Mar 2023 12:31:17 GMT&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;successful&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;file_name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;archive_rgjsR3fHt295ywNQr5Yp.zip&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;file_size&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">924</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<ul class="simple">
<li><p>if no request</p></li>
</ul>
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
<span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;success&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;request&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
<span class="p">}</span>
</pre></div>
</div>
<dl class="field-list simple">
<dt class="field-odd">Request Headers<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><span><a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7235#section-4.2">Authorization</a></span> OAuth 2.0 Bearer Token</p></li>
</ul>
</dd>
<dt class="field-even">Status Codes<span class="colon">:</span></dt>
<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> success</p></li>
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> <ul>
<li><p>provide a valid auth token</p></li>
<li><p>signature expired, please log in again</p></li>
<li><p>invalid token, please log in again</p></li>
</ul>
</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="http post">
<dt class="sig sig-object http" id="post--api-auth-account-export-request">
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/account/export/request</span></span><a class="headerlink" href="#post--api-auth-account-export-request" title="Permalink to this definition"></a></dt>
<dd><p>Request a data export for authenticated user.</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">/auth/account/export/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>
</pre></div>
</div>
<p><strong>Example response</strong>:</p>
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
<span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;success&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;request&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;created_at&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Wed, 01 Mar 2023 12:31:17 GMT&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;in_progress&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;file_name&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;file_size&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<dl class="field-list simple">
<dt class="field-odd">Request Headers<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><span><a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7235#section-4.2">Authorization</a></span> OAuth 2.0 Bearer Token</p></li>
</ul>
</dd>
<dt class="field-even">Status Codes<span class="colon">:</span></dt>
<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> success</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> <ul>
<li><p>ongoing request exists</p></li>
<li><p>completed request already exists</p></li>
</ul>
</p></li>
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> <ul>
<li><p>provide a valid auth token</p></li>
<li><p>signature expired, please log in again</p></li>
<li><p>invalid token, please log in again</p></li>
</ul>
</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> internal server error</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="http get">
<dt class="sig sig-object http" id="get--api-auth-account-export-(string-file_name)">
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/auth/account/export/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">file_name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#get--api-auth-account-export-(string-file_name)" title="Permalink to this definition"></a></dt>
<dd><p>Download a data export archive</p>
<p><strong>Example request</strong>:</p>
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/auth/account/export/download/archive_rgjsR3fHr5Yp.zip</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>
</pre></div>
</div>
<p><strong>Example response</strong>:</p>
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/x-gzip</span>
</pre></div>
</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>file_name</strong> (<em>string</em>) filename</p></li>
</ul>
</dd>
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
<dd class="field-even"><ul class="simple">
<li><p><span><a class="reference external" href="https://www.rfc-editor.org/rfc/rfc7235#section-4.2">Authorization</a></span> OAuth 2.0 Bearer Token</p></li>
</ul>
</dd>
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
<dd class="field-odd"><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> success</p></li>
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> <ul>
<li><p>provide a valid auth token</p></li>
<li><p>signature expired, please log in again</p></li>
<li><p>invalid token, please log in again</p></li>
</ul>
</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> file not found</p></li>
</ul>
</dd>
</dl>
</dd></dl>
</section> </section>
@ -1239,7 +1445,7 @@ for other reasons.</p></li>
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Configuration &#8212; FitTrackee 0.7.12 <title>Configuration &#8212; FitTrackee 0.7.13
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" />
@ -20,7 +20,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="OAuth2" href="oauth2.html" /> <link rel="next" title="OAuth2" href="oauth2.html" />
<link rel="prev" title="Authentication" href="auth.html" /> <link rel="prev" title="Authentication and account" href="auth.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'>
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -92,7 +92,7 @@
<li> <li>
<a href="auth.html" title="Previous Chapter: Authentication"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">&laquo; Authentication</span> <a href="auth.html" title="Previous Chapter: Authentication and account"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">&laquo; Authenticatio...</span>
</a> </a>
</li> </li>
<li> <li>
@ -147,6 +147,7 @@
<span class="p">{</span> <span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;data&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">&quot;data&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;about&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;admin_contact&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;admin@example.com&quot;</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;admin_contact&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;admin@example.com&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;gpx_limit_import&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;gpx_limit_import&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;is_email_sending_enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;is_email_sending_enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
@ -155,7 +156,9 @@
<span class="w"> </span><span class="nt">&quot;max_users&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;max_users&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;max_zip_file_size&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;max_zip_file_size&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;map_attribution&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&amp;copy; &lt;a href=http://www.openstreetmap.org/copyright&gt;OpenStreetMap&lt;/a&gt; contributors&quot;</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;map_attribution&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&amp;copy; &lt;a href=http://www.openstreetmap.org/copyright&gt;OpenStreetMap&lt;/a&gt; contributors&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;0.7.12&quot;</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;privacy_policy&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;privacy_policy_date&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;0.7.13&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;weather_provider&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span> <span class="w"> </span><span class="nt">&quot;weather_provider&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
<span class="w"> </span><span class="p">},</span> <span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;success&quot;</span> <span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;success&quot;</span>
@ -189,6 +192,7 @@
<span class="p">{</span> <span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;data&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">&quot;data&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;about&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;admin_contact&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;admin@example.com&quot;</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;admin_contact&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;admin@example.com&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;gpx_limit_import&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;gpx_limit_import&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;is_email_sending_enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;is_email_sending_enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
@ -197,7 +201,9 @@
<span class="w"> </span><span class="nt">&quot;max_users&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;max_users&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;max_zip_file_size&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;max_zip_file_size&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;map_attribution&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&amp;copy; &lt;a href=http://www.openstreetmap.org/copyright&gt;OpenStreetMap&lt;/a&gt; contributors&quot;</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;map_attribution&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&amp;copy; &lt;a href=http://www.openstreetmap.org/copyright&gt;OpenStreetMap&lt;/a&gt; contributors&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;0.7.12&quot;</span><span class="p">,</span> <span class="w"> </span><span class="nt">&quot;privacy_policy&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;privacy_policy_date&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;0.7.13&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;weather_provider&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span> <span class="w"> </span><span class="nt">&quot;weather_provider&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
<span class="w"> </span><span class="p">},</span> <span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;success&quot;</span> <span class="w"> </span><span class="nt">&quot;status&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;success&quot;</span>
@ -207,12 +213,14 @@
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Request JSON Object<span class="colon">:</span></dt> <dt class="field-odd">Request JSON Object<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple"> <dd class="field-odd"><ul class="simple">
<li><p><strong>about</strong> (<em>string</em>) instance information</p></li>
<li><p><strong>admin_contact</strong> (<em>string</em>) email to contact the administrator</p></li> <li><p><strong>admin_contact</strong> (<em>string</em>) email to contact the administrator</p></li>
<li><p><strong>gpx_limit_import</strong> (<em>integer</em>) max number of files in zip archive</p></li> <li><p><strong>gpx_limit_import</strong> (<em>integer</em>) max number of files in zip archive</p></li>
<li><p><strong>is_registration_enabled</strong> (<em>boolean</em>) is registration enabled?</p></li> <li><p><strong>is_registration_enabled</strong> (<em>boolean</em>) is registration enabled?</p></li>
<li><p><strong>max_single_file_size</strong> (<em>integer</em>) max size of a single file</p></li> <li><p><strong>max_single_file_size</strong> (<em>integer</em>) max size of a single file</p></li>
<li><p><strong>max_users</strong> (<em>integer</em>) max users allowed to register on instance</p></li> <li><p><strong>max_users</strong> (<em>integer</em>) max users allowed to register on instance</p></li>
<li><p><strong>max_zip_file_size</strong> (<em>integer</em>) max size of a zip archive</p></li> <li><p><strong>max_zip_file_size</strong> (<em>integer</em>) max size of a zip archive</p></li>
<li><p><strong>privacy_policy</strong> (<em>string</em>) instance privacy policy</p></li>
</ul> </ul>
</dd> </dd>
<dt class="field-even">Request Headers<span class="colon">:</span></dt> <dt class="field-even">Request Headers<span class="colon">:</span></dt>
@ -281,7 +289,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>API documentation &#8212; FitTrackee 0.7.12 <title>API documentation &#8212; FitTrackee 0.7.13
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" />
@ -19,7 +19,7 @@
<script src="../_static/sphinx_highlight.js"></script> <script src="../_static/sphinx_highlight.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="Authentication" href="auth.html" /> <link rel="next" title="Authentication and account" href="auth.html" />
<link rel="prev" title="Command line interface" href="../cli.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'>
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -96,7 +96,7 @@
</a> </a>
</li> </li>
<li> <li>
<a href="auth.html" title="Next Chapter: Authentication"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Authentication &raquo;</span> <a href="auth.html" title="Next Chapter: Authentication and account"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Authenticatio... &raquo;</span>
</a> </a>
</li> </li>
@ -135,7 +135,7 @@
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Endpoints:</span></p> <p class="caption" role="heading"><span class="caption-text">Endpoints:</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="auth.html">Authentication</a></li> <li class="toctree-l1"><a class="reference internal" href="auth.html">Authentication and account</a></li>
<li class="toctree-l1"><a class="reference internal" href="configuration.html">Configuration</a></li> <li class="toctree-l1"><a class="reference internal" href="configuration.html">Configuration</a></li>
<li class="toctree-l1"><a class="reference internal" href="oauth2.html">OAuth2</a></li> <li class="toctree-l1"><a class="reference internal" href="oauth2.html">OAuth2</a></li>
<li class="toctree-l1"><a class="reference internal" href="records.html">Records</a></li> <li class="toctree-l1"><a class="reference internal" href="records.html">Records</a></li>
@ -160,7 +160,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>OAuth2 &#8212; FitTrackee 0.7.12 <title>OAuth2 &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -694,7 +694,7 @@ are supported by FitTrackee)</p></li>
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Records &#8212; FitTrackee 0.7.12 <title>Records &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -262,7 +262,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Sports &#8212; FitTrackee 0.7.12 <title>Sports &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -492,7 +492,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Statistics &#8212; FitTrackee 0.7.12 <title>Statistics &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -419,7 +419,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Users &#8212; FitTrackee 0.7.12 <title>Users &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -663,7 +663,7 @@ one admin.</p>
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Workouts &#8212; FitTrackee 0.7.12 <title>Workouts &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -1187,7 +1187,7 @@ must be provided with ascent)</p></li>
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Third-party applications &#8212; FitTrackee 0.7.12 <title>Third-party applications &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -259,7 +259,7 @@ It is recommended to use PKCE to provide a better security.</p>
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

File diff suppressed because it is too large Load Diff

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Command line interface &#8212; FitTrackee 0.7.12 <title>Command line interface &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -84,8 +84,8 @@
aria-labelledby="dLabelLocalToc"><ul> aria-labelledby="dLabelLocalToc"><ul>
<li><a class="reference internal" href="#">Command line interface</a><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="#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> <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>
<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>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#oauth2">OAuth2</a><ul> <li><a class="reference internal" href="#oauth2">OAuth2</a><ul>
@ -93,7 +93,9 @@
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#users">Users</a><ul> <li><a class="reference internal" href="#users">Users</a><ul>
<li><a class="reference internal" href="#ftcli-users-clean-archives"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">clean_archives</span></code></a></li>
<li><a class="reference internal" href="#ftcli-users-clean-tokens"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">clean_tokens</span></code></a></li> <li><a class="reference internal" href="#ftcli-users-clean-tokens"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">clean_tokens</span></code></a></li>
<li><a class="reference internal" href="#ftcli-users-export-archives"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">export_archives</span></code></a></li>
<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> <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> </ul>
</li> </li>
@ -174,13 +176,6 @@ Commands:
</div> </div>
<section id="database"> <section id="database">
<h2>Database<a class="headerlink" href="#database" title="Permalink to this heading"></a></h2> <h2>Database<a class="headerlink" href="#database" title="Permalink to this heading"></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 heading"></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"> <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 heading"></a></h3> <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 heading"></a></h3>
<div class="versionadded"> <div class="versionadded">
@ -188,6 +183,13 @@ Commands:
</div> </div>
<p>Empty database and delete uploaded files, only on development environments.</p> <p>Empty database and delete uploaded files, only on development environments.</p>
</section> </section>
<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 heading"></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> </section>
<section id="oauth2"> <section id="oauth2">
<h2>OAuth2<a class="headerlink" href="#oauth2" title="Permalink to this heading"></a></h2> <h2>OAuth2<a class="headerlink" href="#oauth2" title="Permalink to this heading"></a></h2>
@ -217,6 +219,29 @@ Commands:
</section> </section>
<section id="users"> <section id="users">
<h2>Users<a class="headerlink" href="#users" title="Permalink to this heading"></a></h2> <h2>Users<a class="headerlink" href="#users" title="Permalink to this heading"></a></h2>
<section id="ftcli-users-clean-archives">
<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">clean_archives</span></code><a class="headerlink" href="#ftcli-users-clean-archives" title="Permalink to this heading"></a></h3>
<div class="versionadded">
<p><span class="versionmodified added">New in version 0.7.13.</span></p>
</div>
<p>Delete export requests and related archives created more than provided number of days.</p>
<table class="table-bordered docutils align-default">
<colgroup>
<col style="width: 33.3%" />
<col style="width: 66.7%" />
</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">--days</span></code></p></td>
<td><p>Number of days.</p></td>
</tr>
</tbody>
</table>
</section>
<section id="ftcli-users-clean-tokens"> <section id="ftcli-users-clean-tokens">
<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">clean_tokens</span></code><a class="headerlink" href="#ftcli-users-clean-tokens" title="Permalink to this heading"></a></h3> <h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">clean_tokens</span></code><a class="headerlink" href="#ftcli-users-clean-tokens" title="Permalink to this heading"></a></h3>
<div class="versionadded"> <div class="versionadded">
@ -240,6 +265,30 @@ Commands:
</tbody> </tbody>
</table> </table>
</section> </section>
<section id="ftcli-users-export-archives">
<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">export_archives</span></code><a class="headerlink" href="#ftcli-users-export-archives" title="Permalink to this heading"></a></h3>
<div class="versionadded">
<p><span class="versionmodified added">New in version 0.7.13.</span></p>
</div>
<p>Process incomplete user export requests.
Can be used if redis is not set (no dramatiq workers running).</p>
<table class="table-bordered docutils align-default">
<colgroup>
<col style="width: 33.3%" />
<col style="width: 66.7%" />
</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">--max</span></code></p></td>
<td><p>Maximum number of export requests to process.</p></td>
</tr>
</tbody>
</table>
</section>
<section id="ftcli-users-update"> <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 heading"></a></h3> <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 heading"></a></h3>
<div class="versionadded"> <div class="versionadded">
@ -288,7 +337,7 @@ Commands:
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Features &#8212; FitTrackee 0.7.12 <title>Features &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -85,7 +85,12 @@
<li><a class="reference internal" href="#">Features</a><ul> <li><a class="reference internal" href="#">Features</a><ul>
<li><a class="reference internal" href="#workouts">Workouts</a></li> <li><a class="reference internal" href="#workouts">Workouts</a></li>
<li><a class="reference internal" href="#account-preferences">Account &amp; preferences</a></li> <li><a class="reference internal" href="#account-preferences">Account &amp; preferences</a></li>
<li><a class="reference internal" href="#administration">Administration</a></li> <li><a class="reference internal" href="#administration">Administration</a><ul>
<li><a class="reference internal" href="#application">Application</a></li>
<li><a class="reference internal" href="#users">Users</a></li>
<li><a class="reference internal" href="#sports">Sports</a></li>
</ul>
</li>
<li><a class="reference internal" href="#translations">Translations</a></li> <li><a class="reference internal" href="#translations">Translations</a></li>
<li><a class="reference internal" href="#screenshots">Screenshots</a><ul> <li><a class="reference internal" href="#screenshots">Screenshots</a><ul>
<li><a class="reference internal" href="#dashboard">Dashboard</a></li> <li><a class="reference internal" href="#dashboard">Dashboard</a></li>
@ -253,9 +258,10 @@
<h2>Account &amp; preferences<a class="headerlink" href="#account-preferences" title="Permalink to this heading"></a></h2> <h2>Account &amp; preferences<a class="headerlink" href="#account-preferences" title="Permalink to this heading"></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>The user must agree to the privacy policy to register. If a more recent policy is available, a message is displayed on the dashboard to review the new version (<em>new in 0.7.13</em>).</p></li>
<li><p>On registration, the user account is created with selected language in dropdown as user preference (<em>new in 0.6.9</em>).</p></li> <li><p>On registration, the user account is created with selected language in dropdown as user preference (<em>new in 0.6.9</em>).</p></li>
<li><p>After registration, the user account is inactive and an email with confirmation instructions is sent to activate it. <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> 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>
@ -286,18 +292,28 @@ A user with an inactive account cannot log in. (<em>new in 0.6.0</em>)</p></li>
<div class="line">A workout with a disabled sport will still be displayed in the application.</div> <div class="line">A workout with a disabled sport will still be displayed in the application.</div>
</div> </div>
</div> </div>
<ul class="simple"> <ul>
<li><p>A user can create <a class="reference external" href="apps.html">clients</a> for third-party applications (<em>new in 0.7.0</em>).</p></li> <li><p>A user can create <a class="reference external" href="apps.html">clients</a> for third-party applications (<em>new in 0.7.0</em>).</p></li>
<li><div class="line-block">
<div class="line">A user can request a data export (<em>new in 0.7.13</em>).</div>
<div class="line">It generates a zip archive containing 2 <code class="docutils literal notranslate"><span class="pre">json</span></code> files (user info and workouts data) and all uploaded gpx files.</div>
</div>
</li>
</ul> </ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>For now, its not possible to import these files into another <strong>FitTrackee</strong> instance.</p>
</div>
</section> </section>
<section id="administration"> <section id="administration">
<h2>Administration<a class="headerlink" href="#administration" title="Permalink to this heading"></a></h2> <h2>Administration<a class="headerlink" href="#administration" title="Permalink to this heading"></a></h2>
<p>(<em>new in 0.3.0</em>)</p> <p>(<em>new in 0.3.0</em>)</p>
<ul> <section id="application">
<li><p><strong>Application</strong></p> <h3>Application<a class="headerlink" href="#application" title="Permalink to this heading"></a></h3>
<p><strong>Configuration</strong></p>
<p>The following parameters can be set:</p> <p>The following parameters can be set:</p>
<ul class="simple"> <ul class="simple">
<li><p>active users limit. If 0, registration is enabled (no limit defined)</p></li> <li><p>active users limit. If 0, registration is enabled (no limit defined).</p></li>
<li><p>maximum size of gpx file (individually uploaded or in a zip archive) (<em>changed in 0.7.4</em>)</p></li> <li><p>maximum size of gpx file (individually uploaded or in a zip archive) (<em>changed in 0.7.4</em>)</p></li>
<li><p>maximum size of zip archive</p></li> <li><p>maximum size of zip archive</p></li>
<li><p>maximum number of files in the zip archive (<em>changed in 0.7.4</em>)</p></li> <li><p>maximum number of files in the zip archive (<em>changed in 0.7.4</em>)</p></li>
@ -311,29 +327,44 @@ A user with an inactive account cannot log in. (<em>new in 0.6.0</em>)</p></li>
<p class="admonition-title">Note</p> <p class="admonition-title">Note</p>
<p>If email sending is disabled, a warning is displayed.</p> <p>If email sending is disabled, a warning is displayed.</p>
</div> </div>
</li> <p><strong>About</strong></p>
<li><p><strong>Users</strong></p> <p>(<em>new in 0.7.13</em>)</p>
<div class="line-block">
<div class="line">It is possible displayed additional information that may be useful to users in <strong>About</strong> page.</div>
<div class="line">Markdown syntax can be used.</div>
</div>
<p><strong>Privacy policy</strong></p>
<p>(<em>new in 0.7.13</em>)</p>
<div class="line-block">
<div class="line">A default privacy policy is available (originally adapted from the <a class="reference external" href="https://github.com/discourse/discourse">Discourse</a> privacy policy).</div>
<div class="line">A custom privacy policy can set if needed (Markdown syntax can be used). A policy update will display a message on users dashboard to review it.</div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Only the default privacy policy is translated (if the translation is available).</p>
</div>
</section>
<section id="users">
<h3>Users<a class="headerlink" href="#users" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>display and filter users list</p></li> <li><p>display and filter users list</p></li>
<li><dl class="simple"> <li><p>edit a user to:</p>
<dt>edit a user to:</dt><dd><ul> <ul>
<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>). If email sending is disabled, it is only possible via CLI.</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>
</dl>
</li> </li>
<li><p>delete a user</p></li> <li><p>delete a user</p></li>
</ul> </ul>
</li> </section>
<li><p><strong>Sports</strong></p> <section id="sports">
<h3>Sports<a class="headerlink" href="#sports" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>enable or disable a sport (a sport can be disabled even if workout with this sport exists)</p></li> <li><p>enable or disable a sport (a sport can be disabled even if workout with this sport exists)</p></li>
</ul> </ul>
</li> </section>
</ul>
</section> </section>
<section id="translations"> <section id="translations">
<h2>Translations<a class="headerlink" href="#translations" title="Permalink to this heading"></a></h2> <h2>Translations<a class="headerlink" href="#translations" title="Permalink to this heading"></a></h2>
@ -400,7 +431,7 @@ A user with an inactive account cannot log in. (<em>new in 0.6.0</em>)</p></li>
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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 &#8212; FitTrackee 0.7.12 <title>Index &#8212; FitTrackee 0.7.13
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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -190,7 +190,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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 &#8212; FitTrackee 0.7.12 <title>HTTP Routing Table &#8212; FitTrackee 0.7.13
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" />
@ -47,7 +47,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -130,6 +130,16 @@
<tr class="pcap"><td></td><td>&#160;</td><td></td></tr> <tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
<tr class="cap" id="cap-/api"><td></td><td> <tr class="cap" id="cap-/api"><td></td><td>
<strong>/api</strong></td><td></td></tr> <strong>/api</strong></td><td></td></tr>
<tr>
<td></td>
<td>
<a href="api/auth.html#get--api-auth-account-export"><code class="xref">GET /api/auth/account/export</code></a></td><td>
<em></em></td></tr>
<tr>
<td></td>
<td>
<a href="api/auth.html#get--api-auth-account-export-(string-file_name)"><code class="xref">GET /api/auth/account/export/(string:file_name)</code></a></td><td>
<em></em></td></tr>
<tr> <tr>
<td></td> <td></td>
<td> <td>
@ -255,6 +265,16 @@
<td> <td>
<a href="api/auth.html#post--api-auth-account-confirm"><code class="xref">POST /api/auth/account/confirm</code></a></td><td> <a href="api/auth.html#post--api-auth-account-confirm"><code class="xref">POST /api/auth/account/confirm</code></a></td><td>
<em></em></td></tr> <em></em></td></tr>
<tr>
<td></td>
<td>
<a href="api/auth.html#post--api-auth-account-export-request"><code class="xref">POST /api/auth/account/export/request</code></a></td><td>
<em></em></td></tr>
<tr>
<td></td>
<td>
<a href="api/auth.html#post--api-auth-account-privacy-policy"><code class="xref">POST /api/auth/account/privacy-policy</code></a></td><td>
<em></em></td></tr>
<tr> <tr>
<td></td> <td></td>
<td> <td>
@ -410,7 +430,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>FitTrackee &#8212; FitTrackee 0.7.12 <title>FitTrackee &#8212; FitTrackee 0.7.13
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" />
@ -42,7 +42,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -180,7 +180,7 @@ Map</a>.</div>
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Installation &#8212; FitTrackee 0.7.12 <title>Installation &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -208,7 +208,7 @@
</li> </li>
<li><dl class="simple"> <li><dl class="simple">
<dt>optional</dt><dd><ul> <dt>optional</dt><dd><ul>
<li><p>Redis for task queue (if email sending is enabled) and API rate limits</p></li> <li><p>Redis for task queue (if email sending is enabled and for data export requests) and API rate limits</p></li>
<li><p>SMTP provider (if email sending is enabled)</p></li> <li><p>SMTP provider (if email sending is enabled)</p></li>
<li><p>API key from a <a class="reference external" href="installation.html#weather-data">weather data provider</a></p></li> <li><p>API key from a <a class="reference external" href="installation.html#weather-data">weather data provider</a></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>
@ -222,6 +222,12 @@
<div class="admonition note"> <div class="admonition note">
<p class="admonition-title">Note</p> <p class="admonition-title">Note</p>
<div class="line-block"> <div class="line-block">
<div class="line">If registration is enabled, it is recommended to set Redis and a SMTP provider for email sending and data export requests.</div>
</div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<div class="line-block">
<div class="line">The following steps describe an installation on Linux systems (tested <div class="line">The following steps describe an installation on Linux systems (tested
on Debian and Arch).</div> on Debian and Arch).</div>
<div class="line">On other OS, some issues can be encountered and adaptations may be <div class="line">On other OS, some issues can be encountered and adaptations may be
@ -574,14 +580,13 @@ see <a class="reference external" href="https://docs.sqlalchemy.org/en/13/core/p
<li><p>password reset request</p></li> <li><p>password reset request</p></li>
<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>
<li><p>notification when a data export archive is ready to download (<em>new in 0.7.13</em>)</p></li>
</ul> </ul>
<div class="versionchanged"> <div class="versionchanged">
<p><span class="versionmodified changed">Changed in version 0.6.5.</span></p> <p><span class="versionmodified changed">Changed in version 0.6.5.</span></p>
</div> </div>
<div class="line-block"> <p>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).</p>
<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> <p>A <a class="reference external" href="cli.html#ftcli-users-update">CLI</a> is available to activate account, modify email and password and handle data export requests.</p>
<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 heading"></a></h3> <h3>Map tile server<a class="headerlink" href="#map-tile-server" title="Permalink to this heading"></a></h3>
@ -598,7 +603,7 @@ The tile server can be changed by updating <code class="docutils literal notrans
<div class="admonition note"> <div class="admonition note">
<p class="admonition-title">Note</p> <p class="admonition-title">Note</p>
<div class="line-block"> <div class="line-block">
<div class="line">Check the terms of service of tile provider for map attribution</div> <div class="line">Check the terms of service of tile provider for map attribution.</div>
</div> </div>
</div> </div>
<div class="versionchanged"> <div class="versionchanged">
@ -821,11 +826,11 @@ $<span class="w"> </span>make<span class="w"> </span>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.7.12):</p></li> <li><p>Download the last release (for now, it is the release v0.7.13):</p></li>
</ul> </ul>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>wget<span class="w"> </span>https://github.com/SamR1/FitTrackee/archive/v0.7.12.tar.gz <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>wget<span class="w"> </span>https://github.com/SamR1/FitTrackee/archive/v0.7.13.tar.gz
$<span class="w"> </span>tar<span class="w"> </span>-xzf<span class="w"> </span>v0.7.12.tar.gz $<span class="w"> </span>tar<span class="w"> </span>-xzf<span class="w"> </span>v0.7.13.tar.gz
$<span class="w"> </span>mv<span class="w"> </span>FitTrackee-0.7.12<span class="w"> </span>FitTrackee $<span class="w"> </span>mv<span class="w"> </span>FitTrackee-0.7.13<span class="w"> </span>FitTrackee
$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>FitTrackee $<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>FitTrackee
</pre></div> </pre></div>
</div> </div>
@ -945,11 +950,11 @@ $<span class="w"> </span><span class="nb">source</span><span class="w"> </span>.
<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.7.12) and overwrite existing files:</p></li> <li><p>Download the last release (for now, it is the release v0.7.13) and overwrite existing files:</p></li>
</ul> </ul>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>wget<span class="w"> </span>https://github.com/SamR1/FitTrackee/archive/v0.7.12.tar.gz <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>wget<span class="w"> </span>https://github.com/SamR1/FitTrackee/archive/v0.7.13.tar.gz
$<span class="w"> </span>tar<span class="w"> </span>-xzf<span class="w"> </span>v0.7.12.tar.gz $<span class="w"> </span>tar<span class="w"> </span>-xzf<span class="w"> </span>v0.7.13.tar.gz
$<span class="w"> </span>cp<span class="w"> </span>-R<span class="w"> </span>FitTrackee-0.7.12/*<span class="w"> </span>FitTrackee/ $<span class="w"> </span>cp<span class="w"> </span>-R<span class="w"> </span>FitTrackee-0.7.13/*<span class="w"> </span>FitTrackee/
$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>FitTrackee $<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>FitTrackee
</pre></div> </pre></div>
</div> </div>
@ -1208,7 +1213,7 @@ $<span class="w"> </span>make<span class="w"> </span>docker-test-python<span cla
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

Binary file not shown.

View File

@ -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 &#8212; FitTrackee 0.7.12 <title>Search &#8212; FitTrackee 0.7.13
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" />
@ -47,7 +47,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -154,7 +154,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

File diff suppressed because one or more lines are too long

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Administrator &#8212; FitTrackee 0.7.12 <title>Administrator &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -174,7 +174,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Troubleshooting &#8212; FitTrackee 0.7.12 <title>Troubleshooting &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -157,7 +157,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

View File

@ -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.19: https://docutils.sourceforge.io/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>User &#8212; FitTrackee 0.7.12 <title>User &#8212; FitTrackee 0.7.13
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" />
@ -43,7 +43,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.7.12 <span class="navbar-text navbar-version pull-left"><b>0.7.13
</b></span> </b></span>
</div> </div>
@ -148,7 +148,7 @@
</p> </p>
<p> <p>
&copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>. &copy; Copyright 2018 - 2022, SamR1 <a rel="me" href="https://fosstodon.org/@FitTrackee"><i class="fa fa-mastodon" aria-hidden="true"></i></a>.
Last updated on Feb 20, 2023.<br/> Last updated on Mar 05, 2023.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/> Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.3.0.<br/>
</p> </p>
</div> </div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 566 KiB

After

Width:  |  Height:  |  Size: 568 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 386 KiB

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -1,5 +1,5 @@
Authentication Authentication and account
############## ##########################
.. autoflask:: fittrackee:create_app() .. autoflask:: fittrackee:create_app()
:endpoints: :endpoints:
@ -18,4 +18,8 @@ Authentication
auth.update_user_account, auth.update_user_account,
auth.update_password, auth.update_password,
auth.update_email, auth.update_email,
auth.logout_user auth.logout_user,
auth.accept_privacy_policy,
auth.get_user_data_export,
auth.request_user_data_export,
auth.download_data_export

View File

@ -28,13 +28,6 @@ A command line interface (CLI) is available to manage database, OAuth2 tokens an
Database Database
~~~~~~~~ ~~~~~~~~
``ftcli db upgrade``
""""""""""""""""""""
.. versionadded:: 0.6.5
Apply migrations.
``ftcli db drop`` ``ftcli db drop``
""""""""""""""""" """""""""""""""""
.. versionadded:: 0.6.5 .. versionadded:: 0.6.5
@ -42,6 +35,13 @@ Apply migrations.
Empty database and delete uploaded files, only on development environments. Empty database and delete uploaded files, only on development environments.
``ftcli db upgrade``
""""""""""""""""""""
.. versionadded:: 0.6.5
Apply migrations.
OAuth2 OAuth2
~~~~~~ ~~~~~~
@ -66,6 +66,23 @@ Remove tokens expired for more than provided number of days
Users Users
~~~~~ ~~~~~
``ftcli users clean_archives``
""""""""""""""""""""""""""""""
.. versionadded:: 0.7.13
Delete export requests and related archives created more than provided number of days.
.. cssclass:: table-bordered
.. list-table::
:widths: 25 50
:header-rows: 1
* - Options
- Description
* - ``--days``
- Number of days.
``ftcli users clean_tokens`` ``ftcli users clean_tokens``
"""""""""""""""""""""""""""" """"""""""""""""""""""""""""
.. versionadded:: 0.7.0 .. versionadded:: 0.7.0
@ -83,6 +100,24 @@ Remove blacklisted tokens expired for more than provided number of days.
- Number of days. - Number of days.
``ftcli users export_archives``
"""""""""""""""""""""""""""""""
.. versionadded:: 0.7.13
Process incomplete user export requests.
Can be used if redis is not set (no dramatiq workers running).
.. cssclass:: table-bordered
.. list-table::
:widths: 25 50
:header-rows: 1
* - Options
- Description
* - ``--max``
- Maximum number of export requests to process.
``ftcli users update`` ``ftcli users update``
"""""""""""""""""""""" """"""""""""""""""""""
.. versionadded:: 0.6.5 .. versionadded:: 0.6.5

View File

@ -74,9 +74,10 @@ Workouts
Account & preferences Account & preferences
^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
- A user can create, update and deleted his account. - A user can create, update and deleted his account.
- The user must agree to the privacy policy to register. If a more recent policy is available, a message is displayed on the dashboard to review the new version (*new in 0.7.13*).
- On registration, the user account is created with selected language in dropdown as user preference (*new in 0.6.9*). - On registration, the user account is created with selected language in dropdown as user preference (*new in 0.6.9*).
- After registration, the user account is inactive and an email with confirmation instructions is sent to activate it. - 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*) A user with an inactive account cannot log in. (*new in 0.6.0*).
.. note:: .. note::
In case email sending is not configured, a `command line <cli.html#ftcli-users-update>`__ allows to activate users account. In case email sending is not configured, a `command line <cli.html#ftcli-users-update>`__ allows to activate users account.
@ -98,17 +99,25 @@ Account & preferences
| A workout with a disabled sport will still be displayed in the application. | A workout with a disabled sport will still be displayed in the application.
- A user can create `clients <apps.html>`__ for third-party applications (*new in 0.7.0*). - A user can create `clients <apps.html>`__ for third-party applications (*new in 0.7.0*).
- | A user can request a data export (*new in 0.7.13*).
| It generates a zip archive containing 2 ``json`` files (user info and workouts data) and all uploaded gpx files.
.. note::
For now, it's not possible to import these files into another **FitTrackee** instance.
Administration Administration
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
(*new in 0.3.0*) (*new in 0.3.0*)
- **Application** Application
"""""""""""
**Configuration**
The following parameters can be set: The following parameters can be set:
- active users limit. If 0, registration is enabled (no limit defined) - active users limit. If 0, registration is enabled (no limit defined).
- maximum size of gpx file (individually uploaded or in a zip archive) (*changed in 0.7.4*) - maximum size of gpx file (individually uploaded or in a zip archive) (*changed in 0.7.4*)
- maximum size of zip archive - maximum size of zip archive
- maximum number of files in the zip archive (*changed in 0.7.4*) - maximum number of files in the zip archive (*changed in 0.7.4*)
@ -120,19 +129,39 @@ Administration
.. note:: .. note::
If email sending is disabled, a warning is displayed. If email sending is disabled, a warning is displayed.
**About**
- **Users** (*new in 0.7.13*)
| It is possible displayed additional information that may be useful to users in **About** page.
| Markdown syntax can be used.
**Privacy policy**
(*new in 0.7.13*)
| A default privacy policy is available (originally adapted from the `Discourse <https://github.com/discourse/discourse>`__ privacy policy).
| A custom privacy policy can set if needed (Markdown syntax can be used). A policy update will display a message on users dashboard to review it.
.. note::
Only the default privacy policy is translated (if the translation is available).
Users
"""""
- display and filter users list - display and filter users list
- edit a user to: - edit a user to:
- 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*). If email sending is disabled, it is only possible via CLI. - 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
""""""
- enable or disable a sport (a sport can be disabled even if workout with this sport exists) - enable or disable a sport (a sport can be disabled even if workout with this sport exists)

View File

@ -26,13 +26,16 @@ Prerequisites
- Python 3.7+ - Python 3.7+
- PostgreSQL 11+ - PostgreSQL 11+
- optional - optional
- Redis for task queue (if email sending is enabled) and API rate limits - Redis for task queue (if email sending is enabled and for data export requests) and API rate limits
- SMTP provider (if email sending is enabled) - SMTP provider (if email sending is enabled)
- API key from a `weather data provider <installation.html#weather-data>`__ - API key from a `weather data provider <installation.html#weather-data>`__
- `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)
.. note::
| If registration is enabled, it is recommended to set Redis and a SMTP provider for email sending and data export requests.
.. note:: .. note::
| The following steps describe an installation on Linux systems (tested | The following steps describe an installation on Linux systems (tested
on Debian and Arch). on Debian and Arch).
@ -273,11 +276,13 @@ Emails sent by FitTrackee are:
- password reset request - password reset request
- email change (to old and new email adresses) - email change (to old and new email adresses)
- password change - password change
- notification when a data export archive is ready to download (*new in 0.7.13*)
.. versionchanged:: 0.6.5 .. 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). 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.
A `CLI <cli.html#ftcli-users-update>`__ is available to activate account, modify email and password and handle data export requests.
Map tile server Map tile server
@ -293,7 +298,7 @@ To keep using **ThunderForest Outdoors**, the configuration is:
- ``MAP_ATTRIBUTION=&copy; <a href="http://www.thunderforest.com/">Thunderforest</a>, &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors`` - ``MAP_ATTRIBUTION=&copy; <a href="http://www.thunderforest.com/">Thunderforest</a>, &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors``
.. note:: .. note::
| Check the terms of service of tile provider for map attribution | Check the terms of service of tile provider for map attribution.
.. versionchanged:: 0.6.10 .. versionchanged:: 0.6.10
@ -502,13 +507,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.7.12): - Download the last release (for now, it is the release v0.7.13):
.. code:: bash .. code:: bash
$ wget https://github.com/SamR1/FitTrackee/archive/v0.7.12.tar.gz $ wget https://github.com/SamR1/FitTrackee/archive/v0.7.13.tar.gz
$ tar -xzf v0.7.12.tar.gz $ tar -xzf v0.7.13.tar.gz
$ mv FitTrackee-0.7.12 FitTrackee $ mv FitTrackee-0.7.13 FitTrackee
$ cd FitTrackee $ cd FitTrackee
- Create **.env** from example and update it - Create **.env** from example and update it
@ -628,13 +633,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.7.12) and overwrite existing files: - Download the last release (for now, it is the release v0.7.13) and overwrite existing files:
.. code:: bash .. code:: bash
$ wget https://github.com/SamR1/FitTrackee/archive/v0.7.12.tar.gz $ wget https://github.com/SamR1/FitTrackee/archive/v0.7.13.tar.gz
$ tar -xzf v0.7.12.tar.gz $ tar -xzf v0.7.13.tar.gz
$ cp -R FitTrackee-0.7.12/* FitTrackee/ $ cp -R FitTrackee-0.7.13/* 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>`__).

View File

@ -16,13 +16,15 @@ class TestRegistration:
selenium.implicitly_wait(1) selenium.implicitly_wait(1)
inputs = selenium.find_elements(By.TAG_NAME, 'input') inputs = selenium.find_elements(By.TAG_NAME, 'input')
assert len(inputs) == 4 assert len(inputs) == 5
assert inputs[0].get_attribute('id') == 'username' assert inputs[0].get_attribute('id') == 'username'
assert inputs[0].get_attribute('type') == 'text' assert inputs[0].get_attribute('type') == 'text'
assert inputs[1].get_attribute('id') == 'email' assert inputs[1].get_attribute('id') == 'email'
assert inputs[1].get_attribute('type') == 'email' assert inputs[1].get_attribute('type') == 'email'
assert inputs[2].get_attribute('id') == 'password' assert inputs[2].get_attribute('id') == 'password'
assert inputs[2].get_attribute('type') == 'password' assert inputs[2].get_attribute('type') == 'password'
assert inputs[4].get_attribute('id') == 'accepted_policy'
assert inputs[4].get_attribute('type') == 'checkbox'
form_infos = selenium.find_elements(By.CLASS_NAME, 'form-info') form_infos = selenium.find_elements(By.CLASS_NAME, 'form-info')
assert len(form_infos) == 3 assert len(form_infos) == 3

View File

@ -32,6 +32,8 @@ def register(selenium, user):
email.send_keys(user.get('email')) email.send_keys(user.get('email'))
password = selenium.find_element(By.ID, 'password') password = selenium.find_element(By.ID, 'password')
password.send_keys(user.get('password')) password.send_keys(user.get('password'))
accepted_policy = selenium.find_element(By.ID, 'accepted_policy')
accepted_policy.click()
submit_button = selenium.find_element(By.TAG_NAME, 'button') submit_button = selenium.find_element(By.TAG_NAME, 'button')
submit_button.click() submit_button.click()

View File

@ -25,7 +25,7 @@ from werkzeug.middleware.proxy_fix import ProxyFix
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.7.12' VERSION = __version__ = '0.7.13'
REDIS_URL = os.getenv('REDIS_URL', 'redis://') REDIS_URL = os.getenv('REDIS_URL', 'redis://')
API_RATE_LIMITS = os.environ.get('API_RATE_LIMITS', '300 per 5 minutes').split( API_RATE_LIMITS = os.environ.get('API_RATE_LIMITS', '300 per 5 minutes').split(
',' ','

View File

@ -1,3 +1,4 @@
from datetime import datetime
from typing import Dict, Union from typing import Dict, Union
from flask import Blueprint, current_app, request from flask import Blueprint, current_app, request
@ -40,6 +41,7 @@ def get_application_config() -> Union[Dict, HttpResponse]:
{ {
"data": { "data": {
"about": null,
"admin_contact": "admin@example.com", "admin_contact": "admin@example.com",
"gpx_limit_import": 10, "gpx_limit_import": 10,
"is_email_sending_enabled": true, "is_email_sending_enabled": true,
@ -48,7 +50,9 @@ def get_application_config() -> Union[Dict, HttpResponse]:
"max_users": 0, "max_users": 0,
"max_zip_file_size": 10485760, "max_zip_file_size": 10485760,
"map_attribution": "&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors", "map_attribution": "&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors",
"version": "0.7.12", "privacy_policy": null,
"privacy_policy_date": null,
"version": "0.7.13",
"weather_provider": null "weather_provider": null
}, },
"status": "success" "status": "success"
@ -93,6 +97,7 @@ def update_application_config(auth_user: User) -> Union[Dict, HttpResponse]:
{ {
"data": { "data": {
"about": null,
"admin_contact": "admin@example.com", "admin_contact": "admin@example.com",
"gpx_limit_import": 10, "gpx_limit_import": 10,
"is_email_sending_enabled": true, "is_email_sending_enabled": true,
@ -101,18 +106,22 @@ def update_application_config(auth_user: User) -> Union[Dict, HttpResponse]:
"max_users": 10, "max_users": 10,
"max_zip_file_size": 10485760, "max_zip_file_size": 10485760,
"map_attribution": "&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors", "map_attribution": "&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors",
"version": "0.7.12", "privacy_policy": null,
"privacy_policy_date": null,
"version": "0.7.13",
"weather_provider": null "weather_provider": null
}, },
"status": "success" "status": "success"
} }
:<json string about: instance information
:<json string admin_contact: email to contact the administrator :<json string admin_contact: email to contact the administrator
:<json integer gpx_limit_import: max number of files in zip archive :<json integer gpx_limit_import: max number of files in zip archive
:<json boolean is_registration_enabled: is registration enabled? :<json boolean is_registration_enabled: is registration enabled?
:<json integer max_single_file_size: max size of a single file :<json integer max_single_file_size: max size of a single file
:<json integer max_users: max users allowed to register on instance :<json integer max_users: max users allowed to register on instance
:<json integer max_zip_file_size: max size of a zip archive :<json integer max_zip_file_size: max size of a zip archive
:<json string privacy_policy: instance privacy policy
:reqheader Authorization: OAuth 2.0 Bearer Token :reqheader Authorization: OAuth 2.0 Bearer Token
@ -151,6 +160,16 @@ def update_application_config(auth_user: User) -> Union[Dict, HttpResponse]:
config.max_users = config_data.get('max_users') config.max_users = config_data.get('max_users')
if 'admin_contact' in config_data: if 'admin_contact' in config_data:
config.admin_contact = admin_contact if admin_contact else None config.admin_contact = admin_contact if admin_contact else None
if 'about' in config_data:
config.about = (
config_data.get('about') if config_data.get('about') else None
)
if 'privacy_policy' in config_data:
privacy_policy = config_data.get('privacy_policy')
config.privacy_policy = privacy_policy if privacy_policy else None
config.privacy_policy_date = (
datetime.utcnow() if privacy_policy else None
)
if config.max_zip_file_size < config.max_single_file_size: if config.max_zip_file_size < config.max_single_file_size:
return InvalidPayloadErrorResponse( return InvalidPayloadErrorResponse(

View File

@ -25,6 +25,9 @@ class AppConfig(BaseModel):
) )
max_zip_file_size = db.Column(db.Integer, default=10485760, nullable=False) max_zip_file_size = db.Column(db.Integer, default=10485760, nullable=False)
admin_contact = db.Column(db.String(255), nullable=True) admin_contact = db.Column(db.String(255), nullable=True)
privacy_policy_date = db.Column(db.DateTime, nullable=True)
privacy_policy = db.Column(db.Text, nullable=True)
about = db.Column(db.Text, nullable=True)
@property @property
def is_registration_enabled(self) -> bool: def is_registration_enabled(self) -> bool:
@ -46,6 +49,7 @@ class AppConfig(BaseModel):
def serialize(self) -> Dict: def serialize(self) -> Dict:
weather_provider = os.getenv('WEATHER_API_PROVIDER', '').lower() weather_provider = os.getenv('WEATHER_API_PROVIDER', '').lower()
return { return {
'about': self.about,
'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_email_sending_enabled': current_app.config['CAN_SEND_EMAILS'],
@ -54,6 +58,8 @@ class AppConfig(BaseModel):
'max_zip_file_size': self.max_zip_file_size, 'max_zip_file_size': self.max_zip_file_size,
'max_users': self.max_users, 'max_users': self.max_users,
'map_attribution': self.map_attribution, 'map_attribution': self.map_attribution,
'privacy_policy': self.privacy_policy,
'privacy_policy_date': self.privacy_policy_date,
'version': VERSION, 'version': VERSION,
'weather_provider': ( 'weather_provider': (
weather_provider weather_provider

View File

@ -35,6 +35,7 @@ def update_app_config_from_database(
current_app.config[ current_app.config[
'is_registration_enabled' 'is_registration_enabled'
] = db_config.is_registration_enabled ] = db_config.is_registration_enabled
current_app.config['privacy_policy_date'] = db_config.privacy_policy_date
def verify_app_config(config_data: Dict) -> List: def verify_app_config(config_data: Dict) -> List:

View File

@ -1,14 +1,16 @@
import os import os
from typing import Type, Union
from dramatiq.brokers.redis import RedisBroker from dramatiq.brokers.redis import RedisBroker
from dramatiq.brokers.stub import StubBroker from dramatiq.brokers.stub import StubBroker
from flask import current_app from flask import current_app
from sqlalchemy.pool import NullPool from sqlalchemy.pool import NullPool
if os.getenv('APP_SETTINGS') == 'fittrackee.config.TestingConfig': broker: Union[Type['RedisBroker'], Type['StubBroker']] = (
broker = StubBroker StubBroker
else: if os.getenv("APP_SETTINGS") == "fittrackee.config.TestingConfig"
broker = RedisBroker else RedisBroker
)
XDIST_WORKER = ( XDIST_WORKER = (
f"_{os.getenv('PYTEST_XDIST_WORKER')}" f"_{os.getenv('PYTEST_XDIST_WORKER')}"
@ -67,6 +69,7 @@ class BaseConfig:
'authorization_code': 864000, # 10 days 'authorization_code': 864000, # 10 days
} }
OAUTH2_REFRESH_TOKEN_GENERATOR = True OAUTH2_REFRESH_TOKEN_GENERATOR = True
DATA_EXPORT_EXPIRATION = 24 # hours
class DevelopmentConfig(BaseConfig): class DevelopmentConfig(BaseConfig):

View File

@ -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.77cd7298.js"></script><script defer="defer" src="/static/js/app.f7fbef48.js"></script><link href="/static/css/app.e2dfa8b7.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.504d6d07.js"></script><script defer="defer" src="/static/js/app.4a1985d7.js"></script><link href="/static/css/app.e504ceb2.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>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -51,3 +51,13 @@ def account_confirmation_email(user: Dict, email_data: Dict) -> None:
recipient=user['email'], recipient=user['email'],
data=email_data, data=email_data,
) )
@dramatiq.actor(queue_name='fittrackee_emails')
def data_export_email(user: Dict, email_data: Dict) -> None:
email_service.send(
template='data_export_ready',
lang=user['language'],
recipient=user['email'],
data=email_data,
)

View File

@ -0,0 +1,26 @@
{% extends "layout.html" %}
{% block title %}{{ _('Your archive is ready to be downloaded') }}{% endblock %}
{% block preheader %}{{ _('A download link is available in your account.') }}{% endblock %}
{% block content %}<p>{{ _('You have requested an export of your account on FitTrackee.') }} {{ _('The archive is now ready to be downloaded from your account.') }}</p>
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
<tr>
<td align="center">
<a href="{{account_url}}" class="f-fallback button button--green" target="_blank">{{ _('Download your archive') }}</a>
</td>
</tr>
</table>
</td>
</tr>
</table>{% endblock %}
{% block not_initiated %}{{ _("If you did not request the export, please change your password immediately or contact your administrator if your account is locked.") }}{% endblock %}
{% block url_to_paste %}<table class="body-sub" role="presentation">
<tr>
<td>
<p class="f-fallback sub">{{ _("If you're having trouble with the button above, copy and paste the URL below into your web browser.") }}</p>
<p class="f-fallback sub">{{account_url}}</p>
</td>
</tr>
</table>{% endblock %}

View File

@ -0,0 +1,5 @@
{% extends "layout.txt" %}{% block content %}{{ _('You have requested an export of your account on FitTrackee.') }}
{{ _('The archive is now ready to be downloaded from your account.') }}
{{ _('Download your archive') }}: {{ account_url }}
{{ _('If you did not request the export, please change your password immediately or contact your administrator if your account is locked.') }}{% endblock %}

View File

@ -0,0 +1 @@
FitTrackee - {{ _('Your archive is ready to be downloaded') }}

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-03 07:58+0200\n" "POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2022-07-04 21:17+0000\n" "PO-Revision-Date: 2023-03-05 11:17+0000\n"
"Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n" "Last-Translator: qwerty287 <ndev@web.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/fittrackee/" "Language-Team: German <https://hosted.weblate.org/projects/fittrackee/"
"fittrackee-api-emails/de/>\n" "fittrackee-api-emails/de/>\n"
"Language: de\n" "Language: de\n"
@ -17,8 +17,8 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.13.1-dev\n" "X-Generator: Weblate 4.16.2-dev\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.11.0\n"
#: fittrackee/emails/templates/layout.html:215 #: fittrackee/emails/templates/layout.html:215
#: fittrackee/emails/templates/layout.txt:1 #: fittrackee/emails/templates/layout.txt:1
@ -66,8 +66,7 @@ msgstr "Du hast ein Konto bei FitTrackee angelegt."
#: fittrackee/emails/templates/account_confirmation/body.html:4 #: fittrackee/emails/templates/account_confirmation/body.html:4
msgid "Use the button below to confirm your address email." msgid "Use the button below to confirm your address email."
msgstr "" msgstr "Verwende die unteren Schaltfläche, um deine E-Mail-Adresse zu bestätigen."
"Verwende die unteren Schaltfläche, um deine E-Mail-Adresse zu bestätigen."
#: fittrackee/emails/templates/account_confirmation/body.html:11 #: fittrackee/emails/templates/account_confirmation/body.html:11
#: fittrackee/emails/templates/account_confirmation/body.txt:4 #: fittrackee/emails/templates/account_confirmation/body.txt:4
@ -86,6 +85,7 @@ msgstr ""
"E-Mail bitte." "E-Mail bitte."
#: fittrackee/emails/templates/account_confirmation/body.html:22 #: fittrackee/emails/templates/account_confirmation/body.html:22
#: fittrackee/emails/templates/data_export_ready/body.html:22
#: fittrackee/emails/templates/email_update_to_new_email/body.html:22 #: fittrackee/emails/templates/email_update_to_new_email/body.html:22
#: fittrackee/emails/templates/password_reset_request/body.html:24 #: fittrackee/emails/templates/password_reset_request/body.html:24
msgid "" msgid ""
@ -99,6 +99,39 @@ msgstr ""
msgid "Use the link below to confirm your address email." msgid "Use the link below to confirm your address email."
msgstr "Verwende den unteren Link, um deine E-Mail-Adresse zu bestätigen." msgstr "Verwende den unteren Link, um deine E-Mail-Adresse zu bestätigen."
#: fittrackee/emails/templates/data_export_ready/body.html:2
#: fittrackee/emails/templates/data_export_ready/subject.txt:1
msgid "Your archive is ready to be downloaded"
msgstr "Dein Archiv ist bereit zum Download"
#: fittrackee/emails/templates/data_export_ready/body.html:3
msgid "A download link is available in your account."
msgstr "Ein Download-Link ist auf deinem Account verfügbar."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:1
msgid "You have requested an export of your account on FitTrackee."
msgstr "Du hast eine Anfrage zum Export deines FitTrackee-Accounts gestellt."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:2
msgid "The archive is now ready to be downloaded from your account."
msgstr "Das Archiv kann jetzt von deinem Account heruntergeladen werden."
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr "Dein Archiv herunterladen"
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
msgid ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
msgstr ""
"Wenn du den Export nicht angefragt hast, ändere dein Passwort sofort oder "
"frage deinen Administrator, ob dein Account gesperrt ist."
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2 #: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1 #: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
msgid "Email changed" msgid "Email changed"
@ -114,8 +147,8 @@ msgid ""
"You recently requested to change your email address for your FitTrackee " "You recently requested to change your email address for your FitTrackee "
"account to:" "account to:"
msgstr "" msgstr ""
"Du hast kürzlich beantragt, die E-Mail-Adresse deines FitTrackee-Kontos zu " "Du hast kürzlich beantragt, die E-Mail-Adresse deines FitTrackee-Kontos "
"ändern. Neue Adresse:" "zu ändern. Neue Adresse:"
#: fittrackee/emails/templates/email_update_to_current_email/body.html:18 #: fittrackee/emails/templates/email_update_to_current_email/body.html:18
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:4 #: fittrackee/emails/templates/email_update_to_current_email/body.txt:4
@ -123,9 +156,9 @@ msgid ""
"If this email change wasn't initiated by you, please change your password" "If this email change wasn't initiated by you, please change your password"
" immediately or contact your administrator if your account is locked." " immediately or contact your administrator if your account is locked."
msgstr "" msgstr ""
"Falls die Änderung der E-Mail-Adresse nicht von Dir initiiert wurde, ändere " "Falls die Änderung der E-Mail-Adresse nicht von Dir initiiert wurde, "
"bitte sofort Dein Passwort oder kontaktiere den Administrator, falls dein " "ändere bitte sofort Dein Passwort oder kontaktiere den Administrator, "
"Konto gesperrt ist." "falls dein Konto gesperrt ist."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:2 #: fittrackee/emails/templates/email_update_to_new_email/body.html:2
#: fittrackee/emails/templates/email_update_to_new_email/subject.txt:1 #: fittrackee/emails/templates/email_update_to_new_email/subject.txt:1
@ -142,8 +175,8 @@ msgid ""
"You recently requested to change your email address for your FitTrackee " "You recently requested to change your email address for your FitTrackee "
"account." "account."
msgstr "" msgstr ""
"Du hast kürzlich beantragt, die E-Mail-Adresse deines FitTrackee-Kontos zu " "Du hast kürzlich beantragt, die E-Mail-Adresse deines FitTrackee-Kontos "
"ändern." "zu ändern."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:4 #: fittrackee/emails/templates/email_update_to_new_email/body.html:4
msgid "Use the button below to confirm this address." msgid "Use the button below to confirm this address."
@ -181,9 +214,9 @@ msgid ""
"password immediately or contact your administrator if your account is " "password immediately or contact your administrator if your account is "
"locked." "locked."
msgstr "" msgstr ""
"Falls die Änderung des Passworts nicht von dir initiiert wurde, ändere bitte " "Falls die Änderung des Passworts nicht von dir initiiert wurde, ändere "
"sofort dein Passwort oder kontaktiere den Administrator, falls dein Konto " "bitte sofort dein Passwort oder kontaktiere den Administrator, falls dein"
"gesperrt ist." " Konto gesperrt ist."
#: fittrackee/emails/templates/password_reset_request/body.html:2 #: fittrackee/emails/templates/password_reset_request/body.html:2
#: fittrackee/emails/templates/password_reset_request/subject.txt:1 #: fittrackee/emails/templates/password_reset_request/subject.txt:1
@ -196,8 +229,8 @@ msgid ""
"Use this link to reset your password. The link is only valid for " "Use this link to reset your password. The link is only valid for "
"%(expiration_delay)s." "%(expiration_delay)s."
msgstr "" msgstr ""
"Verwende den unteren Link, um dein Passwort zurückzusetzen. Der Link ist nur " "Verwende den unteren Link, um dein Passwort zurückzusetzen. Der Link ist "
"für %(expiration_delay)s gültig." "nur für %(expiration_delay)s gültig."
#: fittrackee/emails/templates/password_reset_request/body.html:4 #: fittrackee/emails/templates/password_reset_request/body.html:4
#: fittrackee/emails/templates/password_reset_request/body.txt:1 #: fittrackee/emails/templates/password_reset_request/body.txt:1

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-03 07:58+0200\n" "POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2022-07-02 18:25+0200\n" "PO-Revision-Date: 2022-07-02 18:25+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n" "Language: en\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.11.0\n"
#: fittrackee/emails/templates/layout.html:215 #: fittrackee/emails/templates/layout.html:215
#: fittrackee/emails/templates/layout.txt:1 #: fittrackee/emails/templates/layout.txt:1
@ -83,6 +83,7 @@ msgstr ""
"email." "email."
#: fittrackee/emails/templates/account_confirmation/body.html:22 #: fittrackee/emails/templates/account_confirmation/body.html:22
#: fittrackee/emails/templates/data_export_ready/body.html:22
#: fittrackee/emails/templates/email_update_to_new_email/body.html:22 #: fittrackee/emails/templates/email_update_to_new_email/body.html:22
#: fittrackee/emails/templates/password_reset_request/body.html:24 #: fittrackee/emails/templates/password_reset_request/body.html:24
msgid "" msgid ""
@ -96,6 +97,39 @@ msgstr ""
msgid "Use the link below to confirm your address email." msgid "Use the link below to confirm your address email."
msgstr "Use the link below to confirm your address email." msgstr "Use the link below to confirm your address email."
#: fittrackee/emails/templates/data_export_ready/body.html:2
#: fittrackee/emails/templates/data_export_ready/subject.txt:1
msgid "Your archive is ready to be downloaded"
msgstr "Your archive is ready to be downloaded"
#: fittrackee/emails/templates/data_export_ready/body.html:3
msgid "A download link is available in your account."
msgstr "A download link is available in your account."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:1
msgid "You have requested an export of your account on FitTrackee."
msgstr "You have requested an export of your account on FitTrackee."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:2
msgid "The archive is now ready to be downloaded from your account."
msgstr "The archive is now ready to be downloaded from your account."
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr "Download your archive"
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
msgid ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
msgstr ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2 #: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1 #: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
msgid "Email changed" msgid "Email changed"

View File

@ -7,18 +7,17 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-03 07:58+0200\n" "POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2022-07-04 21:17+0000\n" "PO-Revision-Date: 2022-07-04 21:17+0000\n"
"Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n" "Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n"
"Language-Team: French <https://hosted.weblate.org/projects/fittrackee/"
"fittrackee-api-emails/fr/>\n"
"Language: fr\n" "Language: fr\n"
"Language-Team: French <https://hosted.weblate.org/projects/fittrackee"
"/fittrackee-api-emails/fr/>\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Generated-By: Babel 2.11.0\n"
"X-Generator: Weblate 4.13.1-dev\n"
"Generated-By: Babel 2.10.3\n"
#: fittrackee/emails/templates/layout.html:215 #: fittrackee/emails/templates/layout.html:215
#: fittrackee/emails/templates/layout.txt:1 #: fittrackee/emails/templates/layout.txt:1
@ -85,6 +84,7 @@ msgstr ""
"ignorer ce courriel." "ignorer ce courriel."
#: fittrackee/emails/templates/account_confirmation/body.html:22 #: fittrackee/emails/templates/account_confirmation/body.html:22
#: fittrackee/emails/templates/data_export_ready/body.html:22
#: fittrackee/emails/templates/email_update_to_new_email/body.html:22 #: fittrackee/emails/templates/email_update_to_new_email/body.html:22
#: fittrackee/emails/templates/password_reset_request/body.html:24 #: fittrackee/emails/templates/password_reset_request/body.html:24
msgid "" msgid ""
@ -96,8 +96,41 @@ msgstr ""
#: fittrackee/emails/templates/account_confirmation/body.txt:2 #: fittrackee/emails/templates/account_confirmation/body.txt:2
msgid "Use the link below to confirm your address email." msgid "Use the link below to confirm your address email."
msgstr "Cliquez sur le lien ci-dessous pour confirmer votre adresse électronique."
#: fittrackee/emails/templates/data_export_ready/body.html:2
#: fittrackee/emails/templates/data_export_ready/subject.txt:1
msgid "Your archive is ready to be downloaded"
msgstr "Votre archive est prête à être téléchargée"
#: fittrackee/emails/templates/data_export_ready/body.html:3
msgid "A download link is available in your account."
msgstr "Un lien de téléchargement est disponible dans votre compte."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:1
msgid "You have requested an export of your account on FitTrackee."
msgstr "Vous avez demandé un export des données de votre compte sur FitTrackee."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:2
msgid "The archive is now ready to be downloaded from your account."
msgstr "L'archive est maintenant prête à être téléchargée depuis votre compte."
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr "Télécharger votre archive"
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
msgid ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
msgstr "" msgstr ""
"Cliquez sur le lien ci-dessous pour confirmer votre adresse électronique." "Si vous n'êtes pas à l'origine de cette demande, veuillez changer "
"votre mot de passe immédiatement ou contacter l'administrateur si votre "
"compte est bloqué."
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2 #: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1 #: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
@ -148,19 +181,19 @@ msgstr ""
#: fittrackee/emails/templates/email_update_to_new_email/body.html:4 #: fittrackee/emails/templates/email_update_to_new_email/body.html:4
msgid "Use the button below to confirm this address." msgid "Use the button below to confirm this address."
msgstr "" msgstr ""
"Cliquez sur le bouton ci-dessous pour confirmer cette adresse électronique." "Cliquez sur le bouton ci-dessous pour confirmer cette adresse "
"électronique."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:18 #: fittrackee/emails/templates/email_update_to_new_email/body.html:18
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:7 #: fittrackee/emails/templates/email_update_to_new_email/body.txt:7
msgid "If this email change wasn't initiated by you, please ignore this email." msgid "If this email change wasn't initiated by you, please ignore this email."
msgstr "" msgstr ""
"Si vous n'êtes pas à l'origine de cette modification, vous pouvez ignorer ce " "Si vous n'êtes pas à l'origine de cette modification, vous pouvez ignorer"
"courriel." " ce courriel."
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:2 #: fittrackee/emails/templates/email_update_to_new_email/body.txt:2
msgid "Use the link below to confirm this address." msgid "Use the link below to confirm this address."
msgstr "" msgstr "Cliquez sur le lien ci-dessous pour confirmer cette adresse électronique."
"Cliquez sur le lien ci-dessous pour confirmer cette adresse électronique."
#: fittrackee/emails/templates/password_change/body.html:2 #: fittrackee/emails/templates/password_change/body.html:2
#: fittrackee/emails/templates/password_change/subject.txt:1 #: fittrackee/emails/templates/password_change/subject.txt:1
@ -233,3 +266,4 @@ msgstr ""
#: fittrackee/emails/templates/password_reset_request/body.txt:1 #: fittrackee/emails/templates/password_reset_request/body.txt:1
msgid "Use the link below to reset it." msgid "Use the link below to reset it."
msgstr "Cliquez sur le lien ci-dessous pour le réinitialiser." msgstr "Cliquez sur le lien ci-dessous pour le réinitialiser."

View File

@ -7,17 +7,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-11 09:25+0100\n" "POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2022-12-12 19:48+0000\n" "PO-Revision-Date: 2022-12-12 19:48+0000\n"
"Last-Translator: Donato Perruso <dperruso@protonmail.com>\n" "Last-Translator: Donato Perruso <dperruso@protonmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/fittrackee/"
"fittrackee-api-emails/it/>\n"
"Language: it\n" "Language: it\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/fittrackee"
"/fittrackee-api-emails/it/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15-dev\n"
"Generated-By: Babel 2.11.0\n" "Generated-By: Babel 2.11.0\n"
#: fittrackee/emails/templates/layout.html:215 #: fittrackee/emails/templates/layout.html:215
@ -85,19 +84,51 @@ msgstr ""
"ignora quest'email." "ignora quest'email."
#: fittrackee/emails/templates/account_confirmation/body.html:22 #: fittrackee/emails/templates/account_confirmation/body.html:22
#: fittrackee/emails/templates/data_export_ready/body.html:22
#: fittrackee/emails/templates/email_update_to_new_email/body.html:22 #: fittrackee/emails/templates/email_update_to_new_email/body.html:22
#: fittrackee/emails/templates/password_reset_request/body.html:24 #: fittrackee/emails/templates/password_reset_request/body.html:24
msgid "" msgid ""
"If you're having trouble with the button above, copy and paste the URL " "If you're having trouble with the button above, copy and paste the URL "
"below into your web browser." "below into your web browser."
msgstr "" msgstr ""
"Se stai avendo problemi con il bottone qui sopra, copia ed incolla l'URL qui " "Se stai avendo problemi con il bottone qui sopra, copia ed incolla l'URL "
"sotto nel tuo web browser." "qui sotto nel tuo web browser."
#: fittrackee/emails/templates/account_confirmation/body.txt:2 #: fittrackee/emails/templates/account_confirmation/body.txt:2
msgid "Use the link below to confirm your address email." msgid "Use the link below to confirm your address email."
msgstr "Usa il link qui sotto per confermare la tua email." msgstr "Usa il link qui sotto per confermare la tua email."
#: fittrackee/emails/templates/data_export_ready/body.html:2
#: fittrackee/emails/templates/data_export_ready/subject.txt:1
msgid "Your archive is ready to be downloaded"
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:3
msgid "A download link is available in your account."
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:1
msgid "You have requested an export of your account on FitTrackee."
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:2
msgid "The archive is now ready to be downloaded from your account."
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
msgid ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
msgstr ""
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2 #: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1 #: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
msgid "Email changed" msgid "Email changed"
@ -139,8 +170,8 @@ msgid ""
"You recently requested to change your email address for your FitTrackee " "You recently requested to change your email address for your FitTrackee "
"account." "account."
msgstr "" msgstr ""
"Hai richiesto di recente di cambiare l'indirizzo email associato con il tuo " "Hai richiesto di recente di cambiare l'indirizzo email associato con il "
"account FitTrackee." "tuo account FitTrackee."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:4 #: fittrackee/emails/templates/email_update_to_new_email/body.html:4
msgid "Use the button below to confirm this address." msgid "Use the button below to confirm this address."
@ -178,9 +209,9 @@ msgid ""
"password immediately or contact your administrator if your account is " "password immediately or contact your administrator if your account is "
"locked." "locked."
msgstr "" msgstr ""
"Se questo cambio di password non è stato iniziato da te, per favore cambia " "Se questo cambio di password non è stato iniziato da te, per favore "
"immediatamente la tua password e contatta un amministratore se il tuo " "cambia immediatamente la tua password e contatta un amministratore se il "
"account è bloccato." "tuo account è bloccato."
#: fittrackee/emails/templates/password_reset_request/body.html:2 #: fittrackee/emails/templates/password_reset_request/body.html:2
#: fittrackee/emails/templates/password_reset_request/subject.txt:1 #: fittrackee/emails/templates/password_reset_request/subject.txt:1
@ -222,8 +253,10 @@ msgstr "Resetta password"
#: fittrackee/emails/templates/password_reset_request/body.txt:7 #: fittrackee/emails/templates/password_reset_request/body.txt:7
msgid "If you did not request a password reset, please ignore this email." msgid "If you did not request a password reset, please ignore this email."
msgstr "" msgstr ""
"Se non hai richiesto un reset della password, per favore ignora quest'email." "Se non hai richiesto un reset della password, per favore ignora "
"quest'email."
#: fittrackee/emails/templates/password_reset_request/body.txt:1 #: fittrackee/emails/templates/password_reset_request/body.txt:1
msgid "Use the link below to reset it." msgid "Use the link below to reset it."
msgstr "Usa il link qui sotto per resettarla." msgstr "Usa il link qui sotto per resettarla."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-03 07:58+0200\n" "POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2022-10-31 10:19+0100\n" "PO-Revision-Date: 2022-10-31 10:19+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: nb\n" "Language: nb\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.11.0\n"
#: fittrackee/emails/templates/layout.html:215 #: fittrackee/emails/templates/layout.html:215
#: fittrackee/emails/templates/layout.txt:1 #: fittrackee/emails/templates/layout.txt:1
@ -79,6 +79,7 @@ msgid ""
msgstr "" msgstr ""
#: fittrackee/emails/templates/account_confirmation/body.html:22 #: fittrackee/emails/templates/account_confirmation/body.html:22
#: fittrackee/emails/templates/data_export_ready/body.html:22
#: fittrackee/emails/templates/email_update_to_new_email/body.html:22 #: fittrackee/emails/templates/email_update_to_new_email/body.html:22
#: fittrackee/emails/templates/password_reset_request/body.html:24 #: fittrackee/emails/templates/password_reset_request/body.html:24
msgid "" msgid ""
@ -90,6 +91,37 @@ msgstr ""
msgid "Use the link below to confirm your address email." msgid "Use the link below to confirm your address email."
msgstr "" msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:2
#: fittrackee/emails/templates/data_export_ready/subject.txt:1
msgid "Your archive is ready to be downloaded"
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:3
msgid "A download link is available in your account."
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:1
msgid "You have requested an export of your account on FitTrackee."
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:2
msgid "The archive is now ready to be downloaded from your account."
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
msgid ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
msgstr ""
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2 #: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1 #: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
msgid "Email changed" msgid "Email changed"

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-03 07:58+0200\n" "POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2022-11-29 00:47+0000\n" "PO-Revision-Date: 2023-03-05 07:12+0000\n"
"Last-Translator: bjornclauw <bjorn.clauw.1@gmail.com>\n" "Last-Translator: bjornclauw <bjorn.clauw.1@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/fittrackee/" "Language-Team: Dutch <https://hosted.weblate.org/projects/fittrackee/"
"fittrackee-api-emails/nl/>\n" "fittrackee-api-emails/nl/>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15-dev\n" "X-Generator: Weblate 4.16.2-dev\n"
"Generated-By: Babel 2.11.0\n" "Generated-By: Babel 2.11.0\n"
#: fittrackee/emails/templates/layout.html:215 #: fittrackee/emails/templates/layout.html:215
@ -37,8 +37,8 @@ msgid ""
"For security, this request was received from a %(operating_system)s " "For security, this request was received from a %(operating_system)s "
"device using %(browser_name)s." "device using %(browser_name)s."
msgstr "" msgstr ""
"Voor beveiliging, werd deze aanvraag ontvangen van een %(operating_system)s " "Voor beveiliging, werd deze aanvraag ontvangen van een "
"apparaat via %(browser_name)s." "%(operating_system)s apparaat via %(browser_name)s."
#: fittrackee/emails/templates/layout.html:221 #: fittrackee/emails/templates/layout.html:221
#: fittrackee/emails/templates/layout.txt:5 #: fittrackee/emails/templates/layout.txt:5
@ -80,23 +80,57 @@ msgstr "Verifieer uw email"
msgid "" msgid ""
"If this account creation wasn't initiated by you, please ignore this " "If this account creation wasn't initiated by you, please ignore this "
"email." "email."
msgstr "" msgstr "Indien u deze account niet hebt aangemaakt, gelieve deze email te negeren."
"Indien u deze account niet hebt aangemaakt, gelieve deze email te negeren."
#: fittrackee/emails/templates/account_confirmation/body.html:22 #: fittrackee/emails/templates/account_confirmation/body.html:22
#: fittrackee/emails/templates/data_export_ready/body.html:22
#: fittrackee/emails/templates/email_update_to_new_email/body.html:22 #: fittrackee/emails/templates/email_update_to_new_email/body.html:22
#: fittrackee/emails/templates/password_reset_request/body.html:24 #: fittrackee/emails/templates/password_reset_request/body.html:24
msgid "" msgid ""
"If you're having trouble with the button above, copy and paste the URL " "If you're having trouble with the button above, copy and paste the URL "
"below into your web browser." "below into your web browser."
msgstr "" msgstr ""
"Als u problemen hebt met bovenstaande knop, kopieer en plak de onderstaande " "Als u problemen hebt met bovenstaande knop, kopieer en plak de "
"URL in uw web browser." "onderstaande URL in uw web browser."
#: fittrackee/emails/templates/account_confirmation/body.txt:2 #: fittrackee/emails/templates/account_confirmation/body.txt:2
msgid "Use the link below to confirm your address email." msgid "Use the link below to confirm your address email."
msgstr "Gebruik de onderstaande link om uw email adres te bevestigen." msgstr "Gebruik de onderstaande link om uw email adres te bevestigen."
#: fittrackee/emails/templates/data_export_ready/body.html:2
#: fittrackee/emails/templates/data_export_ready/subject.txt:1
msgid "Your archive is ready to be downloaded"
msgstr "Uw archief is klaar om te downloaden"
#: fittrackee/emails/templates/data_export_ready/body.html:3
msgid "A download link is available in your account."
msgstr "Een download link is beschikbaar in uw account."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:1
msgid "You have requested an export of your account on FitTrackee."
msgstr "U hebt een export van uw account aangevraagd op FitTrackee."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:2
msgid "The archive is now ready to be downloaded from your account."
msgstr "Het archief kan nu gedownload worden van uw account."
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr "Download uw archief"
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
msgid ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
msgstr ""
"Als u deze export niet hebt aangevraagd, gelieve uw wachtwoord onmiddelijk "
"te veranderen of neem contact op met uw administrator als uw account is "
"vergrendeld."
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2 #: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1 #: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
msgid "Email changed" msgid "Email changed"
@ -112,8 +146,8 @@ msgid ""
"You recently requested to change your email address for your FitTrackee " "You recently requested to change your email address for your FitTrackee "
"account to:" "account to:"
msgstr "" msgstr ""
"U hebt een aanvraag ingediend om uw email adres voor uw FitTrackee account " "U hebt een aanvraag ingediend om uw email adres voor uw FitTrackee "
"te veranderen naar:" "account te veranderen naar:"
#: fittrackee/emails/templates/email_update_to_current_email/body.html:18 #: fittrackee/emails/templates/email_update_to_current_email/body.html:18
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:4 #: fittrackee/emails/templates/email_update_to_current_email/body.txt:4
@ -121,9 +155,9 @@ msgid ""
"If this email change wasn't initiated by you, please change your password" "If this email change wasn't initiated by you, please change your password"
" immediately or contact your administrator if your account is locked." " immediately or contact your administrator if your account is locked."
msgstr "" msgstr ""
"Indien deze verandering niet door u werd aangevraagd, gelieve uw wachtwoord " "Indien deze verandering niet door u werd aangevraagd, gelieve uw "
"dan onmiddellijk te veranderen of contacteer uw administrator als uw account " "wachtwoord dan onmiddellijk te veranderen of contacteer uw administrator "
"is vergrendeld." "als uw account is vergrendeld."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:2 #: fittrackee/emails/templates/email_update_to_new_email/body.html:2
#: fittrackee/emails/templates/email_update_to_new_email/subject.txt:1 #: fittrackee/emails/templates/email_update_to_new_email/subject.txt:1
@ -151,8 +185,8 @@ msgstr "Gebruik de onderstaande knop om dit adres te bevestigen."
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:7 #: fittrackee/emails/templates/email_update_to_new_email/body.txt:7
msgid "If this email change wasn't initiated by you, please ignore this email." msgid "If this email change wasn't initiated by you, please ignore this email."
msgstr "" msgstr ""
"Indien u deze email aanpassing niet hebt aangevraagd, gelieve deze email te " "Indien u deze email aanpassing niet hebt aangevraagd, gelieve deze email "
"negeren." "te negeren."
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:2 #: fittrackee/emails/templates/email_update_to_new_email/body.txt:2
msgid "Use the link below to confirm this address." msgid "Use the link below to confirm this address."
@ -179,9 +213,9 @@ msgid ""
"password immediately or contact your administrator if your account is " "password immediately or contact your administrator if your account is "
"locked." "locked."
msgstr "" msgstr ""
"Indien de aanpassing van uw wachtwoord niet door u werd aangevraagd, gelieve " "Indien de aanpassing van uw wachtwoord niet door u werd aangevraagd, "
"uw wachtwoord dan onmiddellijk te veranderen of contacteer uw administrator " "gelieve uw wachtwoord dan onmiddellijk te veranderen of contacteer uw "
"als uw account is vergrendeld." "administrator als uw account is vergrendeld."
#: fittrackee/emails/templates/password_reset_request/body.html:2 #: fittrackee/emails/templates/password_reset_request/body.html:2
#: fittrackee/emails/templates/password_reset_request/subject.txt:1 #: fittrackee/emails/templates/password_reset_request/subject.txt:1
@ -194,8 +228,8 @@ msgid ""
"Use this link to reset your password. The link is only valid for " "Use this link to reset your password. The link is only valid for "
"%(expiration_delay)s." "%(expiration_delay)s."
msgstr "" msgstr ""
"Gebruik deze link om uw wachtwoord te resetten. De link is enkel geldig voor " "Gebruik deze link om uw wachtwoord te resetten. De link is enkel geldig "
"%(expiration_delay)s." "voor %(expiration_delay)s."
#: fittrackee/emails/templates/password_reset_request/body.html:4 #: fittrackee/emails/templates/password_reset_request/body.html:4
#: fittrackee/emails/templates/password_reset_request/body.txt:1 #: fittrackee/emails/templates/password_reset_request/body.txt:1
@ -225,8 +259,8 @@ msgstr "Reset uw wachtwoord"
#: fittrackee/emails/templates/password_reset_request/body.txt:7 #: fittrackee/emails/templates/password_reset_request/body.txt:7
msgid "If you did not request a password reset, please ignore this email." msgid "If you did not request a password reset, please ignore this email."
msgstr "" msgstr ""
"Als u geen aanvraag hebt ingediend om uw wachtwoord aan te passen, gelieve " "Als u geen aanvraag hebt ingediend om uw wachtwoord aan te passen, "
"dan deze mail te negeren." "gelieve dan deze mail te negeren."
#: fittrackee/emails/templates/password_reset_request/body.txt:1 #: fittrackee/emails/templates/password_reset_request/body.txt:1
msgid "Use the link below to reset it." msgid "Use the link below to reset it."

View File

@ -0,0 +1,67 @@
"""add privacy policy
Revision ID: 374a670efe23
Revises: 0f375c44e659
Create Date: 2023-02-25 11:08:08.977217
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '374a670efe23'
down_revision = '0f375c44e659'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('app_config', schema=None) as batch_op:
batch_op.add_column(sa.Column('privacy_policy_date', sa.DateTime(), nullable=True))
batch_op.add_column(sa.Column('privacy_policy', sa.Text(), nullable=True))
batch_op.add_column(sa.Column('about', sa.Text(), nullable=True))
with op.batch_alter_table('users', schema=None) as batch_op:
batch_op.add_column(sa.Column('accepted_policy_date', sa.DateTime(), nullable=True))
batch_op.alter_column('date_format',
existing_type=sa.VARCHAR(length=50),
nullable=True)
op.create_table('users_data_export',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('user_id', sa.Integer(), nullable=True),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.Column('updated_at', sa.DateTime(), nullable=True),
sa.Column('completed', sa.Boolean(), nullable=False),
sa.Column('file_name', sa.String(length=100), nullable=True),
sa.Column('file_size', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
with op.batch_alter_table('users_data_export', schema=None) as batch_op:
batch_op.create_index(batch_op.f('ix_users_data_export_user_id'), ['user_id'], unique=True)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('users_data_export', schema=None) as batch_op:
batch_op.drop_index(batch_op.f('ix_users_data_export_user_id'))
op.drop_table('users_data_export')
with op.batch_alter_table('users', schema=None) as batch_op:
batch_op.alter_column('date_format',
existing_type=sa.VARCHAR(length=50),
nullable=False)
batch_op.drop_column('accepted_policy_date')
with op.batch_alter_table('app_config', schema=None) as batch_op:
batch_op.drop_column('about')
batch_op.drop_column('privacy_policy')
batch_op.drop_column('privacy_policy_date')
# ### end Alembic commands ###

View File

@ -1,9 +1,12 @@
import json import json
from datetime import datetime
from typing import Optional from typing import Optional
from unittest.mock import Mock, patch
import pytest import pytest
from flask import Flask from flask import Flask
from fittrackee import db
from fittrackee.application.models import AppConfig from fittrackee.application.models import AppConfig
from fittrackee.users.models import User from fittrackee.users.models import User
@ -296,7 +299,7 @@ class TestUpdateConfig(ApiTestCaseMixin):
@pytest.mark.parametrize( @pytest.mark.parametrize(
'input_description,input_email', [('input string', ''), ('None', None)] 'input_description,input_email', [('input string', ''), ('None', None)]
) )
def test_it_empties_error_if_admin_contact_is_an_empty( def test_it_empties_administator_contact(
self, self,
app: Flask, app: Flask,
user_1_admin: User, user_1_admin: User,
@ -325,6 +328,108 @@ class TestUpdateConfig(ApiTestCaseMixin):
assert 'success' in data['status'] assert 'success' in data['status']
assert data['data']['admin_contact'] is None assert data['data']['admin_contact'] is None
def test_it_updates_about(
self,
app: Flask,
user_1_admin: User,
) -> None:
client, auth_token = self.get_test_client_and_auth_token(
app, user_1_admin.email
)
about = self.random_string()
response = client.patch(
'/api/config',
content_type='application/json',
data=json.dumps(dict(about=about)),
headers=dict(Authorization=f'Bearer {auth_token}'),
)
assert response.status_code == 200
data = json.loads(response.data.decode())
assert 'success' in data['status']
assert data['data']['about'] == about
def test_it_empties_about_text_when_text_is_an_empty_string(
self, app: Flask, user_1_admin: User
) -> None:
app_config = AppConfig.query.first()
app_config.about = self.random_string()
db.session.commit()
client, auth_token = self.get_test_client_and_auth_token(
app, user_1_admin.email
)
response = client.patch(
'/api/config',
content_type='application/json',
data=json.dumps(dict(about='')),
headers=dict(Authorization=f'Bearer {auth_token}'),
)
assert response.status_code == 200
data = json.loads(response.data.decode())
assert 'success' in data['status']
assert data['data']['about'] is None
def test_it_updates_privacy_policy(
self,
app: Flask,
user_1_admin: User,
) -> None:
client, auth_token = self.get_test_client_and_auth_token(
app, user_1_admin.email
)
privacy_policy = self.random_string()
privacy_policy_date = datetime.utcnow()
with patch(
'fittrackee.application.app_config.datetime'
) as datetime_mock:
datetime_mock.utcnow = Mock(return_value=privacy_policy_date)
response = client.patch(
'/api/config',
content_type='application/json',
data=json.dumps(dict(privacy_policy=privacy_policy)),
headers=dict(Authorization=f'Bearer {auth_token}'),
)
assert response.status_code == 200
data = json.loads(response.data.decode())
assert 'success' in data['status']
assert data['data']['privacy_policy'] == privacy_policy
assert data['data'][
'privacy_policy_date'
] == privacy_policy_date.strftime('%a, %d %b %Y %H:%M:%S GMT')
@pytest.mark.parametrize('input_privacy_policy', ['', None])
def test_it_empties_privacy_policy_date_when_no_privacy_policy(
self,
app: Flask,
user_1_admin: User,
input_privacy_policy: Optional[str],
) -> None:
app_config = AppConfig.query.first()
app_config.privacy_policy = self.random_string()
app_config.privacy_policy_date = datetime.utcnow()
db.session.commit()
client, auth_token = self.get_test_client_and_auth_token(
app, user_1_admin.email
)
response = client.patch(
'/api/config',
content_type='application/json',
data=json.dumps(dict(privacy_policy=input_privacy_policy)),
headers=dict(Authorization=f'Bearer {auth_token}'),
)
assert response.status_code == 200
data = json.loads(response.data.decode())
assert 'success' in data['status']
assert data['data']['privacy_policy'] is None
assert data['data']['privacy_policy_date'] is None
@pytest.mark.parametrize( @pytest.mark.parametrize(
'client_scope, can_access', 'client_scope, can_access',
[ [

View File

@ -1,3 +1,5 @@
from datetime import datetime
import pytest import pytest
from flask import Flask from flask import Flask
@ -5,6 +7,8 @@ from fittrackee import VERSION
from fittrackee.application.models import AppConfig from fittrackee.application.models import AppConfig
from fittrackee.users.models import User from fittrackee.users.models import User
from ..utils import random_string
class TestConfigModel: class TestConfigModel:
def test_application_config( def test_application_config(
@ -88,3 +92,26 @@ class TestConfigModel:
serialized_app_config['weather_provider'] serialized_app_config['weather_provider']
== expected_weather_provider == expected_weather_provider
) )
def test_it_returns_privacy_policy(self, app: Flask) -> None:
app_config = AppConfig.query.first()
privacy_policy = random_string()
privacy_policy_date = datetime.now()
app_config.privacy_policy = privacy_policy
app_config.privacy_policy_date = privacy_policy_date
serialized_app_config = app_config.serialize()
assert serialized_app_config["privacy_policy"] == privacy_policy
assert (
serialized_app_config["privacy_policy_date"] == privacy_policy_date
)
def test_it_returns_about(self, app: Flask) -> None:
app_config = AppConfig.query.first()
about = random_string()
app_config.about = about
serialized_app_config = app_config.serialize()
assert serialized_app_config["about"] == about

View File

@ -0,0 +1,167 @@
# flake8: noqa
expected_en_text_body = """Hi test,
You have requested an export of your account on FitTrackee.
The archive is now ready to be downloaded from your account.
Download your archive: http://localhost/profile/edit/account
If you did not request the export, please change your password immediately or contact your administrator if your account is locked.
Thanks,
The FitTrackee Team
http://localhost"""
expected_fr_text_body = """Bonjour test,
Vous avez demandé un export des données de votre compte sur FitTrackee.
L'archive est maintenant prête à être téléchargée depuis votre compte.
Télécharger votre archive: http://localhost/profile/edit/account
Si vous n'êtes pas à l'origine de cette demande, veuillez changer votre mot de passe immédiatement ou contacter l'administrateur si votre compte est bloqué.
Merci,
L'équipe FitTrackee
http://localhost"""
expected_en_html_body = """ <body>
<span class="preheader">A download link is available in your account.</span>
<table class="email-wrapper" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<table class="email-content" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="email-masthead">
<a href="http://localhost" class="f-fallback email-masthead-name">
FitTrackee
</a>
</td>
</tr>
<tr>
<td class="email-body" width="100%" cellpadding="0" cellspacing="0">
<table class="email-body-inner" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="content-cell">
<div class="f-fallback">
<h1>Hi test,</h1>
<p>You have requested an export of your account on FitTrackee. The archive is now ready to be downloaded from your account.</p>
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
<tr>
<td align="center">
<a href="http://localhost/profile/edit/account" class="f-fallback button button--green" target="_blank">Download your archive</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>
If you did not request the export, please change your password immediately or contact your administrator if your account is locked.
</p>
<p>Thanks,
<br>The FitTrackee Team</p>
<table class="body-sub" role="presentation">
<tr>
<td>
<p class="f-fallback sub">If you're having trouble with the button above, copy and paste the URL below into your web browser.</p>
<p class="f-fallback sub">http://localhost/profile/edit/account</p>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table class="email-footer" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="content-cell" align="center">
<p class="f-fallback sub align-center">&copy; FitTrackee.</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>"""
expected_fr_html_body = """ <body>
<span class="preheader">Un lien de téléchargement est disponible dans votre compte.</span>
<table class="email-wrapper" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<table class="email-content" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="email-masthead">
<a href="http://localhost" class="f-fallback email-masthead-name">
FitTrackee
</a>
</td>
</tr>
<tr>
<td class="email-body" width="100%" cellpadding="0" cellspacing="0">
<table class="email-body-inner" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="content-cell">
<div class="f-fallback">
<h1>Bonjour test,</h1>
<p>Vous avez demandé un export des données de votre compte sur FitTrackee. L'archive est maintenant prête à être téléchargée depuis votre compte.</p>
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
<tr>
<td align="center">
<a href="http://localhost/profile/edit/account" class="f-fallback button button--green" target="_blank">Télécharger votre archive</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>
Si vous n'êtes pas à l'origine de cette demande, veuillez changer votre mot de passe immédiatement ou contacter l'administrateur si votre compte est bloqué.
</p>
<p>Merci,
<br>L'équipe FitTrackee</p>
<table class="body-sub" role="presentation">
<tr>
<td>
<p class="f-fallback sub">Si vous avez des problèmes avec le bouton, vous pouvez copier et coller le lien suivant dans votre navigateur.</p>
<p class="f-fallback sub">http://localhost/profile/edit/account</p>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table class="email-footer" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="content-cell" align="center">
<p class="f-fallback sub align-center">&copy; FitTrackee.</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>"""

View File

@ -0,0 +1,89 @@
import pytest
from flask import Flask
from fittrackee.emails.email import EmailTemplate
from .template_results.email_data_export_ready import (
expected_en_html_body,
expected_en_text_body,
expected_fr_html_body,
expected_fr_text_body,
)
class TestEmailTemplateForDataExport:
EMAIL_DATA = {
'username': 'test',
'account_url': 'http://localhost/profile/edit/account',
'fittrackee_url': 'http://localhost',
}
@pytest.mark.parametrize(
'lang, expected_subject',
[
('en', 'FitTrackee - Your archive is ready to be downloaded'),
('fr', 'FitTrackee - Votre archive est prête à être téléchargée'),
],
)
def test_it_gets_subject(
self, app: Flask, lang: str, expected_subject: str
) -> None:
email_template = EmailTemplate(
app.config['TEMPLATES_FOLDER'],
app.config['TRANSLATIONS_FOLDER'],
app.config['LANGUAGES'],
)
subject = email_template.get_content(
'data_export_ready', lang, 'subject.txt', {}
)
assert subject == expected_subject
@pytest.mark.parametrize(
'lang, expected_text_body',
[
('en', expected_en_text_body),
('fr', expected_fr_text_body),
],
)
def test_it_gets_text_body(
self, app: Flask, lang: str, expected_text_body: str
) -> None:
email_template = EmailTemplate(
app.config['TEMPLATES_FOLDER'],
app.config['TRANSLATIONS_FOLDER'],
app.config['LANGUAGES'],
)
text_body = email_template.get_content(
'data_export_ready', lang, 'body.txt', self.EMAIL_DATA
)
assert text_body == expected_text_body
def test_it_gets_en_html_body(self, app: Flask) -> None:
email_template = EmailTemplate(
app.config['TEMPLATES_FOLDER'],
app.config['TRANSLATIONS_FOLDER'],
app.config['LANGUAGES'],
)
text_body = email_template.get_content(
'data_export_ready', 'en', 'body.html', self.EMAIL_DATA
)
assert expected_en_html_body in text_body
def test_it_gets_fr_html_body(self, app: Flask) -> None:
email_template = EmailTemplate(
app.config['TEMPLATES_FOLDER'],
app.config['TRANSLATIONS_FOLDER'],
app.config['LANGUAGES'],
)
text_body = email_template.get_content(
'data_export_ready', 'fr', 'body.html', self.EMAIL_DATA
)
assert expected_fr_html_body in text_body

Some files were not shown because too many files have changed in this diff Show More