mirror of
https://github.com/YunoHost-Apps/django-fritzconnection_ynh.git
synced 2024-09-03 18:26:24 +02:00
commit
41eb92d834
14 changed files with 586 additions and 204 deletions
9
.github/workflows/pytest.yml
vendored
9
.github/workflows/pytest.yml
vendored
|
@ -14,7 +14,7 @@ jobs:
|
|||
strategy:
|
||||
max-parallel: 2
|
||||
matrix:
|
||||
python-version: [3.9, 3.8, 3.7]
|
||||
python-version: ["3.10", "3.9", "3.8", "3.7"]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
|
@ -23,7 +23,7 @@ jobs:
|
|||
run: |
|
||||
git fetch origin master
|
||||
- name: 'Set up Python ${{ matrix.python-version }}'
|
||||
uses: actions/setup-python@v1
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '${{ matrix.python-version }}'
|
||||
|
||||
|
@ -42,8 +42,3 @@ jobs:
|
|||
|
||||
- name: 'Upload coverage report'
|
||||
run: bash <(curl -s https://codecov.io/bash)
|
||||
|
||||
- name: 'Run linters'
|
||||
if: matrix.python-version == '3.8'
|
||||
run: |
|
||||
make lint
|
||||
|
|
72
README.md
72
README.md
|
@ -1,20 +1,34 @@
|
|||
<!--
|
||||
N.B.: This README was automatically generated by https://github.com/YunoHost/apps/tree/master/tools/README-generator
|
||||
It shall NOT be edited by hand.
|
||||
-->
|
||||
|
||||
# django-fritzconnection for YunoHost
|
||||
|
||||
[![Integration level](https://dash.yunohost.org/integration/django-fritzconnection.svg)](https://dash.yunohost.org/appci/app/django-fritzconnection) [![CI Pipeline](https://ci-apps.yunohost.org/ci/badges/django-fritzconnection.status.svg)](https://ci-apps.yunohost.org/ci/apps/django-fritzconnection/) [![Maintain status](https://ci-apps.yunohost.org/ci/badges/django-fritzconnection.maintain.svg)](https://dash.yunohost.org/appci/app/django-fritzconnection)
|
||||
|
||||
[![pytest](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/pytest.yml/badge.svg?branch=master)](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/pytest.yml) [![YunoHost apps package linter](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/package_linter.yml/badge.svg)](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/package_linter.yml) [![Coverage Status on codecov.io](https://codecov.io/gh/YunoHost-Apps/django-fritzconnection_ynh/branch/master/graph/badge.svg)](https://codecov.io/gh/YunoHost-Apps/django-fritzconnection_ynh)
|
||||
|
||||
[![Integration level](https://dash.yunohost.org/integration/django-fritzconnection.svg)](https://dash.yunohost.org/appci/app/django-fritzconnection) ![](https://ci-apps.yunohost.org/ci/badges/django-fritzconnection.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/django-fritzconnection.maintain.svg)
|
||||
[![Install django-fritzconnection with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=django-fritzconnection)
|
||||
|
||||
*[Lire ce readme en français.](./README_fr.md)*
|
||||
|
||||
> *This package allows you to install django-fritzconnection 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
|
||||
|
||||
Web based FritzBox management using Python/Django.
|
||||
|
||||
**Shipped version:** 0.0.2.rc1~ynh1
|
||||
|
||||
|
||||
|
||||
## Disclaimers / important information
|
||||
|
||||
[![pytest](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/pytest.yml/badge.svg?branch=master)](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/pytest.yml) [![YunoHost apps package linter](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/package_linter.yml/badge.svg)](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/package_linter.yml) [![Coverage Status on codecov.io](https://codecov.io/gh/YunoHost-Apps/django-fritzconnection_ynh/branch/master/graph/badge.svg)](https://codecov.io/gh/YunoHost-Apps/django-fritzconnection_ynh)
|
||||
|
||||
Pull requests welcome ;)
|
||||
|
||||
## Overview
|
||||
|
||||
[django-fritzconnection](https://github.com/jedie/django-fritzconnection) is a libre Web based FritzBox management using [Python](https://www.python.org/)/[Django](https://www.djangoproject.com/).
|
||||
|
||||
This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration)
|
||||
|
||||
|
||||
|
@ -64,33 +78,9 @@ To check the effective settings, run this:
|
|||
* User Email, First / Last name will be updated from SSO data
|
||||
|
||||
|
||||
## Links
|
||||
|
||||
* Report a bug about this package: https://github.com/YunoHost-Apps/django-fritzconnection_ynh
|
||||
* Report a bug about django-fritzconnection itself: https://github.com/jedie/django-fritzconnection
|
||||
* YunoHost website: https://yunohost.org/
|
||||
|
||||
---
|
||||
|
||||
# Developer info
|
||||
|
||||
## package installation / debugging
|
||||
|
||||
Please send your pull request to https://github.com/YunoHost-Apps/django-fritzconnection_ynh
|
||||
|
||||
Try 'main' branch, e.g.:
|
||||
```bash
|
||||
sudo yunohost app install https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/master --debug
|
||||
or
|
||||
sudo yunohost app upgrade django-fritzconnection -u https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/master --debug
|
||||
```
|
||||
|
||||
Try 'testing' branch, e.g.:
|
||||
```bash
|
||||
sudo yunohost app install https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/testing --debug
|
||||
or
|
||||
sudo yunohost app upgrade django-fritzconnection -u https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/testing --debug
|
||||
```
|
||||
# Yunohost developer commands
|
||||
|
||||
To remove call e.g.:
|
||||
```bash
|
||||
|
@ -170,3 +160,23 @@ 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: https://github.com/jedie/django-fritzconnection
|
||||
* Upstream app code repository: https://github.com/jedie/django-fritzconnection
|
||||
* YunoHost documentation for this app: https://yunohost.org/app_django-fritzconnection
|
||||
* Report a bug: https://github.com/YunoHost-Apps/django-fritzconnection_ynh/issues
|
||||
|
||||
## Developer info
|
||||
|
||||
Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/testing).
|
||||
|
||||
To try the testing branch, please proceed like that.
|
||||
```
|
||||
sudo yunohost app install https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/testing --debug
|
||||
or
|
||||
sudo yunohost app upgrade django-fritzconnection -u https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/testing --debug
|
||||
```
|
||||
|
||||
**More info regarding app packaging:** https://yunohost.org/packaging_apps
|
178
README_fr.md
Normal file
178
README_fr.md
Normal file
|
@ -0,0 +1,178 @@
|
|||
# django-fritzconnection pour YunoHost
|
||||
|
||||
[![Niveau d'intégration](https://dash.yunohost.org/integration/django-fritzconnection.svg)](https://dash.yunohost.org/appci/app/django-fritzconnection) ![](https://ci-apps.yunohost.org/ci/badges/django-fritzconnection.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/django-fritzconnection.maintain.svg)
|
||||
[![Installer django-fritzconnection avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=django-fritzconnection)
|
||||
|
||||
*[Read this readme in english.](./README.md)*
|
||||
*[Lire ce readme en français.](./README_fr.md)*
|
||||
|
||||
> *Ce package vous permet d'installer django-fritzconnection rapidement et simplement sur un serveur YunoHost.
|
||||
Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.*
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
|
||||
|
||||
**Version incluse :** 0.0.2.rc1~ynh1
|
||||
|
||||
|
||||
|
||||
## Avertissements / informations importantes
|
||||
|
||||
[![pytest](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/pytest.yml/badge.svg?branch=master)](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/pytest.yml) [![YunoHost apps package linter](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/package_linter.yml/badge.svg)](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/package_linter.yml) [![Coverage Status on codecov.io](https://codecov.io/gh/YunoHost-Apps/django-fritzconnection_ynh/branch/master/graph/badge.svg)](https://codecov.io/gh/YunoHost-Apps/django-fritzconnection_ynh)
|
||||
|
||||
Pull requests welcome ;)
|
||||
|
||||
## Overview
|
||||
|
||||
This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration)
|
||||
|
||||
|
||||
## Settings and upgrades
|
||||
|
||||
Almost everything related to django-fritzconnection's configuration is handled in a `"../conf/settings.py"` file.
|
||||
You can edit the file `/opt/yunohost/django-fritzconnection/local_settings.py` to enable or disable features.
|
||||
|
||||
Test sending emails:
|
||||
|
||||
```bash
|
||||
ssh admin@yourdomain.tld
|
||||
root@yunohost:~# cd /opt/yunohost/django-fritzconnection/
|
||||
root@yunohost:/opt/yunohost/django-fritzconnection# source venv/bin/activate
|
||||
(venv) root@yunohost:/opt/yunohost/django-fritzconnection# ./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-fritzconnection# ./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-fritzconnection/local_settings.py
|
||||
```
|
||||
|
||||
To check the effective settings, run this:
|
||||
```bash
|
||||
(venv) root@yunohost:/opt/yunohost/django-fritzconnection# ./manage.py diffsettings
|
||||
```
|
||||
|
||||
|
||||
# Miscellaneous
|
||||
|
||||
|
||||
## SSO authentication
|
||||
|
||||
[SSOwat](https://github.com/YunoHost/SSOwat) is fully supported via [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration):
|
||||
|
||||
* 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
|
||||
|
||||
|
||||
---
|
||||
|
||||
# Yunohost developer commands
|
||||
|
||||
To remove call e.g.:
|
||||
```bash
|
||||
sudo yunohost app remove django-fritzconnection
|
||||
```
|
||||
|
||||
Backup / remove / restore cycle, e.g.:
|
||||
```bash
|
||||
yunohost backup create --apps django-fritzconnection
|
||||
yunohost backup list
|
||||
archives:
|
||||
- django-fritzconnection-pre-upgrade1
|
||||
- 20201223-163434
|
||||
yunohost app remove django-fritzconnection
|
||||
yunohost backup restore 20201223-163434 --apps django-fritzconnection
|
||||
```
|
||||
|
||||
Debug installation, e.g.:
|
||||
```bash
|
||||
root@yunohost:~# ls -la /var/www/django-fritzconnection/
|
||||
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-fritzconnection/
|
||||
total 58
|
||||
drwxr-xr-x 5 django-fritzconnection django-fritzconnection 11 Dec 8 08:39 .
|
||||
drwxr-xr-x 3 root root 3 Dec 8 08:36 ..
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 460 Dec 8 08:39 gunicorn.conf.py
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 0 Dec 8 08:39 local_settings.py
|
||||
-rwxr-xr-x 1 django-fritzconnection django-fritzconnection 274 Dec 8 08:39 manage.py
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 171 Dec 8 08:39 secret.txt
|
||||
drwxr-xr-x 6 django-fritzconnection django-fritzconnection 6 Dec 8 08:37 venv
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 115 Dec 8 08:39 wsgi.py
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 4737 Dec 8 08:39 settings.py
|
||||
|
||||
root@yunohost:~# cd /opt/yunohost/django-fritzconnection/
|
||||
root@yunohost:/opt/yunohost/django-fritzconnection# source venv/bin/activate
|
||||
(venv) root@yunohost:/opt/yunohost/django-fritzconnection# ./manage.py check
|
||||
django-fritzconnection v0.8.2 (Django v2.2.17)
|
||||
DJANGO_SETTINGS_MODULE='settings'
|
||||
PROJECT_PATH:/opt/yunohost/django-fritzconnection/venv/lib/python3.7/site-packages
|
||||
BASE_PATH:/opt/yunohost/django-fritzconnection
|
||||
System check identified no issues (0 silenced).
|
||||
|
||||
root@yunohost:~# tail -f /var/log/django-fritzconnection/django-fritzconnection.log
|
||||
root@yunohost:~# cat /etc/systemd/system/django-fritzconnection.service
|
||||
|
||||
root@yunohost:~# systemctl reload-or-restart django-fritzconnection
|
||||
root@yunohost:~# journalctl --unit=django-fritzconnection --follow
|
||||
```
|
||||
|
||||
## local test
|
||||
|
||||
For quicker developing of django-fritzconnection 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-fritzconnection_ynh.git
|
||||
~$ cd django-fritzconnection_ynh/
|
||||
~/django-fritzconnection_ynh$ make
|
||||
install-poetry install or update poetry
|
||||
install install django-fritzconnection via poetry
|
||||
update update the sources and installation
|
||||
local-test Run local_test.py to run django-fritzconnection_ynh locally
|
||||
~/django-fritzconnection_ynh$ make install-poetry
|
||||
~/django-fritzconnection_ynh$ make install
|
||||
~/django-fritzconnection_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 : https://github.com/jedie/django-fritzconnection
|
||||
* Dépôt de code officiel de l'app : https://github.com/jedie/django-fritzconnection
|
||||
* Documentation YunoHost pour cette app : https://yunohost.org/app_django-fritzconnection
|
||||
* Signaler un bug : https://github.com/YunoHost-Apps/django-fritzconnection_ynh/issues
|
||||
|
||||
## Informations pour les développeurs
|
||||
|
||||
Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/testing).
|
||||
|
||||
Pour essayer la branche testing, procédez comme suit.
|
||||
```
|
||||
sudo yunohost app install https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/testing --debug
|
||||
ou
|
||||
sudo yunohost app upgrade django-fritzconnection -u https://github.com/YunoHost-Apps/django-fritzconnection_ynh/tree/testing --debug
|
||||
```
|
||||
|
||||
**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env python3
|
||||
#!__FINAL_HOME_PATH__/venv/bin/python
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
|
|
@ -1,104 +1,90 @@
|
|||
asgiref==3.5.0; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
asgiref==3.5.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:88d59c13d634dcffe0510be048210188edd79aeccb6a6c9028cdad6f31d730a9 \
|
||||
--hash=sha256:2f8abc20f7248433085eda803936d98992f1343ddb022065779f37c5da0181d0
|
||||
async-timeout==4.0.2; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15 \
|
||||
--hash=sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c
|
||||
backports.zoneinfo==0.2.1; python_version >= "3.8" and python_full_version < "4.0.0" and python_version < "3.9" \
|
||||
--hash=sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc \
|
||||
--hash=sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722 \
|
||||
--hash=sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546 \
|
||||
--hash=sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08 \
|
||||
--hash=sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7 \
|
||||
--hash=sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac \
|
||||
--hash=sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf \
|
||||
--hash=sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570 \
|
||||
--hash=sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b \
|
||||
--hash=sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582 \
|
||||
--hash=sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987 \
|
||||
--hash=sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1 \
|
||||
--hash=sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9 \
|
||||
--hash=sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328 \
|
||||
--hash=sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6 \
|
||||
--hash=sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2
|
||||
bleach==4.1.0; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
bleach==4.1.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994 \
|
||||
--hash=sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da
|
||||
bx-django-utils==20; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
bx-django-utils==20; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:7daf89de453cfaff49117dc24a1c2408fcc91279cd11554e0c16683095cec8b3 \
|
||||
--hash=sha256:6a5be502414a63fbd462c0f29a1403def436b89450a1325a24fa1233a5410ada
|
||||
bx-py-utils==60; python_version >= "3.6" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:e321f7275aaf36829fc193023b1d0daca17415aaf74632915de2c202ecc26bd8 \
|
||||
--hash=sha256:d3395a9f72d2e2633b1e322ff8608204601e14eb3f6dc5d346953002a309ffcf
|
||||
certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_version >= "3.8" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
certifi==2021.10.8; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
--hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569 \
|
||||
--hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872
|
||||
charset-normalizer==2.0.12; python_version >= "3.8" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
charset-normalizer==2.0.12; python_version >= "3.7" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
--hash=sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597 \
|
||||
--hash=sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df
|
||||
colorama==0.4.4; python_version >= "3.8" and python_full_version < "3.0.0" and sys_platform == "win32" or python_version >= "3.8" and python_full_version < "4.0.0" and sys_platform == "win32" and python_full_version >= "3.5.0" \
|
||||
colorama==0.4.4; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or python_version >= "3.7" and python_full_version < "4.0.0" and sys_platform == "win32" and python_full_version >= "3.5.0" \
|
||||
--hash=sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2 \
|
||||
--hash=sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b
|
||||
colorlog==6.6.0; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
colorlog==6.6.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:351c51e866c86c3217f08e4b067a7974a678be78f07f85fc2d55b8babde6d94e \
|
||||
--hash=sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8
|
||||
deprecated==1.2.13; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "4.0.0" and python_full_version >= "3.4.0" \
|
||||
--hash=sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d \
|
||||
--hash=sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d
|
||||
diff-match-patch==20200713; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
diff-match-patch==20200713; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:da6f5a01aa586df23dfc89f3827e1cafbb5420be9d87769eeb079ddfd9477a18 \
|
||||
--hash=sha256:8bf9d9c4e059d917b5c6312bac0c137971a32815ddbda9c682b949f2986b4d34
|
||||
django-admin-sortable2==1.0.4; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
django-admin-sortable2==1.0.4; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:f96044003176c6684c5f969792ca833a505d654fa0f7b24232a0a610e4332a53 \
|
||||
--hash=sha256:e22956889533b48a35a7f02859ae3a939753fa9a7d7d532cefc2835b41bdcebb
|
||||
django-axes==5.31.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:e6754be4c8a9e55a25381e4aea6aeb1ec1f0d8dd025f233d9caa910ce9be6728 \
|
||||
--hash=sha256:17f1884a439d2a20495c0c03427922634ab7828cd030d9bc1ce3d0425917ff36
|
||||
django-debug-toolbar==3.2.4; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
django-debug-toolbar==3.2.4; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:644bbd5c428d3283aa9115722471769cac1bec189edf3a0c855fd8ff870375a9 \
|
||||
--hash=sha256:6b633b6cfee24f232d73569870f19aa86c819d750e7f3e833f2344a9eb4b4409
|
||||
django-fritzconnection==0.0.2a0; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:2a32d6c61495052a80dee93103946503e1c8b5b6a940a5d2053388bc8d3cdbf3 \
|
||||
--hash=sha256:de76455e328e7f4ac929cdd32e5f50659b86b9da890003c1f3b6f35daf6008a1
|
||||
django-fritzconnection==0.0.2rc1; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:d996ec1d65c4b2f43b90b5f346964be5e885cf36721cc0f42a7952aad824c950 \
|
||||
--hash=sha256:3c08cdd2d2d92ca08c9d10d4d1cc1df91aa1f5c83488b8fba6e6847f26800976
|
||||
django-ipware==4.0.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
--hash=sha256:602a58325a4808bd19197fef2676a0b2da2df40d0ecf21be414b2ff48c72ad05 \
|
||||
--hash=sha256:878dbb06a87e25550798e9ef3204ed70a200dd8b15e47dcef848cf08244f04c9
|
||||
django-redis==5.2.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:8a99e5582c79f894168f5865c52bd921213253b7fd64d16733ae4591564465de \
|
||||
--hash=sha256:1d037dc02b11ad7aa11f655d26dac3fb1af32630f61ef4428860a2e29ff92026
|
||||
django-reversion-compare==0.15.0; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
django-reversion-compare==0.15.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:ed0264a2852d9d867023f1874948b8234dad9c2d2fa22ea18cfd5f28f304d7a0 \
|
||||
--hash=sha256:d6f37b106aec287ae17a076bb7db1184ab02ab1898f0e8693f2779fbdaf71697
|
||||
django-reversion==5.0.0; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
django-reversion==5.0.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:0bade3c399387451087f0c67835e0d3d186d767de6a5c5ba53a88eafc3f271c8 \
|
||||
--hash=sha256:7bea725de7f56769d89a5a712cf7b7f1b02abc27655432f2eb1a703264986d99
|
||||
django-tagulous==1.3.3; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
django-tagulous==1.3.3; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:d445590ae1b5cb9b8c5a425f97bf5f01148a33419c19edeb721ebd9fdd6792fe \
|
||||
--hash=sha256:ad3bb85f4cce83a47e4c0257143229cb92a294defa02fe661823b0442b35d478
|
||||
django-tools==0.49.0; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
django-tools==0.49.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:9da6d5610576a34219be3dea9c7c2207669e5c916d89987011843ded772ece0a \
|
||||
--hash=sha256:a27c32cff98cd82dde23ab2f05fb9e06a32aaeb8357e96f1ec02a634b6619170
|
||||
django-yunohost-integration==0.2.4; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:f5cdb5480025e90de0221d2b1c6282f517fd0c903702563cccb771cb3e1d9417 \
|
||||
--hash=sha256:a4b3617a3b39225d6162fa88827e9fe8b65388e26a0bbc23ea665c62aa8cb044
|
||||
django==4.0.3; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:1239218849e922033a35d2a2f777cb8bee18bd725416744074f455f34ff50d0c \
|
||||
--hash=sha256:77ff2e7050e3324c9b67e29b6707754566f58514112a9ac73310f60cd5261930
|
||||
fritzconnection==1.9.1; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
django==3.2.12; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:9b06c289f9ba3a8abea16c9c9505f25107809fb933676f6c891ded270039d965 \
|
||||
--hash=sha256:9772e6935703e59e993960832d66a614cf0233a1c5123bc6224ecc6ad69e41e2
|
||||
fritzconnection==1.9.1; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:9daa9a6c8366a77a2617b34b1db9b2191bb21ba638be35d691541a0892363a16 \
|
||||
--hash=sha256:244f74d62e426465108654d422d3a9e484c857b5bfaf088b623860f1874dd715
|
||||
gunicorn==20.1.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e \
|
||||
--hash=sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8
|
||||
icdiff==2.0.4; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
icdiff==2.0.4; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:c72572e5ce087bc7a7748af2664764d4a805897caeefb665bdc12677fefb2212
|
||||
idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_version >= "3.8" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
idna==3.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
--hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \
|
||||
--hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d
|
||||
packaging==21.3; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
importlib-metadata==4.2.0; python_version >= "3.7" and python_full_version < "4.0.0" and python_version < "3.8" \
|
||||
--hash=sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b \
|
||||
--hash=sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31
|
||||
packaging==21.3; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 \
|
||||
--hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb
|
||||
pprintpp==0.4.0; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
pprintpp==0.4.0; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d \
|
||||
--hash=sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403
|
||||
psycopg2==2.9.3; python_version >= "3.6" \
|
||||
|
@ -113,31 +99,34 @@ psycopg2==2.9.3; python_version >= "3.6" \
|
|||
--hash=sha256:8cf3878353cc04b053822896bc4922b194792df9df2f1ad8da01fb3043602126 \
|
||||
--hash=sha256:06f32425949bd5fe8f625c49f17ebb9784e1e4fe928b7cce72edc36fb68e4c0c \
|
||||
--hash=sha256:8e841d1bf3434da985cc5ef13e6f75c8981ced601fd70cc6bf33351b91562981
|
||||
pyparsing==3.0.7; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
pyparsing==3.0.7; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484 \
|
||||
--hash=sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea
|
||||
python-stdnum==1.17; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
python-stdnum==1.17; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:374e2b5e13912ccdbf50b0b23fca2c3e0531174805c32d74e145f37756328340 \
|
||||
--hash=sha256:a46e6cf9652807314d369b654b255c86a59f93d18be2834f3d567ed1a346c547
|
||||
pytz==2022.1; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c \
|
||||
--hash=sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7
|
||||
redis==4.2.1; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:69d05fac17bf3f43937afbb775c536eb516bd21355a4f17d59a966f4a531ce71 \
|
||||
--hash=sha256:fe45513881229dbee610620b9e0817b1f48c47ba635870320fd44a712204bbdd
|
||||
requests==2.27.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_version >= "3.8" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
requests==2.27.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "4.0.0" and python_full_version >= "3.6.0" \
|
||||
--hash=sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d \
|
||||
--hash=sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61
|
||||
six==1.16.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_version >= "3.8" and python_full_version < "4.0.0" and python_full_version >= "3.3.0" \
|
||||
six==1.16.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "4.0.0" and python_full_version >= "3.3.0" \
|
||||
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 \
|
||||
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926
|
||||
sqlparse==0.4.2; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
sqlparse==0.4.2; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d \
|
||||
--hash=sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae
|
||||
tzdata==2022.1; python_version >= "3.8" and python_full_version < "4.0.0" and sys_platform == "win32" \
|
||||
--hash=sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9 \
|
||||
--hash=sha256:8b536a8ec63dc0751342b3984193a3118f8fca2afe25752bb9b7fffd398552d3
|
||||
urllib3==1.26.9; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
typing-extensions==4.1.1; python_version >= "3.7" and python_full_version < "4.0.0" and python_version < "3.8" \
|
||||
--hash=sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2 \
|
||||
--hash=sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42
|
||||
urllib3==1.26.9; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14 \
|
||||
--hash=sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e
|
||||
webencodings==0.5.1; python_version >= "3.8" and python_full_version < "4.0.0" \
|
||||
webencodings==0.5.1; python_version >= "3.7" and python_full_version < "4.0.0" \
|
||||
--hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \
|
||||
--hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923
|
||||
wrapt==1.14.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "4.0.0" and python_full_version >= "3.5.0" \
|
||||
|
@ -205,3 +194,6 @@ wrapt==1.14.0; python_version >= "3.7" and python_full_version < "3.0.0" or pyth
|
|||
--hash=sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350 \
|
||||
--hash=sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc \
|
||||
--hash=sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311
|
||||
zipp==3.7.0; python_version >= "3.7" and python_full_version < "4.0.0" and python_version < "3.8" \
|
||||
--hash=sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375 \
|
||||
--hash=sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d
|
||||
|
|
|
@ -73,8 +73,8 @@ MANAGERS = ADMINS
|
|||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.postgresql',
|
||||
'NAME': '__APP__',
|
||||
'USER': '__APP__',
|
||||
'NAME': '__DB_NAME__',
|
||||
'USER': '__DB_USER__',
|
||||
'PASSWORD': '__DB_PWD__',
|
||||
'HOST': '127.0.0.1',
|
||||
'PORT': '5432', # Default Postgres Port
|
||||
|
|
137
doc/DISCLAIMER.md
Normal file
137
doc/DISCLAIMER.md
Normal file
|
@ -0,0 +1,137 @@
|
|||
[![pytest](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/pytest.yml/badge.svg?branch=master)](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/pytest.yml) [![YunoHost apps package linter](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/package_linter.yml/badge.svg)](https://github.com/YunoHost-Apps/django-fritzconnection_ynh/actions/workflows/package_linter.yml) [![Coverage Status on codecov.io](https://codecov.io/gh/YunoHost-Apps/django-fritzconnection_ynh/branch/master/graph/badge.svg)](https://codecov.io/gh/YunoHost-Apps/django-fritzconnection_ynh)
|
||||
|
||||
Pull requests welcome ;)
|
||||
|
||||
## Overview
|
||||
|
||||
This package for YunoHost used [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration)
|
||||
|
||||
|
||||
## Settings and upgrades
|
||||
|
||||
Almost everything related to django-fritzconnection's configuration is handled in a `"../conf/settings.py"` file.
|
||||
You can edit the file `/opt/yunohost/django-fritzconnection/local_settings.py` to enable or disable features.
|
||||
|
||||
Test sending emails:
|
||||
|
||||
```bash
|
||||
ssh admin@yourdomain.tld
|
||||
root@yunohost:~# cd /opt/yunohost/django-fritzconnection/
|
||||
root@yunohost:/opt/yunohost/django-fritzconnection# source venv/bin/activate
|
||||
(venv) root@yunohost:/opt/yunohost/django-fritzconnection# ./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-fritzconnection# ./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-fritzconnection/local_settings.py
|
||||
```
|
||||
|
||||
To check the effective settings, run this:
|
||||
```bash
|
||||
(venv) root@yunohost:/opt/yunohost/django-fritzconnection# ./manage.py diffsettings
|
||||
```
|
||||
|
||||
|
||||
# Miscellaneous
|
||||
|
||||
|
||||
## SSO authentication
|
||||
|
||||
[SSOwat](https://github.com/YunoHost/SSOwat) is fully supported via [django-yunohost-integration](https://github.com/YunoHost-Apps/django_yunohost_integration):
|
||||
|
||||
* 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
|
||||
|
||||
|
||||
---
|
||||
|
||||
# Yunohost developer commands
|
||||
|
||||
To remove call e.g.:
|
||||
```bash
|
||||
sudo yunohost app remove django-fritzconnection
|
||||
```
|
||||
|
||||
Backup / remove / restore cycle, e.g.:
|
||||
```bash
|
||||
yunohost backup create --apps django-fritzconnection
|
||||
yunohost backup list
|
||||
archives:
|
||||
- django-fritzconnection-pre-upgrade1
|
||||
- 20201223-163434
|
||||
yunohost app remove django-fritzconnection
|
||||
yunohost backup restore 20201223-163434 --apps django-fritzconnection
|
||||
```
|
||||
|
||||
Debug installation, e.g.:
|
||||
```bash
|
||||
root@yunohost:~# ls -la /var/www/django-fritzconnection/
|
||||
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-fritzconnection/
|
||||
total 58
|
||||
drwxr-xr-x 5 django-fritzconnection django-fritzconnection 11 Dec 8 08:39 .
|
||||
drwxr-xr-x 3 root root 3 Dec 8 08:36 ..
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 460 Dec 8 08:39 gunicorn.conf.py
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 0 Dec 8 08:39 local_settings.py
|
||||
-rwxr-xr-x 1 django-fritzconnection django-fritzconnection 274 Dec 8 08:39 manage.py
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 171 Dec 8 08:39 secret.txt
|
||||
drwxr-xr-x 6 django-fritzconnection django-fritzconnection 6 Dec 8 08:37 venv
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 115 Dec 8 08:39 wsgi.py
|
||||
-rw-r--r-- 1 django-fritzconnection django-fritzconnection 4737 Dec 8 08:39 settings.py
|
||||
|
||||
root@yunohost:~# cd /opt/yunohost/django-fritzconnection/
|
||||
root@yunohost:/opt/yunohost/django-fritzconnection# source venv/bin/activate
|
||||
(venv) root@yunohost:/opt/yunohost/django-fritzconnection# ./manage.py check
|
||||
django-fritzconnection v0.8.2 (Django v2.2.17)
|
||||
DJANGO_SETTINGS_MODULE='settings'
|
||||
PROJECT_PATH:/opt/yunohost/django-fritzconnection/venv/lib/python3.7/site-packages
|
||||
BASE_PATH:/opt/yunohost/django-fritzconnection
|
||||
System check identified no issues (0 silenced).
|
||||
|
||||
root@yunohost:~# tail -f /var/log/django-fritzconnection/django-fritzconnection.log
|
||||
root@yunohost:~# cat /etc/systemd/system/django-fritzconnection.service
|
||||
|
||||
root@yunohost:~# systemctl reload-or-restart django-fritzconnection
|
||||
root@yunohost:~# journalctl --unit=django-fritzconnection --follow
|
||||
```
|
||||
|
||||
## local test
|
||||
|
||||
For quicker developing of django-fritzconnection 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-fritzconnection_ynh.git
|
||||
~$ cd django-fritzconnection_ynh/
|
||||
~/django-fritzconnection_ynh$ make
|
||||
install-poetry install or update poetry
|
||||
install install django-fritzconnection via poetry
|
||||
update update the sources and installation
|
||||
local-test Run local_test.py to run django-fritzconnection_ynh locally
|
||||
~/django-fritzconnection_ynh$ make install-poetry
|
||||
~/django-fritzconnection_ynh$ make install
|
||||
~/django-fritzconnection_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/`
|
|
@ -5,8 +5,13 @@
|
|||
"description": {
|
||||
"en": "Web based FritzBox management using Python/Django."
|
||||
},
|
||||
"version": "0.0.2-alpha~ynh1",
|
||||
"version": "0.0.2.rc1~ynh1",
|
||||
"url": "https://github.com/jedie/django-fritzconnection",
|
||||
"upstream": {
|
||||
"license": "GPL-3.0",
|
||||
"website": "https://github.com/jedie/django-fritzconnection",
|
||||
"code": "https://github.com/jedie/django-fritzconnection"
|
||||
},
|
||||
"license": "GPL-3.0",
|
||||
"maintainer": {
|
||||
"name": "Jens Diemer",
|
||||
|
@ -24,8 +29,7 @@
|
|||
"install" : [
|
||||
{
|
||||
"name": "domain",
|
||||
"type": "domain",
|
||||
"example": "domain.org"
|
||||
"type": "domain"
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
|
@ -35,8 +39,7 @@
|
|||
},
|
||||
{
|
||||
"name": "admin",
|
||||
"type": "user",
|
||||
"example": "johndoe"
|
||||
"type": "user"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
168
poetry.lock
generated
168
poetry.lock
generated
|
@ -6,6 +6,9 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.dependencies]
|
||||
typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
|
||||
|
||||
[package.extras]
|
||||
tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
|
||||
|
||||
|
@ -25,6 +28,9 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""}
|
||||
|
||||
[[package]]
|
||||
name = "atomicwrites"
|
||||
version = "1.4.0"
|
||||
|
@ -47,17 +53,6 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
|
|||
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
|
||||
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
|
||||
|
||||
[[package]]
|
||||
name = "backports.zoneinfo"
|
||||
version = "0.2.1"
|
||||
description = "Backport of the standard library zoneinfo module"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.extras]
|
||||
tzdata = ["tzdata"]
|
||||
|
||||
[[package]]
|
||||
name = "black"
|
||||
version = "22.3.0"
|
||||
|
@ -72,6 +67,7 @@ mypy-extensions = ">=0.4.3"
|
|||
pathspec = ">=0.9.0"
|
||||
platformdirs = ">=2"
|
||||
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
|
||||
typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""}
|
||||
typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
|
||||
|
||||
[package.extras]
|
||||
|
@ -143,6 +139,7 @@ python-versions = ">=3.7"
|
|||
|
||||
[package.dependencies]
|
||||
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||
importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
|
||||
|
||||
[[package]]
|
||||
name = "colorama"
|
||||
|
@ -207,6 +204,7 @@ python-versions = ">=3.6"
|
|||
[package.dependencies]
|
||||
black = ">=21.5b1"
|
||||
toml = ">=0.10.0"
|
||||
typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
|
||||
|
||||
[package.extras]
|
||||
isort = ["isort (>=5.0.1)"]
|
||||
|
@ -245,17 +243,16 @@ python-versions = "*"
|
|||
|
||||
[[package]]
|
||||
name = "django"
|
||||
version = "4.0.3"
|
||||
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
|
||||
version = "3.2.12"
|
||||
description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
asgiref = ">=3.4.1,<4"
|
||||
"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""}
|
||||
asgiref = ">=3.3.2,<4"
|
||||
pytz = "*"
|
||||
sqlparse = ">=0.2.2"
|
||||
tzdata = {version = "*", markers = "sys_platform == \"win32\""}
|
||||
|
||||
[package.extras]
|
||||
argon2 = ["argon2-cffi (>=19.1.0)"]
|
||||
|
@ -298,11 +295,11 @@ sqlparse = ">=0.2.0"
|
|||
|
||||
[[package]]
|
||||
name = "django-fritzconnection"
|
||||
version = "0.0.2a0"
|
||||
version = "0.0.2rc1"
|
||||
description = "Web based FritzBox management using Python/Django."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8,<4.0.0"
|
||||
python-versions = ">=3.7,<4.0.0"
|
||||
|
||||
[package.dependencies]
|
||||
bx_django_utils = "*"
|
||||
|
@ -435,6 +432,7 @@ optional = false
|
|||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""}
|
||||
mccabe = ">=0.6.0,<0.7.0"
|
||||
pycodestyle = ">=2.8.0,<2.9.0"
|
||||
pyflakes = ">=2.4.0,<2.5.0"
|
||||
|
@ -495,6 +493,22 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
|
||||
[[package]]
|
||||
name = "importlib-metadata"
|
||||
version = "4.2.0"
|
||||
description = "Read metadata from Python packages"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
|
||||
zipp = ">=0.5"
|
||||
|
||||
[package.extras]
|
||||
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
||||
testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
|
||||
|
||||
[[package]]
|
||||
name = "iniconfig"
|
||||
version = "1.1.1"
|
||||
|
@ -572,6 +586,9 @@ category = "dev"
|
|||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
||||
|
||||
[package.extras]
|
||||
dev = ["pre-commit", "tox"]
|
||||
testing = ["pytest", "pytest-benchmark"]
|
||||
|
@ -639,6 +656,7 @@ python-versions = ">=3.7"
|
|||
atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
|
||||
attrs = ">=19.2.0"
|
||||
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
||||
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
||||
iniconfig = "*"
|
||||
packaging = "*"
|
||||
pluggy = ">=0.12,<2.0"
|
||||
|
@ -673,6 +691,7 @@ python-versions = ">=3.6"
|
|||
|
||||
[package.dependencies]
|
||||
darker = ">=1.1.0"
|
||||
typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
|
||||
|
||||
[package.extras]
|
||||
test = ["mypy (>=0.782)", "pytest (>=6.0.1)", "pytest-black", "pytest-isort (>=1.1.0)", "pytest-mypy"]
|
||||
|
@ -713,6 +732,7 @@ optional = false
|
|||
python-versions = ">=3.6,<4"
|
||||
|
||||
[package.dependencies]
|
||||
importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
|
||||
isort = ">=4.0"
|
||||
pytest = ">=5.0"
|
||||
|
||||
|
@ -729,6 +749,14 @@ soap = ["zeep"]
|
|||
soap-alt = ["suds"]
|
||||
soap-fallback = ["pysimplesoap"]
|
||||
|
||||
[[package]]
|
||||
name = "pytz"
|
||||
version = "2022.1"
|
||||
description = "World timezone definitions, modern and historical"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "pyupgrade"
|
||||
version = "2.31.1"
|
||||
|
@ -751,7 +779,9 @@ python-versions = ">=3.6"
|
|||
[package.dependencies]
|
||||
async-timeout = ">=4.0.2"
|
||||
deprecated = ">=1.2.3"
|
||||
importlib-metadata = {version = ">=1.0", markers = "python_version < \"3.8\""}
|
||||
packaging = ">=20.4"
|
||||
typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
|
||||
|
||||
[package.extras]
|
||||
hiredis = ["hiredis (>=1.0.0)"]
|
||||
|
@ -826,6 +856,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
|||
[package.dependencies]
|
||||
colorama = {version = ">=0.4.1", markers = "platform_system == \"Windows\""}
|
||||
filelock = ">=3.0.0"
|
||||
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
||||
packaging = ">=14"
|
||||
pluggy = ">=0.12.0"
|
||||
py = ">=1.4.17"
|
||||
|
@ -838,20 +869,20 @@ docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-a
|
|||
testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "psutil (>=5.6.1)", "pathlib2 (>=2.3.3)"]
|
||||
|
||||
[[package]]
|
||||
name = "typing-extensions"
|
||||
version = "4.1.1"
|
||||
description = "Backported and Experimental Type Hints for Python 3.6+"
|
||||
name = "typed-ast"
|
||||
version = "1.5.2"
|
||||
description = "a fork of Python 2 and 3 ast modules with type comment support"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "tzdata"
|
||||
version = "2022.1"
|
||||
description = "Provider of IANA time zone data"
|
||||
name = "typing-extensions"
|
||||
version = "4.1.1"
|
||||
description = "Backported and Experimental Type Hints for Python 3.6+"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2"
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "urllib3"
|
||||
|
@ -877,6 +908,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
|||
[package.dependencies]
|
||||
distlib = ">=0.3.1,<1"
|
||||
filelock = ">=3.2,<4"
|
||||
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
||||
platformdirs = ">=2,<3"
|
||||
six = ">=1.9.0,<2"
|
||||
|
||||
|
@ -900,10 +932,22 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
||||
|
||||
[[package]]
|
||||
name = "zipp"
|
||||
version = "3.7.0"
|
||||
description = "Backport of pathlib-compatible object wrapper for zip files"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.extras]
|
||||
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
||||
testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
|
||||
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = ">=3.8,<4.0.0"
|
||||
content-hash = "563e3ed49de687f4d2879a86eaea60c015f6611a3d752f2b699d407edda2f549"
|
||||
python-versions = ">=3.7,<4.0.0"
|
||||
content-hash = "8f3f43b394d701d10e15f02cea8b141f719e80b65bc2340332685c92512bb8be"
|
||||
|
||||
[metadata.files]
|
||||
asgiref = [
|
||||
|
@ -926,24 +970,6 @@ attrs = [
|
|||
{file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
|
||||
{file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
|
||||
]
|
||||
"backports.zoneinfo" = [
|
||||
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"},
|
||||
{file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"},
|
||||
{file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"},
|
||||
]
|
||||
black = [
|
||||
{file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"},
|
||||
{file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"},
|
||||
|
@ -1065,8 +1091,8 @@ distlib = [
|
|||
{file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"},
|
||||
]
|
||||
django = [
|
||||
{file = "Django-4.0.3-py3-none-any.whl", hash = "sha256:1239218849e922033a35d2a2f777cb8bee18bd725416744074f455f34ff50d0c"},
|
||||
{file = "Django-4.0.3.tar.gz", hash = "sha256:77ff2e7050e3324c9b67e29b6707754566f58514112a9ac73310f60cd5261930"},
|
||||
{file = "Django-3.2.12-py3-none-any.whl", hash = "sha256:9b06c289f9ba3a8abea16c9c9505f25107809fb933676f6c891ded270039d965"},
|
||||
{file = "Django-3.2.12.tar.gz", hash = "sha256:9772e6935703e59e993960832d66a614cf0233a1c5123bc6224ecc6ad69e41e2"},
|
||||
]
|
||||
django-admin-sortable2 = [
|
||||
{file = "django-admin-sortable2-1.0.4.tar.gz", hash = "sha256:f96044003176c6684c5f969792ca833a505d654fa0f7b24232a0a610e4332a53"},
|
||||
|
@ -1081,8 +1107,8 @@ django-debug-toolbar = [
|
|||
{file = "django_debug_toolbar-3.2.4-py3-none-any.whl", hash = "sha256:6b633b6cfee24f232d73569870f19aa86c819d750e7f3e833f2344a9eb4b4409"},
|
||||
]
|
||||
django-fritzconnection = [
|
||||
{file = "django-fritzconnection-0.0.2a0.tar.gz", hash = "sha256:2a32d6c61495052a80dee93103946503e1c8b5b6a940a5d2053388bc8d3cdbf3"},
|
||||
{file = "django_fritzconnection-0.0.2a0-py3-none-any.whl", hash = "sha256:de76455e328e7f4ac929cdd32e5f50659b86b9da890003c1f3b6f35daf6008a1"},
|
||||
{file = "django-fritzconnection-0.0.2rc1.tar.gz", hash = "sha256:d996ec1d65c4b2f43b90b5f346964be5e885cf36721cc0f42a7952aad824c950"},
|
||||
{file = "django_fritzconnection-0.0.2rc1-py3-none-any.whl", hash = "sha256:3c08cdd2d2d92ca08c9d10d4d1cc1df91aa1f5c83488b8fba6e6847f26800976"},
|
||||
]
|
||||
django-ipware = [
|
||||
{file = "django-ipware-4.0.2.tar.gz", hash = "sha256:602a58325a4808bd19197fef2676a0b2da2df40d0ecf21be414b2ff48c72ad05"},
|
||||
|
@ -1142,6 +1168,10 @@ idna = [
|
|||
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
||||
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
||||
]
|
||||
importlib-metadata = [
|
||||
{file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"},
|
||||
{file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"},
|
||||
]
|
||||
iniconfig = [
|
||||
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
||||
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
||||
|
@ -1235,6 +1265,10 @@ python-stdnum = [
|
|||
{file = "python-stdnum-1.17.tar.gz", hash = "sha256:374e2b5e13912ccdbf50b0b23fca2c3e0531174805c32d74e145f37756328340"},
|
||||
{file = "python_stdnum-1.17-py2.py3-none-any.whl", hash = "sha256:a46e6cf9652807314d369b654b255c86a59f93d18be2834f3d567ed1a346c547"},
|
||||
]
|
||||
pytz = [
|
||||
{file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"},
|
||||
{file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"},
|
||||
]
|
||||
pyupgrade = [
|
||||
{file = "pyupgrade-2.31.1-py2.py3-none-any.whl", hash = "sha256:4060a7c20c79d373a3dcf34566b275c6de6cd2b034ad22465d3263fb0de82648"},
|
||||
{file = "pyupgrade-2.31.1.tar.gz", hash = "sha256:22e0ad6dd39c4381805cb059f1e691b6315c62c0ebcec98a5f29d22cd186a72a"},
|
||||
|
@ -1271,14 +1305,36 @@ tox = [
|
|||
{file = "tox-3.24.5-py2.py3-none-any.whl", hash = "sha256:be3362472a33094bce26727f5f771ca0facf6dafa217f65875314e9a6600c95c"},
|
||||
{file = "tox-3.24.5.tar.gz", hash = "sha256:67e0e32c90e278251fea45b696d0fef3879089ccbe979b0c556d35d5a70e2993"},
|
||||
]
|
||||
typed-ast = [
|
||||
{file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"},
|
||||
{file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"},
|
||||
{file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985"},
|
||||
{file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76"},
|
||||
{file = "typed_ast-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a"},
|
||||
{file = "typed_ast-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837"},
|
||||
{file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78"},
|
||||
{file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e"},
|
||||
{file = "typed_ast-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d"},
|
||||
{file = "typed_ast-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd"},
|
||||
{file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88"},
|
||||
{file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7"},
|
||||
{file = "typed_ast-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30"},
|
||||
{file = "typed_ast-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4"},
|
||||
{file = "typed_ast-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca"},
|
||||
{file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb"},
|
||||
{file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b"},
|
||||
{file = "typed_ast-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7"},
|
||||
{file = "typed_ast-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098"},
|
||||
{file = "typed_ast-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344"},
|
||||
{file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e"},
|
||||
{file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e"},
|
||||
{file = "typed_ast-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5"},
|
||||
{file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"},
|
||||
]
|
||||
typing-extensions = [
|
||||
{file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"},
|
||||
{file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"},
|
||||
]
|
||||
tzdata = [
|
||||
{file = "tzdata-2022.1-py2.py3-none-any.whl", hash = "sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9"},
|
||||
{file = "tzdata-2022.1.tar.gz", hash = "sha256:8b536a8ec63dc0751342b3984193a3118f8fca2afe25752bb9b7fffd398552d3"},
|
||||
]
|
||||
urllib3 = [
|
||||
{file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"},
|
||||
{file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"},
|
||||
|
@ -1357,3 +1413,7 @@ wrapt = [
|
|||
{file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"},
|
||||
{file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"},
|
||||
]
|
||||
zipp = [
|
||||
{file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"},
|
||||
{file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"},
|
||||
]
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
[tool.poetry]
|
||||
name = "django-fritzconnection_ynh"
|
||||
version = "0.0.2-alpha~ynh1"
|
||||
version = "0.0.2.rc1~ynh1"
|
||||
description = "Test django-fritzconnection_ynh via local_test.py"
|
||||
authors = ["JensDiemer <git@jensdiemer.de>"]
|
||||
license = "GPL"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.8,<4.0.0"
|
||||
django-fritzconnection = ">=0.0.2-alpha"
|
||||
# Keep Python 3.7 until Yunohost contains a newer Python Version ;)
|
||||
python = ">=3.7,<4.0.0"
|
||||
django-fritzconnection = ">=0.0.2rc1"
|
||||
|
||||
# Note: "ynh" extras will install gunicorn, psycopg2, django-redis and django-axes
|
||||
django_yunohost_integration = {version = ">=v0.2.0", extras = ["ynh"]}
|
||||
|
@ -38,7 +39,7 @@ build-backend = "poetry.core.masonry.api"
|
|||
[tool.darker]
|
||||
src = ['.']
|
||||
revision = "origin/master..."
|
||||
line_length = 120
|
||||
line_length = 100
|
||||
verbose = true
|
||||
skip_string_normalization = true
|
||||
diff = false
|
||||
|
@ -52,14 +53,14 @@ log_level = "INFO"
|
|||
|
||||
|
||||
[tool.flynt]
|
||||
line_length = 120
|
||||
line_length = 100
|
||||
|
||||
|
||||
[tool.isort]
|
||||
# https://pycqa.github.io/isort/docs/configuration/config_files/#pyprojecttoml-preferred-format
|
||||
atomic=true
|
||||
profile='black'
|
||||
line_length=120
|
||||
line_length=100
|
||||
skip_glob=["*/htmlcov/*","*/migrations/*"]
|
||||
known_first_party=["djfritz","djfritz_project","djfritz_tests"]
|
||||
lines_after_imports=2
|
||||
|
@ -100,7 +101,7 @@ addopts = """
|
|||
legacy_tox_ini = """
|
||||
[tox]
|
||||
isolated_build = True
|
||||
envlist = px310,py39,py38
|
||||
envlist = px310,py39,py38,py37
|
||||
skip_missing_interpreters = True
|
||||
|
||||
[testenv]
|
||||
|
|
|
@ -134,12 +134,16 @@ ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_f
|
|||
ynh_store_file_checksum --file="$gunicorn_conf"
|
||||
|
||||
cp ../conf/manage.py "$final_path/manage.py"
|
||||
ynh_replace_string --match_string="__FINAL_HOME_PATH__" --replace_string="$final_path" --target_file="$final_path/manage.py"
|
||||
ynh_store_file_checksum --file="$final_path/manage.py"
|
||||
chmod +x "$final_path/manage.py"
|
||||
|
||||
settings="$final_path/settings.py"
|
||||
cp "../conf/settings.py" "$settings"
|
||||
|
||||
ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$settings"
|
||||
ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$settings"
|
||||
ynh_replace_string --match_string="__DB_USER__" --replace_string="$db_user" --target_file="$settings"
|
||||
ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$settings"
|
||||
ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$settings"
|
||||
ynh_replace_string --match_string="__ADMINMAIL__" --replace_string="$admin_mail" --target_file="$settings"
|
||||
|
@ -167,11 +171,7 @@ touch "$final_path/local_settings.py"
|
|||
#=================================================
|
||||
ynh_script_progression --message="migrate/collectstatic/createadmin..." --weight=10
|
||||
|
||||
(
|
||||
set +o nounset
|
||||
source "${final_path}/venv/bin/activate"
|
||||
set -o nounset
|
||||
cd "${final_path}"
|
||||
cd "$final_path" || exit
|
||||
|
||||
# Just for debugging:
|
||||
./manage.py diffsettings
|
||||
|
@ -185,7 +185,7 @@ ynh_script_progression --message="migrate/collectstatic/createadmin..." --weight
|
|||
# Check the configuration
|
||||
# This may fail in some cases with errors, etc., but the app works and the user can fix issues later.
|
||||
./manage.py check --deploy || true
|
||||
)
|
||||
|
||||
|
||||
#=================================================
|
||||
# SETUP LOGROTATE
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
from pathlib import Path
|
||||
|
||||
from axes.models import AccessLog
|
||||
from bx_django_utils.test_utils.html_assertion import HtmlAssertionMixin
|
||||
from django.conf import LazySettings, settings
|
||||
from django.contrib.auth.models import User
|
||||
|
@ -11,7 +10,7 @@ from django.urls.base import reverse
|
|||
from django_yunohost_integration.test_utils import generate_basic_auth
|
||||
from django_yunohost_integration.views import request_media_debug_view
|
||||
|
||||
import inventory
|
||||
import djfritz
|
||||
|
||||
|
||||
@override_settings(DEBUG=False)
|
||||
|
@ -40,18 +39,12 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
assert settings.ROOT_URLCONF == 'urls'
|
||||
|
||||
def test_urls(self):
|
||||
assert reverse('admin:index') == '/app_path/'
|
||||
assert reverse('admin:index') == '/app_path/admin/'
|
||||
|
||||
# The django_yunohost_integration debug view should not be available:
|
||||
with self.assertRaises(NoReverseMatch):
|
||||
reverse(request_media_debug_view)
|
||||
|
||||
# Serve user uploads via django_tools.serve_media_app:
|
||||
assert settings.MEDIA_URL == '/app_path/media/'
|
||||
assert reverse('serve_media_app:serve-media', kwargs={'user_token': 'token', 'path': 'foo/bar/'}) == (
|
||||
'/app_path/media/token/foo/bar/'
|
||||
)
|
||||
|
||||
def test_auth(self):
|
||||
# SecurityMiddleware should redirects all non-HTTPS requests to HTTPS:
|
||||
assert settings.SECURE_SSL_REDIRECT is True
|
||||
|
@ -64,7 +57,16 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
)
|
||||
|
||||
response = self.client.get('/app_path/', secure=True)
|
||||
self.assertRedirects(response, expected_url='/app_path/login/?next=/app_path/', fetch_redirect_response=False)
|
||||
self.assertRedirects(
|
||||
response, expected_url='/app_path/admin/', fetch_redirect_response=False
|
||||
)
|
||||
|
||||
response = self.client.get('/app_path/admin/', secure=True)
|
||||
self.assertRedirects(
|
||||
response,
|
||||
expected_url='/app_path/admin/login/?next=/app_path/admin/',
|
||||
fetch_redirect_response=False,
|
||||
)
|
||||
|
||||
@override_settings(SECURE_SSL_REDIRECT=False)
|
||||
def test_create_unknown_user(self):
|
||||
|
@ -73,7 +75,7 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
self.client.cookies['SSOwAuthUser'] = 'test'
|
||||
|
||||
response = self.client.get(
|
||||
path='/app_path/',
|
||||
path='/app_path/admin/',
|
||||
HTTP_REMOTE_USER='test',
|
||||
HTTP_AUTH_USER='test',
|
||||
HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz',
|
||||
|
@ -90,7 +92,10 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
self.assert_html_parts(
|
||||
response,
|
||||
parts=(
|
||||
f'<title>Site administration | django-fritzconnection v{inventory.__version__}</title>',
|
||||
(
|
||||
'<title>Site administration | django-fritzconnection'
|
||||
f' v{djfritz.__version__}</title>'
|
||||
),
|
||||
'<strong>test</strong>',
|
||||
),
|
||||
)
|
||||
|
@ -98,12 +103,11 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
@override_settings(SECURE_SSL_REDIRECT=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/',
|
||||
path='/app_path/admin/',
|
||||
HTTP_REMOTE_USER='test',
|
||||
HTTP_AUTH_USER='foobar', # <<< wrong user name
|
||||
HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz',
|
||||
|
@ -116,19 +120,16 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
assert user.is_staff is True # Set by: django_yunohost_integration
|
||||
assert user.is_superuser is False
|
||||
|
||||
assert AccessLog.objects.count() == 1
|
||||
|
||||
assert response.status_code == 403 # Forbidden
|
||||
|
||||
@override_settings(SECURE_SSL_REDIRECT=False)
|
||||
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/',
|
||||
path='/app_path/admin/',
|
||||
HTTP_REMOTE_USER='test',
|
||||
HTTP_AUTH_USER='test',
|
||||
HTTP_AUTHORIZATION='basic dGVzdDp0ZXN0MTIz',
|
||||
|
@ -141,8 +142,6 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
assert user.is_staff is True # Set by: django_yunohost_integration
|
||||
assert user.is_superuser is False
|
||||
|
||||
assert AccessLog.objects.count() == 1
|
||||
|
||||
assert response.status_code == 403 # Forbidden
|
||||
|
||||
@override_settings(SECURE_SSL_REDIRECT=False)
|
||||
|
@ -152,10 +151,12 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
self.client.cookies['SSOwAuthUser'] = 'test'
|
||||
|
||||
response = self.client.get(
|
||||
path='/app_path/',
|
||||
path='/app_path/admin/',
|
||||
HTTP_REMOTE_USER='test',
|
||||
HTTP_AUTH_USER='test',
|
||||
HTTP_AUTHORIZATION=generate_basic_auth(username='foobar', password='test123'), # <<< wrong user name
|
||||
HTTP_AUTHORIZATION=generate_basic_auth(
|
||||
username='foobar', password='test123'
|
||||
), # <<< wrong user name
|
||||
)
|
||||
|
||||
assert User.objects.count() == 1
|
||||
|
@ -165,6 +166,4 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase):
|
|||
assert user.is_staff is True # Set by: django_yunohost_integration
|
||||
assert user.is_superuser is False
|
||||
|
||||
assert AccessLog.objects.count() == 1
|
||||
|
||||
assert response.status_code == 403 # Forbidden
|
||||
|
|
|
@ -6,7 +6,7 @@ from pathlib import Path
|
|||
|
||||
from bx_py_utils.path import assert_is_file
|
||||
|
||||
import inventory
|
||||
import djfritz
|
||||
|
||||
|
||||
PACKAGE_ROOT = Path(__file__).parent.parent
|
||||
|
@ -21,10 +21,14 @@ def assert_file_contains_string(file_path, string):
|
|||
|
||||
|
||||
def test_version():
|
||||
version = inventory.__version__
|
||||
version = djfritz.__version__
|
||||
|
||||
assert_file_contains_string(file_path=Path(PACKAGE_ROOT, 'pyproject.toml'), string=f'version = "{version}~ynh')
|
||||
assert_file_contains_string(file_path=Path(PACKAGE_ROOT, 'manifest.json'), string=f'"version": "{version}~ynh')
|
||||
assert_file_contains_string(
|
||||
file_path=Path(PACKAGE_ROOT, 'pyproject.toml'), string=f'version = "{version}~ynh'
|
||||
)
|
||||
assert_file_contains_string(
|
||||
file_path=Path(PACKAGE_ROOT, 'manifest.json'), string=f'"version": "{version}~ynh'
|
||||
)
|
||||
|
||||
|
||||
def poetry_check_output(*args):
|
||||
|
@ -57,7 +61,10 @@ def test_requirements_txt():
|
|||
|
||||
diff = '\n'.join(
|
||||
difflib.unified_diff(
|
||||
current_content.splitlines(), output.splitlines(), fromfile=str(requirements_txt), tofile='FRESH EXPORT'
|
||||
current_content.splitlines(),
|
||||
output.splitlines(),
|
||||
fromfile=str(requirements_txt),
|
||||
tofile='FRESH EXPORT',
|
||||
)
|
||||
)
|
||||
print(diff)
|
||||
|
|
Loading…
Reference in a new issue