diff --git a/ALL_README.md b/ALL_README.md index 3d6c579..8938aae 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -1,6 +1,8 @@ # All available README files by language - [Read the README in English](README.md) +- [Lee el README en español](README_es.md) +- [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) -- [Leggi il “README” in italiano](README_it.md) +- [阅读中文(简体)的 README](README_zh_Hans.md) diff --git a/README.md b/README.md index 09ca456..25a7966 100644 --- a/README.md +++ b/README.md @@ -9,24 +9,21 @@ It shall NOT be edited by hand. [![Install django-for-runners with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=django-for-runners) -*[Read this README is other languages.](./ALL_README.md)* +*[Read this README in other languages.](./ALL_README.md)* > *This package allows you to install django-for-runners quickly and simply on a YunoHost server.* > *If you don't have YunoHost, please consult [the guide](https://yunohost.org/install) to learn how to install it.* ## Overview -![Logo](https://raw.githubusercontent.com/jedie/django-for-runners/main/for_runners/static/Django-ForRunners128.png) +[![tests](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml) +[![codecov](https://codecov.io/github/jedie/for_runners_ynh/branch/main/graph/badge.svg)](https://app.codecov.io/github/jedie/for_runners_ynh) +[![for_runners_ynh @ PyPi](https://img.shields.io/pypi/v/for_runners_ynh?label=for_runners_ynh%20%40%20PyPi)](https://pypi.org/project/for_runners_ynh/) +[![Python Versions](https://img.shields.io/pypi/pyversions/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/pyproject.toml) +[![License GPL-3.0-or-later](https://img.shields.io/pypi/l/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/LICENSE) [django-for-runners](https://github.com/jedie/django-for-runners) is a libre web-based management for your GPX tracks of your running (or other sports activity). Used [Python](https://www.python.org/)/[Django](https://www.djangoproject.com/). - -[![pytest](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/pytest.yml/badge.svg?branch=master)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/pytest.yml) [![YunoHost apps package linter](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/package_linter.yml/badge.svg)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/package_linter.yml) [![Coverage Status on codecov.io](https://codecov.io/gh/YunoHost-Apps/django-for-runners_ynh/branch/master/graph/badge.svg)](https://codecov.io/gh/YunoHost-Apps/django-for-runners_ynh) - -![django-for-runners @ PyPi](https://img.shields.io/pypi/v/django-for-runners?label=django-for-runners%20%40%20PyPi) -![Python Versions](https://img.shields.io/pypi/pyversions/django-for-runners) -![License GPL V3+](https://img.shields.io/pypi/l/django-for-runners) - Pull requests welcome ;) This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration) @@ -42,165 +39,8 @@ More screenshots are here: [jedie.github.io/tree/master/screenshots/django-for-r ![Screenshot of django-for-runners](./doc/screenshots/for_runners_v060_2018_07_19_event_costs.png) ![Screenshot of django-for-runners](./doc/screenshots/for_runners_v040_2018_6_26_gpx_info.png) -## Disclaimers / important information - -## Settings and upgrades - -Almost everything related to django-for-runners's configuration is handled in a `"../conf/settings.py"` file. -You can edit the file `/opt/yunohost/django-for-runners/local_settings.py` to enable or disable features. - -Test sending emails: - -```bash -ssh admin@yourdomain.tld -root@yunohost:~# cd /opt/yunohost/django-for-runners/ -root@yunohost:/opt/yunohost/django-for-runners# source venv/bin/activate -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py sendtestemail --admins -``` - -Background info: Error mails are send to all [settings.ADMINS](https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-ADMINS). By default the YunoHost admin is inserted here. -To check current ADMINS run: - -```bash -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py sendtestemail --admins -``` - -If you prefere to send error emails to a extrnal email address, just do something like this: - -```bash -echo "ADMINS = (('Your Name', 'example@domain.tld'),)" >> /opt/yunohost/django-for-runners/local_settings.py -``` - -To check the effective settings, run this: -```bash -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py diffsettings -``` - - -# Miscellaneous - - -## SSO authentication - -[SSOwat](https://github.com/YunoHost/SSOwat) is fully supported via [django_ynh](https://github.com/YunoHost-Apps/django_ynh): - -* First user (`$YNH_APP_ARG_ADMIN`) will be created as Django's super user -* All new users will be created as normal users -* Login via SSO is fully supported -* User Email, First / Last name will be updated from SSO data - - -## Links - - * Report a bug about this package: https://github.com/YunoHost-Apps/django-for-runners_ynh - * Report a bug about django-for-runners itself: https://github.com/jedie/django-for-runners - * YunoHost website: https://yunohost.org/ - ---- - -# Developer info - -## package installation / debugging - -Please send your pull request to https://github.com/YunoHost-Apps/django-for-runners_ynh - -Try 'main' branch, e.g.: -```bash -sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/master --debug -or -sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/master --debug -``` - -Try 'testing' branch, e.g.: -```bash -sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug -or -sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug -``` - -To remove call e.g.: -```bash -sudo yunohost app remove django-for-runners -``` - -Backup / remove / restore cycle, e.g.: -```bash -yunohost backup create --apps django-for-runners -yunohost backup list -archives: - - django-for-runners-pre-upgrade1 - - 20201223-163434 -yunohost app remove django-for-runners -yunohost backup restore 20201223-163434 --apps django-for-runners -``` - -Debug installation, e.g.: -```bash -root@yunohost:~# ls -la /var/www/django-for-runners/ -total 18 -drwxr-xr-x 4 root root 4 Dec 8 08:36 . -drwxr-xr-x 6 root root 6 Dec 8 08:36 .. -drwxr-xr-x 2 root root 2 Dec 8 08:36 media -drwxr-xr-x 7 root root 8 Dec 8 08:40 static - -root@yunohost:~# ls -la /opt/yunohost/django-for-runners/ -total 58 -drwxr-xr-x 5 django-for-runners django-for-runners 11 Dec 8 08:39 . -drwxr-xr-x 3 root root 3 Dec 8 08:36 .. --rw-r--r-- 1 django-for-runners django-for-runners 460 Dec 8 08:39 gunicorn.conf.py --rw-r--r-- 1 django-for-runners django-for-runners 0 Dec 8 08:39 local_settings.py --rwxr-xr-x 1 django-for-runners django-for-runners 274 Dec 8 08:39 manage.py --rw-r--r-- 1 django-for-runners django-for-runners 171 Dec 8 08:39 secret.txt -drwxr-xr-x 6 django-for-runners django-for-runners 6 Dec 8 08:37 venv --rw-r--r-- 1 django-for-runners django-for-runners 115 Dec 8 08:39 wsgi.py --rw-r--r-- 1 django-for-runners django-for-runners 4737 Dec 8 08:39 settings.py - -root@yunohost:~# cd /opt/yunohost/django-for-runners/ -root@yunohost:/opt/yunohost/django-for-runners# source venv/bin/activate -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py check -django-for-runners v0.8.2 (Django v2.2.17) -DJANGO_SETTINGS_MODULE='settings' -PROJECT_PATH:/opt/yunohost/django-for-runners/venv/lib/python3.7/site-packages -BASE_PATH:/opt/yunohost/django-for-runners -System check identified no issues (0 silenced). - -root@yunohost:~# tail -f /var/log/django-for-runners/django-for-runners.log -root@yunohost:~# cat /etc/systemd/system/django-for-runners.service - -root@yunohost:~# systemctl reload-or-restart django-for-runners -root@yunohost:~# systemctl status django-for-runners -root@yunohost:~# journalctl --unit=for_runners --follow -``` - -## local test - -For quicker developing of django-for-runners in the context of YunoHost app, -it's possible to run the Django developer server with the settings -and urls made for YunoHost installation. - -e.g.: -```bash -~$ git clone https://github.com/YunoHost-Apps/django-for-runners_ynh.git -~$ cd django-for-runners_ynh/ -~/django-for-runners_ynh$ make -install-poetry install or update poetry -install install django-for-runners via poetry -update update the sources and installation -local-test Run local_test.py to run django-for-runners_ynh locally -~/django-for-runners_ynh$ make install-poetry -~/django-for-runners_ynh$ make install -~/django-for-runners_ynh$ make local-test -``` - -Notes: - -* SQlite database will be used -* A super user with username `test` and password `test` is created -* The page is available under `http://127.0.0.1:8000/app_path/` - ## Documentation and resources -- Official app website: - Official user documentation: - Official admin documentation: - Upstream app code repository: diff --git a/README_es.md b/README_es.md new file mode 100644 index 0000000..f97aa36 --- /dev/null +++ b/README_es.md @@ -0,0 +1,62 @@ + + +# django-for-runners para Yunohost + +[![Nivel de integración](https://dash.yunohost.org/integration/django-for-runners.svg)](https://dash.yunohost.org/appci/app/django-for-runners) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/django-for-runners.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/django-for-runners.maintain.svg) + +[![Instalar django-for-runners con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=django-for-runners) + +*[Leer este README en otros idiomas.](./ALL_README.md)* + +> *Este paquete le permite instalardjango-for-runners rapidamente y simplement en un servidor YunoHost.* +> *Si no tiene YunoHost, visita [the guide](https://yunohost.org/install) para aprender como instalarla.* + +## Descripción general + +[![tests](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml) +[![codecov](https://codecov.io/github/jedie/for_runners_ynh/branch/main/graph/badge.svg)](https://app.codecov.io/github/jedie/for_runners_ynh) +[![for_runners_ynh @ PyPi](https://img.shields.io/pypi/v/for_runners_ynh?label=for_runners_ynh%20%40%20PyPi)](https://pypi.org/project/for_runners_ynh/) +[![Python Versions](https://img.shields.io/pypi/pyversions/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/pyproject.toml) +[![License GPL-3.0-or-later](https://img.shields.io/pypi/l/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/LICENSE) + +[django-for-runners](https://github.com/jedie/django-for-runners) is a libre web-based management for your GPX tracks of your running (or other sports activity). Used [Python](https://www.python.org/)/[Django](https://www.djangoproject.com/). + +Pull requests welcome ;) + +This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration) + +More screenshots are here: [jedie.github.io/tree/master/screenshots/django-for-runners](https://github.com/jedie/jedie.github.io/tree/master/screenshots/django-for-runners/README.creole) + + +**Versión actual:** 0.17.4~ynh1 + +## Capturas + +![Captura de django-for-runners](./doc/screenshots/for_runers_v060_2018_07_31_gpx_track.png) +![Captura de django-for-runners](./doc/screenshots/for_runners_v060_2018_07_19_event_costs.png) +![Captura de django-for-runners](./doc/screenshots/for_runners_v040_2018_6_26_gpx_info.png) + +## Documentaciones y recursos + +- Documentación usuario oficial: +- Documentación administrador oficial: +- Repositorio del código fuente oficial de la aplicación : +- Catálogo YunoHost: +- Reportar un error: + +## Información para desarrolladores + +Por favor enviar sus correcciones a la [`branch testing`](https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing + +Para probar la rama `testing`, sigue asÍ: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug +o +sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug +``` + +**Mas informaciones sobre el empaquetado de aplicaciones:** diff --git a/README_eu.md b/README_eu.md new file mode 100644 index 0000000..3db3fe3 --- /dev/null +++ b/README_eu.md @@ -0,0 +1,62 @@ + + +# django-for-runners YunoHost-erako + +[![Integrazio maila](https://dash.yunohost.org/integration/django-for-runners.svg)](https://dash.yunohost.org/appci/app/django-for-runners) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/django-for-runners.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/django-for-runners.maintain.svg) + +[![Instalatu django-for-runners YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=django-for-runners) + +*[Irakurri README hau beste hizkuntzatan.](./ALL_README.md)* + +> *Pakete honek django-for-runners YunoHost zerbitzari batean azkar eta zailtasunik gabe instalatzea ahalbidetzen dizu.* +> *YunoHost ez baduzu, kontsultatu [gida](https://yunohost.org/install) nola instalatu ikasteko.* + +## Aurreikuspena + +[![tests](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml) +[![codecov](https://codecov.io/github/jedie/for_runners_ynh/branch/main/graph/badge.svg)](https://app.codecov.io/github/jedie/for_runners_ynh) +[![for_runners_ynh @ PyPi](https://img.shields.io/pypi/v/for_runners_ynh?label=for_runners_ynh%20%40%20PyPi)](https://pypi.org/project/for_runners_ynh/) +[![Python Versions](https://img.shields.io/pypi/pyversions/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/pyproject.toml) +[![License GPL-3.0-or-later](https://img.shields.io/pypi/l/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/LICENSE) + +[django-for-runners](https://github.com/jedie/django-for-runners) is a libre web-based management for your GPX tracks of your running (or other sports activity). Used [Python](https://www.python.org/)/[Django](https://www.djangoproject.com/). + +Pull requests welcome ;) + +This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration) + +More screenshots are here: [jedie.github.io/tree/master/screenshots/django-for-runners](https://github.com/jedie/jedie.github.io/tree/master/screenshots/django-for-runners/README.creole) + + +**Paketatutako bertsioa:** 0.17.4~ynh1 + +## Pantaila-argazkiak + +![django-for-runners(r)en pantaila-argazkia](./doc/screenshots/for_runers_v060_2018_07_31_gpx_track.png) +![django-for-runners(r)en pantaila-argazkia](./doc/screenshots/for_runners_v060_2018_07_19_event_costs.png) +![django-for-runners(r)en pantaila-argazkia](./doc/screenshots/for_runners_v040_2018_6_26_gpx_info.png) + +## Dokumentazioa eta baliabideak + +- Erabiltzaileen dokumentazio ofiziala: +- Administratzaileen dokumentazio ofiziala: +- Jatorrizko aplikazioaren kode-gordailua: +- YunoHost Denda: +- Eman errore baten berri: + +## Garatzaileentzako informazioa + +Bidali `pull request`a [`testing` abarrera](https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing). + +`testing` abarra probatzeko, ondorengoa egin: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug +edo +sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug +``` + +**Informazio gehiago aplikazioaren paketatzeari buruz:** diff --git a/README_fr.md b/README_fr.md index 7b8b0ed..636d05f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,17 +16,14 @@ Il NE doit PAS être modifié à la main. ## Vue d’ensemble -![Logo](https://raw.githubusercontent.com/jedie/django-for-runners/main/for_runners/static/Django-ForRunners128.png) +[![tests](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml) +[![codecov](https://codecov.io/github/jedie/for_runners_ynh/branch/main/graph/badge.svg)](https://app.codecov.io/github/jedie/for_runners_ynh) +[![for_runners_ynh @ PyPi](https://img.shields.io/pypi/v/for_runners_ynh?label=for_runners_ynh%20%40%20PyPi)](https://pypi.org/project/for_runners_ynh/) +[![Python Versions](https://img.shields.io/pypi/pyversions/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/pyproject.toml) +[![License GPL-3.0-or-later](https://img.shields.io/pypi/l/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/LICENSE) [django-for-runners](https://github.com/jedie/django-for-runners) is a libre web-based management for your GPX tracks of your running (or other sports activity). Used [Python](https://www.python.org/)/[Django](https://www.djangoproject.com/). - -[![pytest](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/pytest.yml/badge.svg?branch=master)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/pytest.yml) [![YunoHost apps package linter](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/package_linter.yml/badge.svg)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/package_linter.yml) [![Coverage Status on codecov.io](https://codecov.io/gh/YunoHost-Apps/django-for-runners_ynh/branch/master/graph/badge.svg)](https://codecov.io/gh/YunoHost-Apps/django-for-runners_ynh) - -![django-for-runners @ PyPi](https://img.shields.io/pypi/v/django-for-runners?label=django-for-runners%20%40%20PyPi) -![Python Versions](https://img.shields.io/pypi/pyversions/django-for-runners) -![License GPL V3+](https://img.shields.io/pypi/l/django-for-runners) - Pull requests welcome ;) This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration) @@ -42,165 +39,8 @@ More screenshots are here: [jedie.github.io/tree/master/screenshots/django-for-r ![Capture d’écran de django-for-runners](./doc/screenshots/for_runners_v060_2018_07_19_event_costs.png) ![Capture d’écran de django-for-runners](./doc/screenshots/for_runners_v040_2018_6_26_gpx_info.png) -## Avertissements / informations importantes - -## Settings and upgrades - -Almost everything related to django-for-runners's configuration is handled in a `"../conf/settings.py"` file. -You can edit the file `/opt/yunohost/django-for-runners/local_settings.py` to enable or disable features. - -Test sending emails: - -```bash -ssh admin@yourdomain.tld -root@yunohost:~# cd /opt/yunohost/django-for-runners/ -root@yunohost:/opt/yunohost/django-for-runners# source venv/bin/activate -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py sendtestemail --admins -``` - -Background info: Error mails are send to all [settings.ADMINS](https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-ADMINS). By default the YunoHost admin is inserted here. -To check current ADMINS run: - -```bash -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py sendtestemail --admins -``` - -If you prefere to send error emails to a extrnal email address, just do something like this: - -```bash -echo "ADMINS = (('Your Name', 'example@domain.tld'),)" >> /opt/yunohost/django-for-runners/local_settings.py -``` - -To check the effective settings, run this: -```bash -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py diffsettings -``` - - -# Miscellaneous - - -## SSO authentication - -[SSOwat](https://github.com/YunoHost/SSOwat) is fully supported via [django_ynh](https://github.com/YunoHost-Apps/django_ynh): - -* First user (`$YNH_APP_ARG_ADMIN`) will be created as Django's super user -* All new users will be created as normal users -* Login via SSO is fully supported -* User Email, First / Last name will be updated from SSO data - - -## Links - - * Report a bug about this package: https://github.com/YunoHost-Apps/django-for-runners_ynh - * Report a bug about django-for-runners itself: https://github.com/jedie/django-for-runners - * YunoHost website: https://yunohost.org/ - ---- - -# Developer info - -## package installation / debugging - -Please send your pull request to https://github.com/YunoHost-Apps/django-for-runners_ynh - -Try 'main' branch, e.g.: -```bash -sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/master --debug -or -sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/master --debug -``` - -Try 'testing' branch, e.g.: -```bash -sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug -or -sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug -``` - -To remove call e.g.: -```bash -sudo yunohost app remove django-for-runners -``` - -Backup / remove / restore cycle, e.g.: -```bash -yunohost backup create --apps django-for-runners -yunohost backup list -archives: - - django-for-runners-pre-upgrade1 - - 20201223-163434 -yunohost app remove django-for-runners -yunohost backup restore 20201223-163434 --apps django-for-runners -``` - -Debug installation, e.g.: -```bash -root@yunohost:~# ls -la /var/www/django-for-runners/ -total 18 -drwxr-xr-x 4 root root 4 Dec 8 08:36 . -drwxr-xr-x 6 root root 6 Dec 8 08:36 .. -drwxr-xr-x 2 root root 2 Dec 8 08:36 media -drwxr-xr-x 7 root root 8 Dec 8 08:40 static - -root@yunohost:~# ls -la /opt/yunohost/django-for-runners/ -total 58 -drwxr-xr-x 5 django-for-runners django-for-runners 11 Dec 8 08:39 . -drwxr-xr-x 3 root root 3 Dec 8 08:36 .. --rw-r--r-- 1 django-for-runners django-for-runners 460 Dec 8 08:39 gunicorn.conf.py --rw-r--r-- 1 django-for-runners django-for-runners 0 Dec 8 08:39 local_settings.py --rwxr-xr-x 1 django-for-runners django-for-runners 274 Dec 8 08:39 manage.py --rw-r--r-- 1 django-for-runners django-for-runners 171 Dec 8 08:39 secret.txt -drwxr-xr-x 6 django-for-runners django-for-runners 6 Dec 8 08:37 venv --rw-r--r-- 1 django-for-runners django-for-runners 115 Dec 8 08:39 wsgi.py --rw-r--r-- 1 django-for-runners django-for-runners 4737 Dec 8 08:39 settings.py - -root@yunohost:~# cd /opt/yunohost/django-for-runners/ -root@yunohost:/opt/yunohost/django-for-runners# source venv/bin/activate -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py check -django-for-runners v0.8.2 (Django v2.2.17) -DJANGO_SETTINGS_MODULE='settings' -PROJECT_PATH:/opt/yunohost/django-for-runners/venv/lib/python3.7/site-packages -BASE_PATH:/opt/yunohost/django-for-runners -System check identified no issues (0 silenced). - -root@yunohost:~# tail -f /var/log/django-for-runners/django-for-runners.log -root@yunohost:~# cat /etc/systemd/system/django-for-runners.service - -root@yunohost:~# systemctl reload-or-restart django-for-runners -root@yunohost:~# systemctl status django-for-runners -root@yunohost:~# journalctl --unit=for_runners --follow -``` - -## local test - -For quicker developing of django-for-runners in the context of YunoHost app, -it's possible to run the Django developer server with the settings -and urls made for YunoHost installation. - -e.g.: -```bash -~$ git clone https://github.com/YunoHost-Apps/django-for-runners_ynh.git -~$ cd django-for-runners_ynh/ -~/django-for-runners_ynh$ make -install-poetry install or update poetry -install install django-for-runners via poetry -update update the sources and installation -local-test Run local_test.py to run django-for-runners_ynh locally -~/django-for-runners_ynh$ make install-poetry -~/django-for-runners_ynh$ make install -~/django-for-runners_ynh$ make local-test -``` - -Notes: - -* SQlite database will be used -* A super user with username `test` and password `test` is created -* The page is available under `http://127.0.0.1:8000/app_path/` - ## Documentations et ressources -- Site officiel de l’app : - Documentation officielle utilisateur : - Documentation officielle de l’admin : - Dépôt de code officiel de l’app : diff --git a/README_gl.md b/README_gl.md index 4ce84ea..80bf26b 100644 --- a/README_gl.md +++ b/README_gl.md @@ -16,17 +16,14 @@ NON debe editarse manualmente. ## Vista xeral -![Logo](https://raw.githubusercontent.com/jedie/django-for-runners/main/for_runners/static/Django-ForRunners128.png) +[![tests](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml) +[![codecov](https://codecov.io/github/jedie/for_runners_ynh/branch/main/graph/badge.svg)](https://app.codecov.io/github/jedie/for_runners_ynh) +[![for_runners_ynh @ PyPi](https://img.shields.io/pypi/v/for_runners_ynh?label=for_runners_ynh%20%40%20PyPi)](https://pypi.org/project/for_runners_ynh/) +[![Python Versions](https://img.shields.io/pypi/pyversions/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/pyproject.toml) +[![License GPL-3.0-or-later](https://img.shields.io/pypi/l/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/LICENSE) [django-for-runners](https://github.com/jedie/django-for-runners) is a libre web-based management for your GPX tracks of your running (or other sports activity). Used [Python](https://www.python.org/)/[Django](https://www.djangoproject.com/). - -[![pytest](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/pytest.yml/badge.svg?branch=master)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/pytest.yml) [![YunoHost apps package linter](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/package_linter.yml/badge.svg)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/package_linter.yml) [![Coverage Status on codecov.io](https://codecov.io/gh/YunoHost-Apps/django-for-runners_ynh/branch/master/graph/badge.svg)](https://codecov.io/gh/YunoHost-Apps/django-for-runners_ynh) - -![django-for-runners @ PyPi](https://img.shields.io/pypi/v/django-for-runners?label=django-for-runners%20%40%20PyPi) -![Python Versions](https://img.shields.io/pypi/pyversions/django-for-runners) -![License GPL V3+](https://img.shields.io/pypi/l/django-for-runners) - Pull requests welcome ;) This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration) @@ -42,165 +39,8 @@ More screenshots are here: [jedie.github.io/tree/master/screenshots/django-for-r ![Captura de pantalla de django-for-runners](./doc/screenshots/for_runners_v060_2018_07_19_event_costs.png) ![Captura de pantalla de django-for-runners](./doc/screenshots/for_runners_v040_2018_6_26_gpx_info.png) -## Avisos / información importante - -## Settings and upgrades - -Almost everything related to django-for-runners's configuration is handled in a `"../conf/settings.py"` file. -You can edit the file `/opt/yunohost/django-for-runners/local_settings.py` to enable or disable features. - -Test sending emails: - -```bash -ssh admin@yourdomain.tld -root@yunohost:~# cd /opt/yunohost/django-for-runners/ -root@yunohost:/opt/yunohost/django-for-runners# source venv/bin/activate -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py sendtestemail --admins -``` - -Background info: Error mails are send to all [settings.ADMINS](https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-ADMINS). By default the YunoHost admin is inserted here. -To check current ADMINS run: - -```bash -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py sendtestemail --admins -``` - -If you prefere to send error emails to a extrnal email address, just do something like this: - -```bash -echo "ADMINS = (('Your Name', 'example@domain.tld'),)" >> /opt/yunohost/django-for-runners/local_settings.py -``` - -To check the effective settings, run this: -```bash -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py diffsettings -``` - - -# Miscellaneous - - -## SSO authentication - -[SSOwat](https://github.com/YunoHost/SSOwat) is fully supported via [django_ynh](https://github.com/YunoHost-Apps/django_ynh): - -* First user (`$YNH_APP_ARG_ADMIN`) will be created as Django's super user -* All new users will be created as normal users -* Login via SSO is fully supported -* User Email, First / Last name will be updated from SSO data - - -## Links - - * Report a bug about this package: https://github.com/YunoHost-Apps/django-for-runners_ynh - * Report a bug about django-for-runners itself: https://github.com/jedie/django-for-runners - * YunoHost website: https://yunohost.org/ - ---- - -# Developer info - -## package installation / debugging - -Please send your pull request to https://github.com/YunoHost-Apps/django-for-runners_ynh - -Try 'main' branch, e.g.: -```bash -sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/master --debug -or -sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/master --debug -``` - -Try 'testing' branch, e.g.: -```bash -sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug -or -sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug -``` - -To remove call e.g.: -```bash -sudo yunohost app remove django-for-runners -``` - -Backup / remove / restore cycle, e.g.: -```bash -yunohost backup create --apps django-for-runners -yunohost backup list -archives: - - django-for-runners-pre-upgrade1 - - 20201223-163434 -yunohost app remove django-for-runners -yunohost backup restore 20201223-163434 --apps django-for-runners -``` - -Debug installation, e.g.: -```bash -root@yunohost:~# ls -la /var/www/django-for-runners/ -total 18 -drwxr-xr-x 4 root root 4 Dec 8 08:36 . -drwxr-xr-x 6 root root 6 Dec 8 08:36 .. -drwxr-xr-x 2 root root 2 Dec 8 08:36 media -drwxr-xr-x 7 root root 8 Dec 8 08:40 static - -root@yunohost:~# ls -la /opt/yunohost/django-for-runners/ -total 58 -drwxr-xr-x 5 django-for-runners django-for-runners 11 Dec 8 08:39 . -drwxr-xr-x 3 root root 3 Dec 8 08:36 .. --rw-r--r-- 1 django-for-runners django-for-runners 460 Dec 8 08:39 gunicorn.conf.py --rw-r--r-- 1 django-for-runners django-for-runners 0 Dec 8 08:39 local_settings.py --rwxr-xr-x 1 django-for-runners django-for-runners 274 Dec 8 08:39 manage.py --rw-r--r-- 1 django-for-runners django-for-runners 171 Dec 8 08:39 secret.txt -drwxr-xr-x 6 django-for-runners django-for-runners 6 Dec 8 08:37 venv --rw-r--r-- 1 django-for-runners django-for-runners 115 Dec 8 08:39 wsgi.py --rw-r--r-- 1 django-for-runners django-for-runners 4737 Dec 8 08:39 settings.py - -root@yunohost:~# cd /opt/yunohost/django-for-runners/ -root@yunohost:/opt/yunohost/django-for-runners# source venv/bin/activate -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py check -django-for-runners v0.8.2 (Django v2.2.17) -DJANGO_SETTINGS_MODULE='settings' -PROJECT_PATH:/opt/yunohost/django-for-runners/venv/lib/python3.7/site-packages -BASE_PATH:/opt/yunohost/django-for-runners -System check identified no issues (0 silenced). - -root@yunohost:~# tail -f /var/log/django-for-runners/django-for-runners.log -root@yunohost:~# cat /etc/systemd/system/django-for-runners.service - -root@yunohost:~# systemctl reload-or-restart django-for-runners -root@yunohost:~# systemctl status django-for-runners -root@yunohost:~# journalctl --unit=for_runners --follow -``` - -## local test - -For quicker developing of django-for-runners in the context of YunoHost app, -it's possible to run the Django developer server with the settings -and urls made for YunoHost installation. - -e.g.: -```bash -~$ git clone https://github.com/YunoHost-Apps/django-for-runners_ynh.git -~$ cd django-for-runners_ynh/ -~/django-for-runners_ynh$ make -install-poetry install or update poetry -install install django-for-runners via poetry -update update the sources and installation -local-test Run local_test.py to run django-for-runners_ynh locally -~/django-for-runners_ynh$ make install-poetry -~/django-for-runners_ynh$ make install -~/django-for-runners_ynh$ make local-test -``` - -Notes: - -* SQlite database will be used -* A super user with username `test` and password `test` is created -* The page is available under `http://127.0.0.1:8000/app_path/` - ## Documentación e recursos -- Web oficial da app: - Documentación oficial para usuarias: - Documentación oficial para admin: - Repositorio de orixe do código: diff --git a/README_zh_Hans.md b/README_zh_Hans.md new file mode 100644 index 0000000..75708e5 --- /dev/null +++ b/README_zh_Hans.md @@ -0,0 +1,62 @@ + + +# YunoHost 上的 django-for-runners + +[![集成程度](https://dash.yunohost.org/integration/django-for-runners.svg)](https://dash.yunohost.org/appci/app/django-for-runners) ![工作状态](https://ci-apps.yunohost.org/ci/badges/django-for-runners.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/django-for-runners.maintain.svg) + +[![使用 YunoHost 安装 django-for-runners](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=django-for-runners) + +*[阅读此 README 的其它语言版本。](./ALL_README.md)* + +> *通过此软件包,您可以在 YunoHost 服务器上快速、简单地安装 django-for-runners。* +> *如果您还没有 YunoHost,请参阅[指南](https://yunohost.org/install)了解如何安装它。* + +## 概况 + +[![tests](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml) +[![codecov](https://codecov.io/github/jedie/for_runners_ynh/branch/main/graph/badge.svg)](https://app.codecov.io/github/jedie/for_runners_ynh) +[![for_runners_ynh @ PyPi](https://img.shields.io/pypi/v/for_runners_ynh?label=for_runners_ynh%20%40%20PyPi)](https://pypi.org/project/for_runners_ynh/) +[![Python Versions](https://img.shields.io/pypi/pyversions/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/pyproject.toml) +[![License GPL-3.0-or-later](https://img.shields.io/pypi/l/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/LICENSE) + +[django-for-runners](https://github.com/jedie/django-for-runners) is a libre web-based management for your GPX tracks of your running (or other sports activity). Used [Python](https://www.python.org/)/[Django](https://www.djangoproject.com/). + +Pull requests welcome ;) + +This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration) + +More screenshots are here: [jedie.github.io/tree/master/screenshots/django-for-runners](https://github.com/jedie/jedie.github.io/tree/master/screenshots/django-for-runners/README.creole) + + +**分发版本:** 0.17.4~ynh1 + +## 截图 + +![django-for-runners 的截图](./doc/screenshots/for_runers_v060_2018_07_31_gpx_track.png) +![django-for-runners 的截图](./doc/screenshots/for_runners_v060_2018_07_19_event_costs.png) +![django-for-runners 的截图](./doc/screenshots/for_runners_v040_2018_6_26_gpx_info.png) + +## 文档与资源 + +- 官方用户文档: +- 官方管理文档: +- 上游应用代码库: +- YunoHost 商店: +- 报告 bug: + +## 开发者信息 + +请向 [`testing` 分支](https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing) 发送拉取请求。 + +如要尝试 `testing` 分支,请这样操作: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug +或 +sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug +``` + +**有关应用打包的更多信息:** diff --git a/conf/requirements.txt b/conf/requirements.txt index 717f82d..70ed669 100644 --- a/conf/requirements.txt +++ b/conf/requirements.txt @@ -21,9 +21,9 @@ bleach==6.1.0 \ --hash=sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe \ --hash=sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6 # via django-tools -bx-django-utils==67 \ - --hash=sha256:8740fdaf98ed68a8ddb3af025d9b4f87c99101405898ddca86810b0c384b215a \ - --hash=sha256:aca0ae5c91a62e4f594172b8c43468c701516f99ae50d99412d5299ba375df03 +bx-django-utils==69 \ + --hash=sha256:39e96b8ad47bcf36d6713e4e42c8d09deb21e413160dc2944f17b7d2e2244713 \ + --hash=sha256:59b806aa36b50184f14bd0f7a61fb66c478fa231a44f92472360ce0cf1616013 # via django-for-runners bx-py-utils==88 \ --hash=sha256:32fbc7e9ff3dfb0a817c80fb1d165ec559643dab59c0be549e646acbf8223b75 \ @@ -33,9 +33,9 @@ bx-py-utils==88 \ # cli-base-utilities # django-for-runners # django-tools -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2023.11.17 \ + --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ + --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ @@ -241,9 +241,9 @@ django-for-runners==0.17.4 \ --hash=sha256:ceecf3ed00e372cb012e1635fb6388675ecf92e2125c6782a4c41fd5b4c3d96a \ --hash=sha256:fbf2498ddac8a18b241f8b05a1d03288984a11714009d1312cf17b48517f08de # via for-runners-ynh (pyproject.toml) -django-import-export==3.3.2 \ - --hash=sha256:9a5c7c191014e4defb01573ee94864b60724a203f1b8a7e5e67a03f06b27b62d \ - --hash=sha256:d13e7508190f46442280bd7d04efcf49af6521350a70a6f9e06447ef28d6a41d +django-import-export==3.3.3 \ + --hash=sha256:2c1b16e1cf2ea5f62a165d8867e7c6dcff25673ab7201fd18aaf67c9ee90367e \ + --hash=sha256:78973202e93897326ab0411d64eaf89b72779fcb21ee9e5f64f3fb96571a5978 # via django-for-runners django-processinfo==1.1.0 \ --hash=sha256:c7d1fe2203655925294c860878509fe2a6eb1a5390a170c848023e4619b903da \ @@ -271,57 +271,57 @@ et-xmlfile==1.1.0 \ --hash=sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c \ --hash=sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada # via openpyxl -fonttools==4.44.0 \ - --hash=sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e \ - --hash=sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5 \ - --hash=sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e \ - --hash=sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2 \ - --hash=sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b \ - --hash=sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4 \ - --hash=sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97 \ - --hash=sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111 \ - --hash=sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252 \ - --hash=sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf \ - --hash=sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189 \ - --hash=sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b \ - --hash=sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e \ - --hash=sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267 \ - --hash=sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20 \ - --hash=sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165 \ - --hash=sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2 \ - --hash=sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc \ - --hash=sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400 \ - --hash=sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928 \ - --hash=sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a \ - --hash=sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5 \ - --hash=sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d \ - --hash=sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2 \ - --hash=sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb \ - --hash=sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0 \ - --hash=sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2 \ - --hash=sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335 \ - --hash=sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae \ - --hash=sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287 \ - --hash=sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d \ - --hash=sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b \ - --hash=sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39 \ - --hash=sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040 \ - --hash=sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d \ - --hash=sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c \ - --hash=sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86 \ - --hash=sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c \ - --hash=sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3 \ - --hash=sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d \ - --hash=sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219 \ - --hash=sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5 +fonttools==4.45.1 \ + --hash=sha256:03ed3bda541e86725f6b4e1b94213f13ed1ae51a5a1f167028534cedea38c010 \ + --hash=sha256:0dc7617d96b1e668eea9250e1c1fe62d0c78c3f69573ce7e3332cc40e6d84356 \ + --hash=sha256:105099968b58a5b4cef6f3eb409db8ea8578b302a9d05e23fecba1b8b0177b5f \ + --hash=sha256:1b9e9ad2bcded9a1431afaa57c8d3c39143ac1f050862d66bddd863c515464a2 \ + --hash=sha256:1f53a19dcdd5737440839b8394eeebb35da9ec8109f7926cb6456639b5b58e47 \ + --hash=sha256:21e96b99878348c74aa58059b8578d7586f9519cbcdadacf56486737038aa043 \ + --hash=sha256:2c980d60cd6ec1376206fe55013d166e5627ad0b149b5c81e74eaa913ab6134f \ + --hash=sha256:316cec50581e844c3ab69d7c82455b54c7cf18236b2f09e722faf665fbfcac58 \ + --hash=sha256:37cd1ced6efb3dd6fe82e9f9bf92fd74ac58a5aefc284045f59ecd517a5fb9ab \ + --hash=sha256:392d0e3cc23daee910193625f7cf1b387aff9dd5b6f1a5f4a925680acb6dcbc2 \ + --hash=sha256:3bdd7dfca8f6c9f4779384064027e8477ad6a037d6a327b09381f43e0247c6f3 \ + --hash=sha256:43a3d267334109ff849c37cf3629476b5feb392ef1d2e464a167b83de8cd599c \ + --hash=sha256:45fa321c458ea29224067700954ec44493ae869b47e7c5485a350a149a19fb53 \ + --hash=sha256:46eabddec12066829b8a1efe45ae552ba2f1796981ecf538d5f68284c354c589 \ + --hash=sha256:4b9544b1346d99848ac0e9b05b5d45ee703d7562fc4c9c48cf4b781de9632e57 \ + --hash=sha256:4ba17822a6681d06849078daaf6e03eccc9f467efe7c4c60280e28a78e8e5df9 \ + --hash=sha256:5a17706b9cc24b27721613fe5773d93331ab7f0ecaca9955aead89c6b843d3a7 \ + --hash=sha256:5cbf02cda8465b69769d07385f5d11e7bba19954e7787792f46fe679ec755ebb \ + --hash=sha256:6e441286d55fe7ec7c4fb36812bf914924813776ff514b744b510680fc2733f2 \ + --hash=sha256:6eb2c54f7a07c92108daabcf02caf31df97825738db02a28270633946bcda4d0 \ + --hash=sha256:777ba42b94a27bb7fb2b4082522fccfd345667c32a56011e1c3e105979af5b79 \ + --hash=sha256:794de93e83297db7b4943f2431e206d8b1ea69cb3ae14638a49cc50332bf0db8 \ + --hash=sha256:800e354e0c3afaeb8d9552769773d02f228e98c37b8cb03041157c3d0687cffc \ + --hash=sha256:847f3f49dd3423e5a678c098e2ba92c7f4955d4aab3044f6a507b0bb0ecb07e0 \ + --hash=sha256:8717db3e4895e4820ade64ea379187738827ee60748223cb0438ef044ee208c6 \ + --hash=sha256:8b07b857d4f9de3199a8c3d1b1bf2078c0f37447891ca1a8d9234106b9a27aff \ + --hash=sha256:8e1aefc2bf3c43e0f33f995f828a7bbeff4adc9393a7760b11456dbcf14388f6 \ + --hash=sha256:a12dee6523c02ca78aeedd0a5e12bfa9b7b29896350edd5241542897b072ae23 \ + --hash=sha256:a3c11d9687479f01eddef729aa737abcdea0a44fdaffb62a930a18892f186c9b \ + --hash=sha256:b6de2f0fcd3302fb82f94801002cb473959e998c14c24ec28234adb674aed345 \ + --hash=sha256:ba299f1fbaa2a1e33210aaaf6fa816d4059e4d3cfe2ae9871368d4ab548c1c6a \ + --hash=sha256:ba6c23591427844dfb0a13658f1718489de75de6a46b64234584c0d17573162d \ + --hash=sha256:c4f4a5870e3b56788fb196da8cf30d0dfd51a76dc3b907861d018165f76ae4c2 \ + --hash=sha256:cb472905da3049960e80fc1cf808231880d79727a8410e156bf3e5063a1c574f \ + --hash=sha256:cebcddbe9351b67166292b4f71ffdbfcce01ba4b07d4267824eb46b277aeb19a \ + --hash=sha256:e2277cba9f0b525e30de2a9ad3cb4219aa4bc697230c1645666b0deee9f914f0 \ + --hash=sha256:e29d5f298d616a93a4c5963682dc6cc8cc09f6d89cad2c29019fc5fb3b4d9472 \ + --hash=sha256:e3d24248221bd7151dfff0d88b1b5da02dccd7134bd576ce8888199827bbaa19 \ + --hash=sha256:e50f794d09df0675da8d9dbd7c66bfcab2f74a708343aabcad41936d26556891 \ + --hash=sha256:f22eb69996a0bd49f76bdefb30be54ce8dbb89a0d1246874d610f05c2aa2e69e \ + --hash=sha256:fb36e5f40191274a95938b40c0a1fa7f895e36935aea8709e1d6deff0b2d0d4f \ + --hash=sha256:ff6a698bdd435d24c379f6e8a54908cd9bb7dda23719084d56bf8c87709bf3bd # via matplotlib geographiclib==2.0 \ --hash=sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734 \ --hash=sha256:f7f41c85dc3e1c2d3d935ec86660dc3b2c848c83e17f9a9e51ba9d5146a15859 # via geopy -geopy==2.4.0 \ - --hash=sha256:a59392bf17adb486b25dbdd71fbed27733bdf24a2dac588047a619de56695e36 \ - --hash=sha256:d2639a46d0ce4c091e9688b750ba94348a14b898a1e55c68f4b4a07e7d1afa20 +geopy==2.4.1 \ + --hash=sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1 \ + --hash=sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7 # via django-for-runners gpxpy==1.6.1 \ --hash=sha256:473ff2fa17af6913a9879599cb6fe9c7a30fa1698898feff21a825447ee52fba \ @@ -337,9 +337,9 @@ icdiff==2.0.7 \ --hash=sha256:f05d1b3623223dd1c70f7848da7d699de3d9a2550b902a8234d9026292fb5762 \ --hash=sha256:f79a318891adbf59a45e3a7694f5e1f18c5407065264637072ac8363b759866f # via django-tools -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.6 \ + --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ + --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via requests importlib-resources==6.1.1 \ --hash=sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a \ @@ -552,73 +552,77 @@ markdown-it-py==3.0.0 \ markuppy==1.14 \ --hash=sha256:1adee2c0a542af378fe84548ff6f6b0168f3cb7f426b46961038a2bcfaad0d5f # via tablib -matplotlib==3.8.1 \ - --hash=sha256:044df81c1f6f3a8e52d70c4cfcb44e77ea9632a10929932870dfaa90de94365d \ - --hash=sha256:0d24c47a1bb47e392fbcd26fe322e4ff3431653ac1e8718e4e147d450ae97a44 \ - --hash=sha256:1fcb49b6baf0375281979cbf26695ec10bd1cada1e311893e89533b3b70143e7 \ - --hash=sha256:20a0fdfd3ee836179047f3782be060057b878ad37f5abe29edf006a1ff3ecd73 \ - --hash=sha256:27502d2452208ae784c19504644f09f83742809143bbeae147617640930aa344 \ - --hash=sha256:2afe7d2f8c9e35e94fbcfcfd9b28f29cb32f0a9068cba469cf907428379c8db9 \ - --hash=sha256:43a9d40feb63c9e31a0b8b069dcbd74a912f59bdc0095d187126694cd26977e4 \ - --hash=sha256:43cf368a4a1d8cbc426944806e5e183cead746647a64d2cdb786441546235967 \ - --hash=sha256:608ea2951838d391e45dec2e644888db6899c752d3c29e157af9dcefb3d7d8d5 \ - --hash=sha256:7658b7073c1d6a2922ecc0ed41602410fae88586cb8a54f7a2063d537b6beaf7 \ - --hash=sha256:7f99d07c0e753717775be7be39ab383453b4d8b629c9fa174596b970c6555890 \ - --hash=sha256:82ec95b02e894561c21e066bd0c716e4b410df141ce9441aa5af6cd937e4ade2 \ - --hash=sha256:afb72822ae410d62aa1a2920c6563cb5680de9078358f0e9474396c6c3e06be2 \ - --hash=sha256:bf6889643d4560fcc56f9f0941f078e4df0d72a6c3e4ca548841fc13c5642664 \ - --hash=sha256:c1b0ecaa0d1f4fe1e30f625a2347f0034a89a7d17c39efbb502e554d92ee2f61 \ - --hash=sha256:c54c55457c7f5ea4dfdba0020004fc7667f5c10c8d9b8010d735345acc06c9b8 \ - --hash=sha256:ca84deaa38cb64b7dd160ca2046b45f7b5dbff2b0179642e1339fadc337446c9 \ - --hash=sha256:cd54bbf089953140905768ed4626d7223e1ad1d7e2a138410a9c4d3b865ccd80 \ - --hash=sha256:d921c0270647ab11c3ef283efaaa3d46fd005ba233bfb3aea75231cdf3656de8 \ - --hash=sha256:e11ab864323fa73ac1b7849688d9671c47a2665242e899785b4db1a375b547e1 \ - --hash=sha256:e17674ee127f78f26fea237e7f4d5cf910a8be82beb6260fedf358b88075b823 \ - --hash=sha256:e3ad1759ad4a5245172c6d32b8ada603a6020d03211524c39d78d25c9a7dc0d2 \ - --hash=sha256:e3bb809b743653b5aab5d72ee45c8c937c28e147b0846b0826a54bece898608c \ - --hash=sha256:e5a504ff40f81d6233603475a45497a6dca37a873393fa20ae6f7dd6596ef72b \ - --hash=sha256:ed3b29f54f6bbf3eaca4cbd23bc260155153ace63b7f597c474fa6fc6f386530 \ - --hash=sha256:f34b46dbb1db1f09bfa937cd5853e5f2af232caeeff509c3ab6e43fd33780eae \ - --hash=sha256:f55fb5ff02d999a100be28bf6ffe826e1867a54c7b465409685332c9dd48ffa5 \ - --hash=sha256:ff842e27bc6a80de08c40e0bfdce460bd08080e8a94af131162b6a1b8948f2cc +matplotlib==3.8.2 \ + --hash=sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1 \ + --hash=sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0 \ + --hash=sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4 \ + --hash=sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7 \ + --hash=sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630 \ + --hash=sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89 \ + --hash=sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d \ + --hash=sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717 \ + --hash=sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a \ + --hash=sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627 \ + --hash=sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31 \ + --hash=sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213 \ + --hash=sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843 \ + --hash=sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788 \ + --hash=sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367 \ + --hash=sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4 \ + --hash=sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a \ + --hash=sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8 \ + --hash=sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b \ + --hash=sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18 \ + --hash=sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6 \ + --hash=sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa \ + --hash=sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917 \ + --hash=sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20 \ + --hash=sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331 \ + --hash=sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63 \ + --hash=sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f \ + --hash=sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8 # via django-for-runners mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba # via markdown-it-py -numpy==1.26.1 \ - --hash=sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668 \ - --hash=sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9 \ - --hash=sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f \ - --hash=sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5 \ - --hash=sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53 \ - --hash=sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2 \ - --hash=sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974 \ - --hash=sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f \ - --hash=sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42 \ - --hash=sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2 \ - --hash=sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af \ - --hash=sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67 \ - --hash=sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e \ - --hash=sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c \ - --hash=sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7 \ - --hash=sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e \ - --hash=sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908 \ - --hash=sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66 \ - --hash=sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24 \ - --hash=sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b \ - --hash=sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e \ - --hash=sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe \ - --hash=sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a \ - --hash=sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575 \ - --hash=sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297 \ - --hash=sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104 \ - --hash=sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab \ - --hash=sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3 \ - --hash=sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244 \ - --hash=sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124 \ - --hash=sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617 \ - --hash=sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c +numpy==1.26.2 \ + --hash=sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a \ + --hash=sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6 \ + --hash=sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2 \ + --hash=sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79 \ + --hash=sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9 \ + --hash=sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919 \ + --hash=sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d \ + --hash=sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060 \ + --hash=sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75 \ + --hash=sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f \ + --hash=sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe \ + --hash=sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167 \ + --hash=sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef \ + --hash=sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75 \ + --hash=sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3 \ + --hash=sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7 \ + --hash=sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7 \ + --hash=sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d \ + --hash=sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b \ + --hash=sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186 \ + --hash=sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0 \ + --hash=sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1 \ + --hash=sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6 \ + --hash=sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e \ + --hash=sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523 \ + --hash=sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36 \ + --hash=sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841 \ + --hash=sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818 \ + --hash=sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00 \ + --hash=sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80 \ + --hash=sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440 \ + --hash=sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210 \ + --hash=sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8 \ + --hash=sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea \ + --hash=sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec \ + --hash=sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841 # via # contourpy # matplotlib @@ -711,9 +715,9 @@ psycopg2==2.9.9 \ --hash=sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913 \ --hash=sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c # via django-yunohost-integration -pygments==2.16.1 \ - --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ - --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 +pygments==2.17.2 \ + --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ + --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 # via rich pyparsing==3.1.1 \ --hash=sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb \ @@ -793,9 +797,9 @@ requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 # via django-for-runners -rich==13.6.0 \ - --hash=sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245 \ - --hash=sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef +rich==13.7.0 \ + --hash=sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa \ + --hash=sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235 # via # cli-base-utilities # django-rich @@ -826,9 +830,9 @@ tablib[html,ods,xls,xlsx,yaml]==3.5.0 \ # via # django-import-export # tablib -tomlkit==0.12.2 \ - --hash=sha256:df32fab589a81f0d7dc525a4267b6d7a64ee99619cbd1eeb0fae32c1dd426977 \ - --hash=sha256:eeea7ac7563faeab0a1ed8fe12c2e5a51c61f933f2502f7e9db0241a65163ad0 +tomlkit==0.12.3 \ + --hash=sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4 \ + --hash=sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba # via cli-base-utilities typing-extensions==4.8.0 \ --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ @@ -836,9 +840,9 @@ typing-extensions==4.8.0 \ # via # asgiref # rich-click -urllib3==2.0.7 \ - --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ - --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e +urllib3==2.1.0 \ + --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ + --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 # via requests webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ @@ -854,7 +858,7 @@ xlwt==1.3.0 \ # via tablib # The following packages are considered to be unsafe in a requirements file: -setuptools==68.2.2 \ - --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ - --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a +setuptools==69.0.2 \ + --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ + --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 # via django-axes diff --git a/conf/settings.py b/conf/settings.py index f16f24b..1c38a43 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -40,7 +40,7 @@ YNH_CURRENT_HOST = '__YNH_CURRENT_HOST__' # YunoHost main domain from: /etc/yun # config_panel.toml settings: DEBUG_ENABLED = '__DEBUG_ENABLED__' -DEBUG = DEBUG_ENABLED == 'YES' +DEBUG = DEBUG_ENABLED == '1' LOG_LEVEL = '__LOG_LEVEL__' ADMIN_EMAIL = '__ADMIN_EMAIL__' diff --git a/doc/ADMIN.md b/doc/ADMIN.md new file mode 100644 index 0000000..78f46de --- /dev/null +++ b/doc/ADMIN.md @@ -0,0 +1,60 @@ +## Settings and upgrades + +Almost everything related to django-for-runners's configuration is handled in a `"../conf/settings.py"` file. +You can edit the file `/home/yunohost.app/django_example/local_settings.py` to enable or disable features. + +Test sending emails, e.g.: + +```bash +ssh admin@yourdomain.tld +root@yunohost:~# /home/yunohost.app/django_for_runners/manage.py sendtestemail --admins +``` + +How to debug a django YunoHost app, take a look into: + +* https://github.com/YunoHost-Apps/django-for-runners_ynh#developer-info + +## local test + +For quicker developing of for_runners_ynh in the context of YunoHost app, +it's possible to run the Django developer server with the settings +and urls made for YunoHost installation. + +e.g.: +```bash +~$ git clone https://github.com/YunoHost-Apps/django_example.git +~$ cd for_runners_ynh/ +~/django_example$ ./dev-cli.py --help +``` + + +The output will looks like: + +[comment]: <> (✂✂✂ auto generated help start ✂✂✂) +``` +Usage: ./dev-cli.py [OPTIONS] COMMAND [ARGS]... + +╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮ +│ --help Show this message and exit. │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────╮ +│ check-code-style Check code style by calling darker + flake8 │ +│ coverage Run and show coverage. │ +│ diffsettings Run "diffsettings" manage command against a "local_test" YunoHost │ +│ installation. │ +│ fix-code-style Fix code style of all for_runners_ynh source code files via darker │ +│ install Run pip-sync and install 'for_runners_ynh' via pip as editable. │ +│ local-test Build a "local_test" YunoHost installation and start the Django dev. │ +│ server against it. │ +│ mypy Run Mypy (configured in pyproject.toml) │ +│ publish Build and upload this project to PyPi │ +│ safety Run safety check against current requirements files │ +│ test Compile YunoHost files and run Django unittests │ +│ tox Run tox │ +│ update Update "requirements*.txt" dependencies files │ +│ update-test-snapshot-files Update all test snapshot files (by remove and recreate all snapshot │ +│ files) │ +│ version Print version and exit │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ +``` +[comment]: <> (✂✂✂ auto generated help end ✂✂✂) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 3b199b2..814bac5 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,14 +1,11 @@ -![Logo](https://raw.githubusercontent.com/jedie/django-for-runners/main/for_runners/static/Django-ForRunners128.png) +[![tests](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/tests.yml) +[![codecov](https://codecov.io/github/jedie/for_runners_ynh/branch/main/graph/badge.svg)](https://app.codecov.io/github/jedie/for_runners_ynh) +[![for_runners_ynh @ PyPi](https://img.shields.io/pypi/v/for_runners_ynh?label=for_runners_ynh%20%40%20PyPi)](https://pypi.org/project/for_runners_ynh/) +[![Python Versions](https://img.shields.io/pypi/pyversions/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/pyproject.toml) +[![License GPL-3.0-or-later](https://img.shields.io/pypi/l/for_runners_ynh)](https://github.com/YunoHost-Apps/django-for-runners_ynh/blob/main/LICENSE) [django-for-runners](https://github.com/jedie/django-for-runners) is a libre web-based management for your GPX tracks of your running (or other sports activity). Used [Python](https://www.python.org/)/[Django](https://www.djangoproject.com/). - -[![pytest](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/pytest.yml/badge.svg?branch=master)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/pytest.yml) [![YunoHost apps package linter](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/package_linter.yml/badge.svg)](https://github.com/YunoHost-Apps/django-for-runners_ynh/actions/workflows/package_linter.yml) [![Coverage Status on codecov.io](https://codecov.io/gh/YunoHost-Apps/django-for-runners_ynh/branch/master/graph/badge.svg)](https://codecov.io/gh/YunoHost-Apps/django-for-runners_ynh) - -![django-for-runners @ PyPi](https://img.shields.io/pypi/v/django-for-runners?label=django-for-runners%20%40%20PyPi) -![Python Versions](https://img.shields.io/pypi/pyversions/django-for-runners) -![License GPL V3+](https://img.shields.io/pypi/l/django-for-runners) - Pull requests welcome ;) This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration) diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md deleted file mode 100644 index 8b2ab88..0000000 --- a/doc/DISCLAIMER.md +++ /dev/null @@ -1,153 +0,0 @@ -## Settings and upgrades - -Almost everything related to django-for-runners's configuration is handled in a `"../conf/settings.py"` file. -You can edit the file `/opt/yunohost/django-for-runners/local_settings.py` to enable or disable features. - -Test sending emails: - -```bash -ssh admin@yourdomain.tld -root@yunohost:~# cd /opt/yunohost/django-for-runners/ -root@yunohost:/opt/yunohost/django-for-runners# source venv/bin/activate -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py sendtestemail --admins -``` - -Background info: Error mails are send to all [settings.ADMINS](https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-ADMINS). By default the YunoHost admin is inserted here. -To check current ADMINS run: - -```bash -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py sendtestemail --admins -``` - -If you prefere to send error emails to a extrnal email address, just do something like this: - -```bash -echo "ADMINS = (('Your Name', 'example@domain.tld'),)" >> /opt/yunohost/django-for-runners/local_settings.py -``` - -To check the effective settings, run this: -```bash -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py diffsettings -``` - - -# Miscellaneous - - -## SSO authentication - -[SSOwat](https://github.com/YunoHost/SSOwat) is fully supported via [django_ynh](https://github.com/YunoHost-Apps/django_ynh): - -* First user (`$YNH_APP_ARG_ADMIN`) will be created as Django's super user -* All new users will be created as normal users -* Login via SSO is fully supported -* User Email, First / Last name will be updated from SSO data - - -## Links - - * Report a bug about this package: https://github.com/YunoHost-Apps/django-for-runners_ynh - * Report a bug about django-for-runners itself: https://github.com/jedie/django-for-runners - * YunoHost website: https://yunohost.org/ - ---- - -# Developer info - -## package installation / debugging - -Please send your pull request to https://github.com/YunoHost-Apps/django-for-runners_ynh - -Try 'main' branch, e.g.: -```bash -sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/master --debug -or -sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/master --debug -``` - -Try 'testing' branch, e.g.: -```bash -sudo yunohost app install https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug -or -sudo yunohost app upgrade django-for-runners -u https://github.com/YunoHost-Apps/django-for-runners_ynh/tree/testing --debug -``` - -To remove call e.g.: -```bash -sudo yunohost app remove django-for-runners -``` - -Backup / remove / restore cycle, e.g.: -```bash -yunohost backup create --apps django-for-runners -yunohost backup list -archives: - - django-for-runners-pre-upgrade1 - - 20201223-163434 -yunohost app remove django-for-runners -yunohost backup restore 20201223-163434 --apps django-for-runners -``` - -Debug installation, e.g.: -```bash -root@yunohost:~# ls -la /var/www/django-for-runners/ -total 18 -drwxr-xr-x 4 root root 4 Dec 8 08:36 . -drwxr-xr-x 6 root root 6 Dec 8 08:36 .. -drwxr-xr-x 2 root root 2 Dec 8 08:36 media -drwxr-xr-x 7 root root 8 Dec 8 08:40 static - -root@yunohost:~# ls -la /opt/yunohost/django-for-runners/ -total 58 -drwxr-xr-x 5 django-for-runners django-for-runners 11 Dec 8 08:39 . -drwxr-xr-x 3 root root 3 Dec 8 08:36 .. --rw-r--r-- 1 django-for-runners django-for-runners 460 Dec 8 08:39 gunicorn.conf.py --rw-r--r-- 1 django-for-runners django-for-runners 0 Dec 8 08:39 local_settings.py --rwxr-xr-x 1 django-for-runners django-for-runners 274 Dec 8 08:39 manage.py --rw-r--r-- 1 django-for-runners django-for-runners 171 Dec 8 08:39 secret.txt -drwxr-xr-x 6 django-for-runners django-for-runners 6 Dec 8 08:37 venv --rw-r--r-- 1 django-for-runners django-for-runners 115 Dec 8 08:39 wsgi.py --rw-r--r-- 1 django-for-runners django-for-runners 4737 Dec 8 08:39 settings.py - -root@yunohost:~# cd /opt/yunohost/django-for-runners/ -root@yunohost:/opt/yunohost/django-for-runners# source venv/bin/activate -(venv) root@yunohost:/opt/yunohost/django-for-runners# ./manage.py check -django-for-runners v0.8.2 (Django v2.2.17) -DJANGO_SETTINGS_MODULE='settings' -PROJECT_PATH:/opt/yunohost/django-for-runners/venv/lib/python3.7/site-packages -BASE_PATH:/opt/yunohost/django-for-runners -System check identified no issues (0 silenced). - -root@yunohost:~# tail -f /var/log/django-for-runners/django-for-runners.log -root@yunohost:~# cat /etc/systemd/system/django-for-runners.service - -root@yunohost:~# systemctl reload-or-restart django-for-runners -root@yunohost:~# systemctl status django-for-runners -root@yunohost:~# journalctl --unit=for_runners --follow -``` - -## local test - -For quicker developing of django-for-runners in the context of YunoHost app, -it's possible to run the Django developer server with the settings -and urls made for YunoHost installation. - -e.g.: -```bash -~$ git clone https://github.com/YunoHost-Apps/django-for-runners_ynh.git -~$ cd django-for-runners_ynh/ -~/django-for-runners_ynh$ make -install-poetry install or update poetry -install install django-for-runners via poetry -update update the sources and installation -local-test Run local_test.py to run django-for-runners_ynh locally -~/django-for-runners_ynh$ make install-poetry -~/django-for-runners_ynh$ make install -~/django-for-runners_ynh$ make local-test -``` - -Notes: - -* SQlite database will be used -* A super user with username `test` and password `test` is created -* The page is available under `http://127.0.0.1:8000/app_path/` diff --git a/for_runners_ynh/cli/dev.py b/for_runners_ynh/cli/dev.py index 92d4495..1d5cfe2 100644 --- a/for_runners_ynh/cli/dev.py +++ b/for_runners_ynh/cli/dev.py @@ -2,14 +2,17 @@ CLI for development """ import logging +import os import sys from pathlib import Path +import django import rich_click as click from bx_py_utils.path import assert_is_file from cli_base.cli_tools.subprocess_utils import verbose_check_call from cli_base.cli_tools.version_info import print_version -from django_yunohost_integration.local_test import create_local_test +from django.core.management.commands.test import Command as DjangoTestCommand +from django_yunohost_integration.local_test import CreateResults, create_local_test from manageprojects.utilities import code_style from manageprojects.utilities.publish import publish_package from rich import print # noqa; noqa @@ -42,6 +45,7 @@ ARGUMENT_NOT_EXISTING_DIR = dict( ARGUMENT_EXISTING_FILE = dict( type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True, path_type=Path) ) +CLI_EPILOG = 'Project Homepage: https://github.com/YunoHost-Apps/django-for-runners_ynh' class ClickGroup(RichGroup): # FIXME: How to set the "info_name" easier? @@ -50,10 +54,7 @@ class ClickGroup(RichGroup): # FIXME: How to set the "info_name" easier? return super().make_context(info_name, *args, **kwargs) -@click.group( - cls=ClickGroup, - epilog='Project Homepage: https://github.com/YunoHost-Apps/django-for-runners_ynh', -) +@click.group(cls=ClickGroup, epilog=CLI_EPILOG) def cli(): pass @@ -76,7 +77,7 @@ def coverage(verbose: bool = True): """ verbose_check_call('coverage', 'run', verbose=verbose, exit_on_error=True) verbose_check_call('coverage', 'combine', '--append', verbose=verbose, exit_on_error=True) - verbose_check_call('coverage', 'report', '--fail-under=30', verbose=verbose, exit_on_error=True) + verbose_check_call('coverage', 'report', '--fail-under=10', verbose=verbose, exit_on_error=True) verbose_check_call('coverage', 'xml', verbose=verbose, exit_on_error=True) verbose_check_call('coverage', 'json', verbose=verbose, exit_on_error=True) @@ -163,7 +164,10 @@ def publish(): """ Build and upload this project to PyPi """ - _run_unittest_cli(verbose=False, exit_after_run=False) # Don't publish a broken state + try: + _run_django_test_cli() # Don't publish a broken state + except SystemExit as err: + assert err.code == 0, f'Exit code is not 0: {err.code}' publish_package( module=for_runners_ynh, @@ -217,64 +221,59 @@ def update_test_snapshot_files(): print(f'{removed_file_count} test snapshot files removed... run tests...') # Just recreate them by running tests: - _run_unittest_cli( - extra_env=dict( - RAISE_SNAPSHOT_ERRORS='0', # Recreate snapshot files without error - ), - verbose=False, - exit_after_run=False, - ) - - new_files = len(list(iter_snapshot_files())) - print(f'{new_files} test snapshot files created, ok.\n') + os.environ['RAISE_SNAPSHOT_ERRORS'] = '0' # Recreate snapshot files without error + try: + _run_django_test_cli() + finally: + new_files = len(list(iter_snapshot_files())) + print(f'{new_files} test snapshot files created, ok.\n') cli.add_command(update_test_snapshot_files) -def _run_unittest_cli(extra_env=None, verbose=True, exit_after_run=True): +def _run_django_test_cli(): """ - Call the origin unittest CLI and pass all args to it. + Call the origin Django test manage command CLI and pass all args to it. """ - if extra_env is None: - extra_env = dict() + os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' - extra_env.update( - dict( - PYTHONUNBUFFERED='1', - PYTHONWARNINGS='always', - ) + print('Compile YunoHost files...') + result: CreateResults = create_local_test( + django_settings_path=PACKAGE_ROOT / 'conf' / 'settings.py', + destination=PACKAGE_ROOT / 'local_test', + runserver=False, + extra_replacements={ + '__DEBUG_ENABLED__': '0', # "1" or "0" string + '__LOG_LEVEL__': 'INFO', + '__ADMIN_EMAIL__': 'foo-bar@test.tld', + '__DEFAULT_FROM_EMAIL__': 'django_app@test.tld', + }, ) + print('Local test files created:') + print(result) - args = sys.argv[2:] - if not args: - if verbose: - args = ('--verbose', '--locals', '--buffer') - else: - args = ('--locals', '--buffer') + data_dir = str(result.data_dir_path) + if data_dir not in sys.path: + sys.path.insert(0, data_dir) - verbose_check_call( - sys.executable, - '-m', - 'unittest', - *args, - timeout=15 * 60, - extra_env=extra_env, - ) - if exit_after_run: - sys.exit(0) + django.setup() + + os.chdir(Path(for_runners_ynh.__file__).parent) + + test_command = DjangoTestCommand() + test_command.run_from_argv(sys.argv) @click.command() # Dummy command def test(): """ - Run unittests + Compile YunoHost files and run Django unittests """ - _run_unittest_cli() + _run_django_test_cli() -# TODO: Replace pytest with normal Django unittests: -# cli.add_command(test) +cli.add_command(test) def _run_tox(): @@ -290,7 +289,7 @@ def tox(): _run_tox() -# TODO: cli.add_command(tox) +cli.add_command(tox) @click.command() @@ -336,33 +335,30 @@ def diffsettings(): }, ) app_path = destination / 'opt_yunohost' - verbose_check_call(sys.executable, app_path / 'manage.py', 'diffsettings', cwd=app_path) + verbose_check_call( + sys.executable, + app_path / 'manage.py', + 'diffsettings', + cwd=app_path, + ) cli.add_command(diffsettings) -@click.command() -def pytest(): - """ - Run tests via "pytest" - """ - verbose_check_call(sys.executable, '-m', 'pytest', *sys.argv[2:], cwd=PACKAGE_ROOT) - - -cli.add_command(pytest) - - def main(): print_version(for_runners_ynh) + print(f'{sys.argv=}') if len(sys.argv) >= 2: # Check if we just pass a command call command = sys.argv[1] if command == 'test': - _run_unittest_cli() + _run_django_test_cli() + sys.exit(0) elif command == 'tox': _run_tox() + sys.exit(0) - # Execute Click CLI: + print('Execute Click CLI') cli() diff --git a/for_runners_ynh/tests/test_django_project.py b/for_runners_ynh/tests/test_django_project.py new file mode 100644 index 0000000..26c1fad --- /dev/null +++ b/for_runners_ynh/tests/test_django_project.py @@ -0,0 +1,170 @@ +from unittest.mock import patch + +from axes.models import AccessLog +from bx_django_utils.test_utils.html_assertion import HtmlAssertionMixin, assert_html_response_snapshot +from django.conf import LazySettings, settings +from django.contrib.auth.models import User +from django.template.defaulttags import CsrfTokenNode +from django.test import override_settings +from django.test.testcases import TestCase +from django.urls.base import reverse +from django_yunohost_integration.test_utils import generate_basic_auth +from for_runners import __version__ as upstream_version + + +@override_settings(DEBUG=False) +class DjangoYnhTestCase(HtmlAssertionMixin, TestCase): + def setUp(self): + super().setUp() + + # Always start a fresh session: + self.client = self.client_class() + + def test_settings(self): + assert isinstance(settings, LazySettings) + assert settings.configured is True + + assert settings.PATH_URL == 'app_path' + + assert str(settings.DATA_DIR_PATH).endswith('/local_test/opt_yunohost') + assert str(settings.INSTALL_DIR_PATH).endswith('/local_test/var_www') + assert str(settings.LOG_FILE_PATH).endswith( + '/local_test/var_log_django-for-runners.log' + ), f'{settings.LOG_FILE_PATH=}' + + assert settings.ROOT_URLCONF == 'urls' + + def test_config_panel_settings(self): + # config_panel.toml settings, set via tests.conftest.pytest_configure(): + assert settings.DEBUG_ENABLED == '0' and settings.DEBUG is False + assert settings.LOG_LEVEL == 'INFO' + assert settings.ADMIN_EMAIL == 'foo-bar@test.tld' + assert settings.DEFAULT_FROM_EMAIL == 'django_app@test.tld' + + def test_auth(self): + assert settings.PATH_URL == 'app_path' + self.assertEqual(reverse('admin:index'), '/app_path/') + + # SecurityMiddleware should redirects all non-HTTPS requests to HTTPS: + assert settings.SECURE_SSL_REDIRECT is True + response = self.client.get('/app_path/', secure=False) + self.assertRedirects( + response, + status_code=301, # permanent redirect + expected_url='https://testserver/app_path/', + fetch_redirect_response=False, + ) + + response = self.client.get('/app_path/', secure=True) + self.assertRedirects( + response, + expected_url='/app_path/login/?next=%2Fapp_path%2F', + fetch_redirect_response=False, + ) + + def test_create_unknown_user(self): + assert User.objects.count() == 0 + + self.client.cookies['SSOwAuthUser'] = 'test' + + with patch.object(CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'): + response = self.client.get( + path='/app_path/', + HTTP_REMOTE_USER='test', + HTTP_AUTH_USER='test', + HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz', + secure=True, + ) + + assert User.objects.count() == 1 + user = User.objects.first() + assert user.username == 'test' + assert user.is_active is True + assert user.is_staff is True # Set by: conf.setup_user.setup_project_user + assert user.is_superuser is False + + self.assert_html_parts( + response, + parts=( + f'Site administration | Django-ForRunners v{upstream_version}', + 'test', + ), + ) + assert_html_response_snapshot(response, query_selector='#main', validate=False) + + def test_wrong_auth_user(self): + assert User.objects.count() == 0 + assert AccessLog.objects.count() == 0 + + self.client.cookies['SSOwAuthUser'] = 'test' + + response = self.client.get( + path='/app_path/admin/', + HTTP_REMOTE_USER='test', + HTTP_AUTH_USER='foobar', # <<< wrong user name + HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz', + secure=True, + ) + + assert User.objects.count() == 1 + user = User.objects.first() + assert user.username == 'test' + assert user.is_active is True + assert user.is_staff is True # Set by: conf.setup_user.setup_project_user + assert user.is_superuser is False + + assert AccessLog.objects.count() == 1 + + assert response.status_code == 403 # Forbidden + + def test_wrong_cookie(self): + assert User.objects.count() == 0 + assert AccessLog.objects.count() == 0 + + self.client.cookies['SSOwAuthUser'] = 'foobar' # <<< wrong user name + + response = self.client.get( + path='/app_path/', + HTTP_REMOTE_USER='test', + HTTP_AUTH_USER='test', + HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz', + secure=True, + ) + + assert User.objects.count() == 1 + user = User.objects.first() + assert user.username == 'test' + assert user.is_active is True + assert user.is_staff is True # Set by: conf.setup_user.setup_project_user + assert user.is_superuser is False + + assert AccessLog.objects.count() == 1 + + assert response.status_code == 403 # Forbidden + + def test_wrong_authorization_user(self): + assert User.objects.count() == 0 + + self.client.cookies['SSOwAuthUser'] = 'test' + + response = self.client.get( + path='/app_path/', + HTTP_REMOTE_USER='test', + HTTP_AUTH_USER='test', + HTTP_AUTHORIZATION=generate_basic_auth( + username='foobar', # <<< wrong user name + password='test123', + ), + secure=True, + ) + + assert User.objects.count() == 1 + user = User.objects.first() + assert user.username == 'test' + assert user.is_active is True + assert user.is_staff is True # Set by: conf.setup_user.setup_project_user + assert user.is_superuser is False + + assert AccessLog.objects.count() == 1 + + assert response.status_code == 403 # Forbidden diff --git a/for_runners_ynh/tests/test_django_project_create_unknown_user_1.snapshot.html b/for_runners_ynh/tests/test_django_project_create_unknown_user_1.snapshot.html new file mode 100644 index 0000000..2cd5ede --- /dev/null +++ b/for_runners_ynh/tests/test_django_project_create_unknown_user_1.snapshot.html @@ -0,0 +1,32 @@ +
+
+ +
+

+ Site administration +

+
+

+ You don’t have permission to view or edit anything. +

+
+ +
+
+ + +
+
\ No newline at end of file diff --git a/for_runners_ynh/tests/test_project_setup.py b/for_runners_ynh/tests/test_project_setup.py index 166b2e3..b4c0118 100644 --- a/for_runners_ynh/tests/test_project_setup.py +++ b/for_runners_ynh/tests/test_project_setup.py @@ -1,68 +1,104 @@ -import subprocess -from unittest import TestCase +import os -from bx_py_utils.path import assert_is_file -from manageprojects.test_utils.click_cli_utils import subprocess_cli -from manageprojects.test_utils.project_setup import check_editor_config, get_py_max_line_length -from manageprojects.utilities import code_style -from packaging.version import Version - -from for_runners_ynh import __version__ from for_runners_ynh.cli.dev import PACKAGE_ROOT +try: + import tomllib # New in Python 3.11 +except ImportError: + import tomli as tomllib + +from bx_django_utils.filename import clean_filename +from bx_py_utils.path import assert_is_dir, assert_is_file +from django.test.testcases import TestCase +from django_tools.unittest_utils.project_setup import check_editor_config +from django_yunohost_integration.test_utils import assert_project_version + +from for_runners import __version__ as upstream_version +from for_runners_ynh import __version__ as ynh_pkg_version + + +def assert_file_contains_string(file_path, string): + with file_path.open('r') as f: + for line in f: + if string in line: + return + raise AssertionError(f'File {file_path} does not contain {string!r} !') + + class ProjectSetupTestCase(TestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + manifest_path = PACKAGE_ROOT / 'manifest.toml' + assert_is_file(manifest_path) + + cls.manifest_cfg = tomllib.loads(manifest_path.read_text(encoding='UTF-8')) + def test_version(self): - self.assertIsNotNone(__version__) + assert ynh_pkg_version.startswith( + upstream_version + ), f'{ynh_pkg_version=} does not start with {upstream_version=}' + self.assertIn('+ynh', ynh_pkg_version) - version = Version(__version__) # Will raise InvalidVersion() if wrong formatted - self.assertEqual(str(version), __version__) + # pyproject.toml needs a PEP 440 conform version and used "+ynh" + # the YunoHost syntax is: "~ynh", just "convert this: + manifest_version = ynh_pkg_version.replace('+', '~') + self.assertEqual(self.manifest_cfg['version'], manifest_version) - dev_cli_bin = PACKAGE_ROOT / 'dev-cli.py' - assert_is_file(dev_cli_bin) - - output = subprocess.check_output([dev_cli_bin, 'version'], text=True) - self.assertIn(f'for_runners_ynh v{__version__}', output) - - def test_code_style(self): - dev_cli_bin = PACKAGE_ROOT / 'dev-cli.py' - assert_is_file(dev_cli_bin) - - try: - output = subprocess_cli( - cli_bin=dev_cli_bin, - args=('check-code-style',), - exit_on_error=False, + if 'GITHUB_ACTION' not in os.environ: + # Github has a rate-limiting... So don't fetch the API if we run as GitHub action + assert_project_version( + current_version=ynh_pkg_version, + github_project_url='https://github.com/jedie/django-for-runners', ) - except subprocess.CalledProcessError as err: - self.assertIn('.venv/bin/darker', err.stdout) # darker was called? - else: - if 'Code style: OK' in output: - self.assertIn('.venv/bin/darker', output) # darker was called? - return # Nothing to fix -> OK - # Try to "auto" fix code style: - - try: - output = subprocess_cli( - cli_bin=dev_cli_bin, - args=('fix-code-style',), - exit_on_error=False, - ) - except subprocess.CalledProcessError as err: - output = err.stdout - - self.assertIn('.venv/bin/darker', output) # darker was called? - - # Check again and display the output: - - try: - code_style.check(package_root=PACKAGE_ROOT) - except SystemExit as err: - self.assertEqual(err.code, 0, 'Code style error, see output above!') + def test_screenshot_filenames(self): + """ + https://forum.yunohost.org/t/yunohost-bot-cant-handle-spaces-in-screenshots/19483 + """ + screenshot_path = PACKAGE_ROOT / 'doc' / 'screenshots' + assert_is_dir(screenshot_path) + renamed = [] + for file_path in screenshot_path.iterdir(): + file_name = file_path.name + if file_name.startswith('.'): + continue + cleaned_name = clean_filename(file_name) + if cleaned_name != file_name: + new_path = file_path.with_name(cleaned_name) + file_path.rename(new_path) + renamed.append(f'{file_name!r} renamed to {cleaned_name!r}') + assert not renamed, f'Bad screenshots file names found: {", ".join(renamed)}' def test_check_editor_config(self): check_editor_config(package_root=PACKAGE_ROOT) - max_line_length = get_py_max_line_length(package_root=PACKAGE_ROOT) - self.assertEqual(max_line_length, 119) + def test_manifest_toml(self): + self.assertEqual(self.manifest_cfg['packaging_format'], 2) + self.assertEqual( + set(self.manifest_cfg['install'].keys()), + { + 'admin', + 'admin_email', + 'debug_enabled', + 'default_from_email', + 'domain', + 'init_main_permission', + 'log_level', + 'path', + }, + ) + self.assertEqual( + set(self.manifest_cfg['resources'].keys()), + { + 'apt', + 'data_dir', + 'database', + 'install_dir', + 'permissions', + 'ports', + 'system_user', + }, + ) diff --git a/for_runners_ynh/tests/test_readme.py b/for_runners_ynh/tests/test_readme.py new file mode 100644 index 0000000..044abe6 --- /dev/null +++ b/for_runners_ynh/tests/test_readme.py @@ -0,0 +1,36 @@ +from pathlib import Path + +from bx_py_utils.auto_doc import assert_readme_block +from manageprojects.test_utils.click_cli_utils import invoke_click +from manageprojects.tests.base import BaseTestCase + +from for_runners_ynh.cli.dev import CLI_EPILOG, PACKAGE_ROOT, cli + + +def assert_cli_help_in_readme(text_block: str, marker: str, readme_path: Path): + text_block = text_block.replace(CLI_EPILOG, '') + text_block = f'```\n{text_block.strip()}\n```' + assert_readme_block( + readme_path=readme_path, + text_block=text_block, + start_marker_line=f'[comment]: <> (✂✂✂ auto generated {marker} start ✂✂✂)', + end_marker_line=f'[comment]: <> (✂✂✂ auto generated {marker} end ✂✂✂)', + ) + + +class ReadmeTestCase(BaseTestCase): + def test_main_help(self): + stdout = invoke_click(cli, '--help') + self.assert_in_content( + got=stdout, + parts=( + 'Usage: ./dev-cli.py [OPTIONS] COMMAND [ARGS]...', + ' local-test ', + CLI_EPILOG, + ), + ) + assert_cli_help_in_readme( + text_block=stdout, + marker='help', + readme_path=PACKAGE_ROOT / 'doc' / 'ADMIN.md', + ) diff --git a/manifest.toml b/manifest.toml index 9686e69..63ca302 100644 --- a/manifest.toml +++ b/manifest.toml @@ -13,12 +13,12 @@ maintainers = ["Jens Diemer"] [upstream] # https://yunohost.org/en/packaging_manifest#upstream-section license = "GPL-3.0-or-later" -website = "https://github.com/YunoHost-Apps/django-for-runners_ynh" admindoc = "https://github.com/YunoHost-Apps/django-for-runners_ynh" userdoc = "https://github.com/jedie/django-for-runners" code = "https://github.com/YunoHost-Apps/django-for-runners_ynh" + [integration] # https://yunohost.org/en/packaging_manifest#integration-section yunohost = ">=11" @@ -31,7 +31,10 @@ ram.build = "50M" # **estimate** minimum ram requirement. e.g. 50M, 400M, 1G, .. ram.runtime = "50M" # **estimate** minimum ram requirement. e.g. 50M, 400M, 1G, ... + [install] +# https://yunohost.org/en/packaging_manifest#install-questions + [install.domain] # this is a generic question - ask strings are automatically handled by Yunohost's core type = "domain" @@ -61,11 +64,9 @@ ram.runtime = "50M" # **estimate** minimum ram requirement. e.g. 50M, 400M, 1G, type = "email" example = "admin@example.com" - [install.debug_enabled] # __DEBUG_ENABLED__ + [install.debug_enabled] # __DEBUG_ENABLED__ will be set to "0" or "1" string ask.en = "Should be never enabled in production!" - type = "select" - choices = ["YES", "NO"] - default = "NO" + type = "boolean" [install.log_level] # __LOG_LEVEL__ ask.en = "Logging level" diff --git a/pyproject.toml b/pyproject.toml index 4fb6ff9..57001ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,15 +24,10 @@ dependencies = [ [project.optional-dependencies] dev = [ "bx_django_utils", # https://github.com/boxine/bx_django_utils - "beautifulsoup4", - # - # TODO: Remove "pytest" and use normal unittests ;) - "pytest", - "pytest-cov", - "pytest-django", - # + "beautifulsoup4", # https://pypi.org/project/beautifulsoup4/ "manageprojects>=0.15.0", # https://github.com/jedie/manageprojects "pip-tools", # https://github.com/jazzband/pip-tools/ + "tblib", # https://github.com/ionelmc/python-tblib "tox", # https://github.com/tox-dev/tox "coverage", # https://github.com/nedbat/coveragepy "autopep8", # https://github.com/hhatto/autopep8 @@ -56,7 +51,6 @@ dev = [ # to avoid errors like: # In --require-hashes mode, all requirements must have their versions pinned with ==. These do not: ... "tomli", # Only needed for Python <3.11 - "exceptiongroup", # needed by pytest ] [project.urls] @@ -108,47 +102,18 @@ line_length=119 lines_after_imports=2 -[tool.pytest.ini_options] -# https://docs.pytest.org/en/latest/customize.html#pyproject-toml -minversion = "6.0" -norecursedirs = ".* .git __pycache__ conf local_test coverage* dist htmlcov" -# sometimes helpfull "addopts" arguments: -# -vv -# --verbose -# --capture=no -# --trace-config -# --full-trace -# -p no:warnings -addopts = """ - --reuse-db - --nomigrations - --cov=. - --cov-config=pyproject.toml - --cov-report term-missing - --cov-report html - --cov-report xml - --no-cov-on-fail - --showlocals - --doctest-modules - --failed-first - --new-first -""" - - [tool.coverage.run] branch = true parallel = true concurrency = ["multiprocessing"] source = ['.'] -# TODO: pytest -> Django unitests: -#command_line = '-m unittest --verbose --locals --buffer' -command_line = '-m pytest' +command_line = './dev-cli.py test' disable_warnings = ["couldnt-parse"] [tool.coverage.report] omit = ['.*', '*/tests/*'] skip_empty = true -fail_under = 30 +fail_under = 10 show_missing = true exclude_lines = [ 'if self.debug:', @@ -196,6 +161,8 @@ cookiecutter_directory = "yunohost_django_package" applied_migrations = [ "183124a", # 2023-04-04T12:26:15+02:00 "3383cb0", # 2023-11-09T20:14:05+01:00 + "4abd4c0", # 2023-11-25T15:59:31+01:00 + "2f9fd7b", # 2023-11-26T20:13:32+01:00 ] [manageprojects.cookiecutter_context.cookiecutter] diff --git a/requirements.dev.txt b/requirements.dev.txt index beefb88..f104fe9 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -71,9 +71,9 @@ build==1.0.3 \ --hash=sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b \ --hash=sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f # via pip-tools -bx-django-utils==67 \ - --hash=sha256:8740fdaf98ed68a8ddb3af025d9b4f87c99101405898ddca86810b0c384b215a \ - --hash=sha256:aca0ae5c91a62e4f594172b8c43468c701516f99ae50d99412d5299ba375df03 +bx-django-utils==69 \ + --hash=sha256:39e96b8ad47bcf36d6713e4e42c8d09deb21e413160dc2944f17b7d2e2244713 \ + --hash=sha256:59b806aa36b50184f14bd0f7a61fb66c478fa231a44f92472360ce0cf1616013 # via # django-for-runners # for-runners-ynh (pyproject.toml) @@ -89,9 +89,9 @@ cachetools==5.3.2 \ --hash=sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2 \ --hash=sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 # via tox -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2023.11.17 \ + --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ + --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 # via requests cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ @@ -324,11 +324,11 @@ contourpy==1.2.0 \ --hash=sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727 \ --hash=sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a # via matplotlib -cookiecutter==2.4.0 \ - --hash=sha256:6d1494e66a784f23324df9d593f3e43af3db4f4b926b9e49e6ff060169fc042a \ - --hash=sha256:8344663028abc08ec09b912e663636a97e1775bffe973425ec0107431acd390e +cookiecutter==2.5.0 \ + --hash=sha256:8aa2f12ed11bc05628651e9dc4353a10571dd9908aaaaeec959a2b9ea465a5d2 \ + --hash=sha256:e61e9034748e3f41b8bd2c11f00d030784b48711c4d5c42363c50989a65331ec # via manageprojects -coverage[toml]==7.3.2 \ +coverage==7.3.2 \ --hash=sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1 \ --hash=sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63 \ --hash=sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9 \ @@ -381,9 +381,7 @@ coverage[toml]==7.3.2 \ --hash=sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738 \ --hash=sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a \ --hash=sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4 - # via - # for-runners-ynh (pyproject.toml) - # pytest-cov + # via for-runners-ynh (pyproject.toml) cryptography==41.0.5 \ --hash=sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf \ --hash=sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84 \ @@ -469,9 +467,9 @@ django-for-runners==0.17.4 \ --hash=sha256:ceecf3ed00e372cb012e1635fb6388675ecf92e2125c6782a4c41fd5b4c3d96a \ --hash=sha256:fbf2498ddac8a18b241f8b05a1d03288984a11714009d1312cf17b48517f08de # via for-runners-ynh (pyproject.toml) -django-import-export==3.3.2 \ - --hash=sha256:9a5c7c191014e4defb01573ee94864b60724a203f1b8a7e5e67a03f06b27b62d \ - --hash=sha256:d13e7508190f46442280bd7d04efcf49af6521350a70a6f9e06447ef28d6a41d +django-import-export==3.3.3 \ + --hash=sha256:2c1b16e1cf2ea5f62a165d8867e7c6dcff25673ab7201fd18aaf67c9ee90367e \ + --hash=sha256:78973202e93897326ab0411d64eaf89b72779fcb21ee9e5f64f3fb96571a5978 # via django-for-runners django-processinfo==1.1.0 \ --hash=sha256:c7d1fe2203655925294c860878509fe2a6eb1a5390a170c848023e4619b903da \ @@ -513,12 +511,6 @@ et-xmlfile==1.1.0 \ --hash=sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c \ --hash=sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada # via openpyxl -exceptiongroup==1.1.3 \ - --hash=sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9 \ - --hash=sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3 - # via - # for-runners-ynh (pyproject.toml) - # pytest filelock==3.13.1 \ --hash=sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e \ --hash=sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c @@ -535,57 +527,57 @@ flynt==0.77 \ --hash=sha256:2863ac8ec19d6ec8d29e760546e6ced644baf6dff3c7cdc77e03abbd29b80f14 \ --hash=sha256:2bd1b37043ad88a3f3c3c34a76fc0b64d24e5f03d36ea6b48cb69cc642bff17e # via darker -fonttools==4.44.0 \ - --hash=sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e \ - --hash=sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5 \ - --hash=sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e \ - --hash=sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2 \ - --hash=sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b \ - --hash=sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4 \ - --hash=sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97 \ - --hash=sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111 \ - --hash=sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252 \ - --hash=sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf \ - --hash=sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189 \ - --hash=sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b \ - --hash=sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e \ - --hash=sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267 \ - --hash=sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20 \ - --hash=sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165 \ - --hash=sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2 \ - --hash=sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc \ - --hash=sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400 \ - --hash=sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928 \ - --hash=sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a \ - --hash=sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5 \ - --hash=sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d \ - --hash=sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2 \ - --hash=sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb \ - --hash=sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0 \ - --hash=sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2 \ - --hash=sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335 \ - --hash=sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae \ - --hash=sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287 \ - --hash=sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d \ - --hash=sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b \ - --hash=sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39 \ - --hash=sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040 \ - --hash=sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d \ - --hash=sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c \ - --hash=sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86 \ - --hash=sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c \ - --hash=sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3 \ - --hash=sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d \ - --hash=sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219 \ - --hash=sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5 +fonttools==4.45.1 \ + --hash=sha256:03ed3bda541e86725f6b4e1b94213f13ed1ae51a5a1f167028534cedea38c010 \ + --hash=sha256:0dc7617d96b1e668eea9250e1c1fe62d0c78c3f69573ce7e3332cc40e6d84356 \ + --hash=sha256:105099968b58a5b4cef6f3eb409db8ea8578b302a9d05e23fecba1b8b0177b5f \ + --hash=sha256:1b9e9ad2bcded9a1431afaa57c8d3c39143ac1f050862d66bddd863c515464a2 \ + --hash=sha256:1f53a19dcdd5737440839b8394eeebb35da9ec8109f7926cb6456639b5b58e47 \ + --hash=sha256:21e96b99878348c74aa58059b8578d7586f9519cbcdadacf56486737038aa043 \ + --hash=sha256:2c980d60cd6ec1376206fe55013d166e5627ad0b149b5c81e74eaa913ab6134f \ + --hash=sha256:316cec50581e844c3ab69d7c82455b54c7cf18236b2f09e722faf665fbfcac58 \ + --hash=sha256:37cd1ced6efb3dd6fe82e9f9bf92fd74ac58a5aefc284045f59ecd517a5fb9ab \ + --hash=sha256:392d0e3cc23daee910193625f7cf1b387aff9dd5b6f1a5f4a925680acb6dcbc2 \ + --hash=sha256:3bdd7dfca8f6c9f4779384064027e8477ad6a037d6a327b09381f43e0247c6f3 \ + --hash=sha256:43a3d267334109ff849c37cf3629476b5feb392ef1d2e464a167b83de8cd599c \ + --hash=sha256:45fa321c458ea29224067700954ec44493ae869b47e7c5485a350a149a19fb53 \ + --hash=sha256:46eabddec12066829b8a1efe45ae552ba2f1796981ecf538d5f68284c354c589 \ + --hash=sha256:4b9544b1346d99848ac0e9b05b5d45ee703d7562fc4c9c48cf4b781de9632e57 \ + --hash=sha256:4ba17822a6681d06849078daaf6e03eccc9f467efe7c4c60280e28a78e8e5df9 \ + --hash=sha256:5a17706b9cc24b27721613fe5773d93331ab7f0ecaca9955aead89c6b843d3a7 \ + --hash=sha256:5cbf02cda8465b69769d07385f5d11e7bba19954e7787792f46fe679ec755ebb \ + --hash=sha256:6e441286d55fe7ec7c4fb36812bf914924813776ff514b744b510680fc2733f2 \ + --hash=sha256:6eb2c54f7a07c92108daabcf02caf31df97825738db02a28270633946bcda4d0 \ + --hash=sha256:777ba42b94a27bb7fb2b4082522fccfd345667c32a56011e1c3e105979af5b79 \ + --hash=sha256:794de93e83297db7b4943f2431e206d8b1ea69cb3ae14638a49cc50332bf0db8 \ + --hash=sha256:800e354e0c3afaeb8d9552769773d02f228e98c37b8cb03041157c3d0687cffc \ + --hash=sha256:847f3f49dd3423e5a678c098e2ba92c7f4955d4aab3044f6a507b0bb0ecb07e0 \ + --hash=sha256:8717db3e4895e4820ade64ea379187738827ee60748223cb0438ef044ee208c6 \ + --hash=sha256:8b07b857d4f9de3199a8c3d1b1bf2078c0f37447891ca1a8d9234106b9a27aff \ + --hash=sha256:8e1aefc2bf3c43e0f33f995f828a7bbeff4adc9393a7760b11456dbcf14388f6 \ + --hash=sha256:a12dee6523c02ca78aeedd0a5e12bfa9b7b29896350edd5241542897b072ae23 \ + --hash=sha256:a3c11d9687479f01eddef729aa737abcdea0a44fdaffb62a930a18892f186c9b \ + --hash=sha256:b6de2f0fcd3302fb82f94801002cb473959e998c14c24ec28234adb674aed345 \ + --hash=sha256:ba299f1fbaa2a1e33210aaaf6fa816d4059e4d3cfe2ae9871368d4ab548c1c6a \ + --hash=sha256:ba6c23591427844dfb0a13658f1718489de75de6a46b64234584c0d17573162d \ + --hash=sha256:c4f4a5870e3b56788fb196da8cf30d0dfd51a76dc3b907861d018165f76ae4c2 \ + --hash=sha256:cb472905da3049960e80fc1cf808231880d79727a8410e156bf3e5063a1c574f \ + --hash=sha256:cebcddbe9351b67166292b4f71ffdbfcce01ba4b07d4267824eb46b277aeb19a \ + --hash=sha256:e2277cba9f0b525e30de2a9ad3cb4219aa4bc697230c1645666b0deee9f914f0 \ + --hash=sha256:e29d5f298d616a93a4c5963682dc6cc8cc09f6d89cad2c29019fc5fb3b4d9472 \ + --hash=sha256:e3d24248221bd7151dfff0d88b1b5da02dccd7134bd576ce8888199827bbaa19 \ + --hash=sha256:e50f794d09df0675da8d9dbd7c66bfcab2f74a708343aabcad41936d26556891 \ + --hash=sha256:f22eb69996a0bd49f76bdefb30be54ce8dbb89a0d1246874d610f05c2aa2e69e \ + --hash=sha256:fb36e5f40191274a95938b40c0a1fa7f895e36935aea8709e1d6deff0b2d0d4f \ + --hash=sha256:ff6a698bdd435d24c379f6e8a54908cd9bb7dda23719084d56bf8c87709bf3bd # via matplotlib geographiclib==2.0 \ --hash=sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734 \ --hash=sha256:f7f41c85dc3e1c2d3d935ec86660dc3b2c848c83e17f9a9e51ba9d5146a15859 # via geopy -geopy==2.4.0 \ - --hash=sha256:a59392bf17adb486b25dbdd71fbed27733bdf24a2dac588047a619de56695e36 \ - --hash=sha256:d2639a46d0ce4c091e9688b750ba94348a14b898a1e55c68f4b4a07e7d1afa20 +geopy==2.4.1 \ + --hash=sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1 \ + --hash=sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7 # via django-for-runners gpxpy==1.6.1 \ --hash=sha256:473ff2fa17af6913a9879599cb6fe9c7a30fa1698898feff21a825447ee52fba \ @@ -601,9 +593,9 @@ icdiff==2.0.7 \ --hash=sha256:f05d1b3623223dd1c70f7848da7d699de3d9a2550b902a8234d9026292fb5762 \ --hash=sha256:f79a318891adbf59a45e3a7694f5e1f18c5407065264637072ac8363b759866f # via django-tools -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.6 \ + --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ + --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via requests importlib-metadata==6.8.0 \ --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ @@ -615,10 +607,6 @@ importlib-resources==6.1.1 \ --hash=sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a \ --hash=sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6 # via django-for-runners -iniconfig==2.0.0 \ - --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ - --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 - # via pytest isort==5.12.0 \ --hash=sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504 \ --hash=sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6 @@ -637,9 +625,9 @@ jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via cookiecutter -keyring==24.2.0 \ - --hash=sha256:4901caaf597bfd3bbd78c9a0c7c4c29fcd8310dab2cffefe749e916b6527acd6 \ - --hash=sha256:ca0746a19ec421219f4d713f848fa297a661a8a8c1504867e55bfb5e09091509 +keyring==24.3.0 \ + --hash=sha256:4446d35d636e6a10b8bce7caa66913dd9eca5fd222ca03a3d42c38608ac30836 \ + --hash=sha256:e730ecffd309658a08ee82535a3b5ec4b4c8669a9be11efb66249d8e0aeb9a25 # via twine kiwisolver==1.4.5 \ --hash=sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf \ @@ -914,35 +902,35 @@ markupsafe==2.1.3 \ --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 \ --hash=sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11 # via jinja2 -matplotlib==3.8.1 \ - --hash=sha256:044df81c1f6f3a8e52d70c4cfcb44e77ea9632a10929932870dfaa90de94365d \ - --hash=sha256:0d24c47a1bb47e392fbcd26fe322e4ff3431653ac1e8718e4e147d450ae97a44 \ - --hash=sha256:1fcb49b6baf0375281979cbf26695ec10bd1cada1e311893e89533b3b70143e7 \ - --hash=sha256:20a0fdfd3ee836179047f3782be060057b878ad37f5abe29edf006a1ff3ecd73 \ - --hash=sha256:27502d2452208ae784c19504644f09f83742809143bbeae147617640930aa344 \ - --hash=sha256:2afe7d2f8c9e35e94fbcfcfd9b28f29cb32f0a9068cba469cf907428379c8db9 \ - --hash=sha256:43a9d40feb63c9e31a0b8b069dcbd74a912f59bdc0095d187126694cd26977e4 \ - --hash=sha256:43cf368a4a1d8cbc426944806e5e183cead746647a64d2cdb786441546235967 \ - --hash=sha256:608ea2951838d391e45dec2e644888db6899c752d3c29e157af9dcefb3d7d8d5 \ - --hash=sha256:7658b7073c1d6a2922ecc0ed41602410fae88586cb8a54f7a2063d537b6beaf7 \ - --hash=sha256:7f99d07c0e753717775be7be39ab383453b4d8b629c9fa174596b970c6555890 \ - --hash=sha256:82ec95b02e894561c21e066bd0c716e4b410df141ce9441aa5af6cd937e4ade2 \ - --hash=sha256:afb72822ae410d62aa1a2920c6563cb5680de9078358f0e9474396c6c3e06be2 \ - --hash=sha256:bf6889643d4560fcc56f9f0941f078e4df0d72a6c3e4ca548841fc13c5642664 \ - --hash=sha256:c1b0ecaa0d1f4fe1e30f625a2347f0034a89a7d17c39efbb502e554d92ee2f61 \ - --hash=sha256:c54c55457c7f5ea4dfdba0020004fc7667f5c10c8d9b8010d735345acc06c9b8 \ - --hash=sha256:ca84deaa38cb64b7dd160ca2046b45f7b5dbff2b0179642e1339fadc337446c9 \ - --hash=sha256:cd54bbf089953140905768ed4626d7223e1ad1d7e2a138410a9c4d3b865ccd80 \ - --hash=sha256:d921c0270647ab11c3ef283efaaa3d46fd005ba233bfb3aea75231cdf3656de8 \ - --hash=sha256:e11ab864323fa73ac1b7849688d9671c47a2665242e899785b4db1a375b547e1 \ - --hash=sha256:e17674ee127f78f26fea237e7f4d5cf910a8be82beb6260fedf358b88075b823 \ - --hash=sha256:e3ad1759ad4a5245172c6d32b8ada603a6020d03211524c39d78d25c9a7dc0d2 \ - --hash=sha256:e3bb809b743653b5aab5d72ee45c8c937c28e147b0846b0826a54bece898608c \ - --hash=sha256:e5a504ff40f81d6233603475a45497a6dca37a873393fa20ae6f7dd6596ef72b \ - --hash=sha256:ed3b29f54f6bbf3eaca4cbd23bc260155153ace63b7f597c474fa6fc6f386530 \ - --hash=sha256:f34b46dbb1db1f09bfa937cd5853e5f2af232caeeff509c3ab6e43fd33780eae \ - --hash=sha256:f55fb5ff02d999a100be28bf6ffe826e1867a54c7b465409685332c9dd48ffa5 \ - --hash=sha256:ff842e27bc6a80de08c40e0bfdce460bd08080e8a94af131162b6a1b8948f2cc +matplotlib==3.8.2 \ + --hash=sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1 \ + --hash=sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0 \ + --hash=sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4 \ + --hash=sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7 \ + --hash=sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630 \ + --hash=sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89 \ + --hash=sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d \ + --hash=sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717 \ + --hash=sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a \ + --hash=sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627 \ + --hash=sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31 \ + --hash=sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213 \ + --hash=sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843 \ + --hash=sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788 \ + --hash=sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367 \ + --hash=sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4 \ + --hash=sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a \ + --hash=sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8 \ + --hash=sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b \ + --hash=sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18 \ + --hash=sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6 \ + --hash=sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa \ + --hash=sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917 \ + --hash=sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20 \ + --hash=sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331 \ + --hash=sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63 \ + --hash=sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f \ + --hash=sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8 # via django-for-runners mccabe==0.7.0 \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ @@ -956,34 +944,34 @@ more-itertools==10.1.0 \ --hash=sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a \ --hash=sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6 # via jaraco-classes -mypy==1.6.1 \ - --hash=sha256:19f905bcfd9e167159b3d63ecd8cb5e696151c3e59a1742e79bc3bcb540c42c7 \ - --hash=sha256:21a1ad938fee7d2d96ca666c77b7c494c3c5bd88dff792220e1afbebb2925b5e \ - --hash=sha256:40b1844d2e8b232ed92e50a4bd11c48d2daa351f9deee6c194b83bf03e418b0c \ - --hash=sha256:41697773aa0bf53ff917aa077e2cde7aa50254f28750f9b88884acea38a16169 \ - --hash=sha256:49ae115da099dcc0922a7a895c1eec82c1518109ea5c162ed50e3b3594c71208 \ - --hash=sha256:4c46b51de523817a0045b150ed11b56f9fff55f12b9edd0f3ed35b15a2809de0 \ - --hash=sha256:4cbe68ef919c28ea561165206a2dcb68591c50f3bcf777932323bc208d949cf1 \ - --hash=sha256:4d01c00d09a0be62a4ca3f933e315455bde83f37f892ba4b08ce92f3cf44bcc1 \ - --hash=sha256:59a0d7d24dfb26729e0a068639a6ce3500e31d6655df8557156c51c1cb874ce7 \ - --hash=sha256:68351911e85145f582b5aa6cd9ad666c8958bcae897a1bfda8f4940472463c45 \ - --hash=sha256:7274b0c57737bd3476d2229c6389b2ec9eefeb090bbaf77777e9d6b1b5a9d143 \ - --hash=sha256:81af8adaa5e3099469e7623436881eff6b3b06db5ef75e6f5b6d4871263547e5 \ - --hash=sha256:82e469518d3e9a321912955cc702d418773a2fd1e91c651280a1bda10622f02f \ - --hash=sha256:8b27958f8c76bed8edaa63da0739d76e4e9ad4ed325c814f9b3851425582a3cd \ - --hash=sha256:8c223fa57cb154c7eab5156856c231c3f5eace1e0bed9b32a24696b7ba3c3245 \ - --hash=sha256:8f57e6b6927a49550da3d122f0cb983d400f843a8a82e65b3b380d3d7259468f \ - --hash=sha256:925cd6a3b7b55dfba252b7c4561892311c5358c6b5a601847015a1ad4eb7d332 \ - --hash=sha256:a43ef1c8ddfdb9575691720b6352761f3f53d85f1b57d7745701041053deff30 \ - --hash=sha256:a8032e00ce71c3ceb93eeba63963b864bf635a18f6c0c12da6c13c450eedb183 \ - --hash=sha256:b96ae2c1279d1065413965c607712006205a9ac541895004a1e0d4f281f2ff9f \ - --hash=sha256:bb8ccb4724f7d8601938571bf3f24da0da791fe2db7be3d9e79849cb64e0ae85 \ - --hash=sha256:bbaf4662e498c8c2e352da5f5bca5ab29d378895fa2d980630656178bd607c46 \ - --hash=sha256:cfd13d47b29ed3bbaafaff7d8b21e90d827631afda134836962011acb5904b71 \ - --hash=sha256:d4473c22cc296425bbbce7e9429588e76e05bc7342da359d6520b6427bf76660 \ - --hash=sha256:d8fbb68711905f8912e5af474ca8b78d077447d8f3918997fecbf26943ff3cbb \ - --hash=sha256:e5012e5cc2ac628177eaac0e83d622b2dd499e28253d4107a08ecc59ede3fc2c \ - --hash=sha256:eb4f18589d196a4cbe5290b435d135dee96567e07c2b2d43b5c4621b6501531a +mypy==1.7.1 \ + --hash=sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340 \ + --hash=sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49 \ + --hash=sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82 \ + --hash=sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce \ + --hash=sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb \ + --hash=sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51 \ + --hash=sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5 \ + --hash=sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e \ + --hash=sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7 \ + --hash=sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33 \ + --hash=sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9 \ + --hash=sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1 \ + --hash=sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6 \ + --hash=sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a \ + --hash=sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe \ + --hash=sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7 \ + --hash=sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200 \ + --hash=sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7 \ + --hash=sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a \ + --hash=sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28 \ + --hash=sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea \ + --hash=sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120 \ + --hash=sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d \ + --hash=sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42 \ + --hash=sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea \ + --hash=sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2 \ + --hash=sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a # via # for-runners-ynh (pyproject.toml) # manageprojects @@ -1011,39 +999,43 @@ nh3==0.2.14 \ --hash=sha256:e8986f1dd3221d1e741fda0a12eaa4a273f1d80a35e31a1ffe579e7c621d069e \ --hash=sha256:f99212a81c62b5f22f9e7c3e347aa00491114a5647e1f13bbebd79c3e5f08d75 # via readme-renderer -numpy==1.26.1 \ - --hash=sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668 \ - --hash=sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9 \ - --hash=sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f \ - --hash=sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5 \ - --hash=sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53 \ - --hash=sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2 \ - --hash=sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974 \ - --hash=sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f \ - --hash=sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42 \ - --hash=sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2 \ - --hash=sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af \ - --hash=sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67 \ - --hash=sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e \ - --hash=sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c \ - --hash=sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7 \ - --hash=sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e \ - --hash=sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908 \ - --hash=sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66 \ - --hash=sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24 \ - --hash=sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b \ - --hash=sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e \ - --hash=sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe \ - --hash=sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a \ - --hash=sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575 \ - --hash=sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297 \ - --hash=sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104 \ - --hash=sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab \ - --hash=sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3 \ - --hash=sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244 \ - --hash=sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124 \ - --hash=sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617 \ - --hash=sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c +numpy==1.26.2 \ + --hash=sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a \ + --hash=sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6 \ + --hash=sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2 \ + --hash=sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79 \ + --hash=sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9 \ + --hash=sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919 \ + --hash=sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d \ + --hash=sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060 \ + --hash=sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75 \ + --hash=sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f \ + --hash=sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe \ + --hash=sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167 \ + --hash=sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef \ + --hash=sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75 \ + --hash=sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3 \ + --hash=sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7 \ + --hash=sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7 \ + --hash=sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d \ + --hash=sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b \ + --hash=sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186 \ + --hash=sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0 \ + --hash=sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1 \ + --hash=sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6 \ + --hash=sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e \ + --hash=sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523 \ + --hash=sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36 \ + --hash=sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841 \ + --hash=sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818 \ + --hash=sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00 \ + --hash=sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80 \ + --hash=sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440 \ + --hash=sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210 \ + --hash=sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8 \ + --hash=sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea \ + --hash=sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec \ + --hash=sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841 # via # contourpy # matplotlib @@ -1065,7 +1057,6 @@ packaging==23.2 \ # gunicorn # matplotlib # pyproject-api - # pytest # safety # tox pathspec==0.11.2 \ @@ -1136,9 +1127,9 @@ pkginfo==1.9.6 \ --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 # via twine -platformdirs==3.11.0 \ - --hash=sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3 \ - --hash=sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e +platformdirs==4.0.0 \ + --hash=sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b \ + --hash=sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731 # via # black # tox @@ -1146,9 +1137,7 @@ platformdirs==3.11.0 \ pluggy==1.3.0 \ --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 - # via - # pytest - # tox + # via tox pprintpp==0.4.0 \ --hash=sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d \ --hash=sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403 @@ -1186,9 +1175,9 @@ pyflakes==3.1.0 \ # flake8 # for-runners-ynh (pyproject.toml) # manageprojects -pygments==2.16.1 \ - --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ - --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 +pygments==2.17.2 \ + --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ + --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 # via # darker # readme-renderer @@ -1205,21 +1194,6 @@ pyproject-hooks==1.0.0 \ --hash=sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8 \ --hash=sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5 # via build -pytest==7.4.3 \ - --hash=sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac \ - --hash=sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5 - # via - # for-runners-ynh (pyproject.toml) - # pytest-cov - # pytest-django -pytest-cov==4.1.0 \ - --hash=sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6 \ - --hash=sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a - # via for-runners-ynh (pyproject.toml) -pytest-django==4.7.0 \ - --hash=sha256:4e1c79d5261ade2dd58d91208017cd8f62cb4710b56e012ecd361d15d5d662a2 \ - --hash=sha256:92d6fd46b1d79b54fb6b060bbb39428073396cec717d5f2e122a990d4b6aa5e8 - # via for-runners-ynh (pyproject.toml) python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 @@ -1324,9 +1298,9 @@ rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==13.6.0 \ - --hash=sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245 \ - --hash=sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef +rich==13.7.0 \ + --hash=sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa \ + --hash=sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235 # via # cli-base-utilities # cookiecutter @@ -1430,6 +1404,10 @@ tablib[html,ods,xls,xlsx,yaml]==3.5.0 \ # via # django-import-export # tablib +tblib==3.0.0 \ + --hash=sha256:80a6c77e59b55e83911e1e607c649836a69c103963c5f28a46cbeef44acf8129 \ + --hash=sha256:93622790a0a29e04f0346458face1e144dc4d32f493714c6c3dff82a4adb77e6 + # via for-runners-ynh (pyproject.toml) text-unidecode==1.3 \ --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 \ --hash=sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93 @@ -1450,7 +1428,6 @@ tomli==2.0.1 \ # autopep8 # black # build - # coverage # dparse # flynt # for-runners-ynh (pyproject.toml) @@ -1458,11 +1435,10 @@ tomli==2.0.1 \ # pip-tools # pyproject-api # pyproject-hooks - # pytest # tox -tomlkit==0.12.2 \ - --hash=sha256:df32fab589a81f0d7dc525a4267b6d7a64ee99619cbd1eeb0fae32c1dd426977 \ - --hash=sha256:eeea7ac7563faeab0a1ed8fe12c2e5a51c61f933f2502f7e9db0241a65163ad0 +tomlkit==0.12.3 \ + --hash=sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4 \ + --hash=sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba # via # cli-base-utilities # manageprojects @@ -1486,23 +1462,23 @@ typing-extensions==4.8.0 \ # black # mypy # rich-click -urllib3==2.0.7 \ - --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ - --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e +urllib3==2.1.0 \ + --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ + --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 # via # requests # twine -virtualenv==20.24.6 \ - --hash=sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af \ - --hash=sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381 +virtualenv==20.24.7 \ + --hash=sha256:69050ffb42419c91f6c1284a7b24e0475d793447e35929b488bf6a0aade39353 \ + --hash=sha256:a18b3fd0314ca59a2e9f4b556819ed07183b3e9a3702ecfe213f593d44f7b3fd # via tox webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 # via bleach -wheel==0.41.3 \ - --hash=sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942 \ - --hash=sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841 +wheel==0.42.0 \ + --hash=sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d \ + --hash=sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8 # via pip-tools xlrd==2.0.1 \ --hash=sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd \ @@ -1522,9 +1498,9 @@ pip==23.3.1 \ --hash=sha256:1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174 \ --hash=sha256:55eb67bb6171d37447e82213be585b75fe2b12b359e993773aca4de9247a052b # via pip-tools -setuptools==68.2.2 \ - --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ - --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a +setuptools==69.0.2 \ + --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ + --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 # via # django-axes # pip-tools diff --git a/scripts/_common.sh b/scripts/_common.sh index f3536db..244e91a 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -13,7 +13,7 @@ __YNH_CURRENT_HOST__=${ynh_current_host} #================================================= # 'debug_enabled' -> '__DEBUG_ENABLED__' -> settings.DEBUG -debug_enabled="NO" # "YES" or "NO" string +debug_enabled="0" # "1" or "0" string # 'log_level' -> '__LOG_LEVEL__' -> settings.LOG_LEVEL log_level="WARNING" diff --git a/tests/conftest.py b/tests/conftest.py index 8e36ec5..bb04271 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -26,7 +26,7 @@ def pytest_configure(): destination=BASE_PATH / 'local_test', runserver=False, extra_replacements={ - '__DEBUG_ENABLED__': 'NO', # "YES" or "NO" string + '__DEBUG_ENABLED__': '0', # "1" or "0" string '__LOG_LEVEL__': 'INFO', '__ADMIN_EMAIL__': 'foo-bar@test.tld', '__DEFAULT_FROM_EMAIL__': 'django_app@test.tld', diff --git a/tests/test_django_project.py b/tests/test_django_project.py index 074bf3c..1fcf08a 100644 --- a/tests/test_django_project.py +++ b/tests/test_django_project.py @@ -34,7 +34,7 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase): def test_config_panel_settings(self): # config_panel.toml settings, set via tests.conftest.pytest_configure(): - assert settings.DEBUG_ENABLED == 'NO' and settings.DEBUG is False + assert settings.DEBUG_ENABLED == '0' and settings.DEBUG is False assert settings.LOG_LEVEL == 'INFO' assert settings.ADMIN_EMAIL == 'foo-bar@test.tld' assert settings.DEFAULT_FROM_EMAIL == 'django_app@test.tld'