mirror of https://gitlab.crans.org/bde/nk20
Merge branch 'debian_deps' into 'beta'
Debian deps See merge request bde/nk20!103
This commit is contained in:
commit
08defd84e6
|
@ -1,25 +1,51 @@
|
||||||
image: python:3.8
|
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- test
|
- test
|
||||||
- quality-assurance
|
- quality-assurance
|
||||||
|
|
||||||
before_script:
|
# Debian Buster
|
||||||
- pip install tox
|
|
||||||
|
|
||||||
py37-django22:
|
py37-django22:
|
||||||
image: python:3.7
|
|
||||||
stage: test
|
stage: test
|
||||||
|
image: debian:buster-backports
|
||||||
|
before_script:
|
||||||
|
- >
|
||||||
|
apt-get update &&
|
||||||
|
apt-get install -t buster-backports -y python3-django python3-django-crispy-forms
|
||||||
|
python3-django-extensions python3-django-filters python3-django-polymorphic
|
||||||
|
python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil
|
||||||
|
python3-babel python3-lockfile python3-pip python3-phonenumbers ipython3
|
||||||
|
gettext libjs-bootstrap4 fonts-font-awesome tox &&
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
script: tox -e py37-django22
|
script: tox -e py37-django22
|
||||||
|
|
||||||
|
# Ubuntu 20.04
|
||||||
py38-django22:
|
py38-django22:
|
||||||
image: python:3.8
|
|
||||||
stage: test
|
stage: test
|
||||||
|
image: ubuntu:20.04
|
||||||
|
before_script:
|
||||||
|
# Fix tzdata prompt
|
||||||
|
- ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime && echo Europe/Paris > /etc/timezone
|
||||||
|
- >
|
||||||
|
apt-get update &&
|
||||||
|
apt-get install -y python3-django python3-django-crispy-forms
|
||||||
|
python3-django-extensions python3-django-filters python3-django-polymorphic
|
||||||
|
python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil
|
||||||
|
python3-babel python3-lockfile python3-pip python3-phonenumbers ipython3
|
||||||
|
gettext libjs-bootstrap4 fonts-font-awesome tox &&
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
script: tox -e py38-django22
|
script: tox -e py38-django22
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
image: python:3.8
|
|
||||||
stage: quality-assurance
|
stage: quality-assurance
|
||||||
|
image: debian:buster-backports
|
||||||
|
before_script:
|
||||||
|
- >
|
||||||
|
apt-get update &&
|
||||||
|
apt-get install -t buster-backports -y python3-django python3-django-crispy-forms
|
||||||
|
python3-django-extensions python3-django-filters python3-django-polymorphic
|
||||||
|
python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil
|
||||||
|
python3-babel python3-lockfile python3-pip python3-phonenumbers ipython3
|
||||||
|
gettext libjs-bootstrap4 fonts-font-awesome tox &&
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
script: tox -e linters
|
script: tox -e linters
|
||||||
|
|
||||||
# Be nice to new contributors, but please use `tox`
|
# Be nice to new contributors, but please use `tox`
|
||||||
|
|
41
Dockerfile
41
Dockerfile
|
@ -1,27 +1,26 @@
|
||||||
FROM python:3-alpine
|
FROM debian:buster-backports
|
||||||
|
|
||||||
|
# Force the stdout and stderr streams to be unbuffered
|
||||||
ENV PYTHONUNBUFFERED 1
|
ENV PYTHONUNBUFFERED 1
|
||||||
|
|
||||||
# Install LaTeX requirements
|
# Install Django, external apps, LaTeX and dependencies
|
||||||
RUN apk add --no-cache gettext texlive texmf-dist-latexextra texmf-dist-fontsextra nginx gcc libc-dev libffi-dev postgresql-dev libxml2-dev libxslt-dev jpeg-dev
|
RUN apt-get update && \
|
||||||
|
apt-get install -t buster-backports -y python3-django python3-django-crispy-forms \
|
||||||
|
python3-django-extensions python3-django-filters python3-django-polymorphic \
|
||||||
|
python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil \
|
||||||
|
python3-babel python3-lockfile python3-pip python3-phonenumbers ipython3 \
|
||||||
|
uwsgi uwsgi-plugin-python3 \
|
||||||
|
texlive-latex-extra texlive-fonts-extra texlive-lang-french \
|
||||||
|
gettext libjs-bootstrap4 fonts-font-awesome && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
RUN apk add --no-cache bash
|
# Instal PyPI requirements
|
||||||
|
COPY requirements.txt /var/www/note_kfet/
|
||||||
|
RUN pip3 install -r /var/www/note_kfet/requirements.txt --no-cache-dir
|
||||||
|
|
||||||
RUN mkdir /code
|
# Copy code
|
||||||
WORKDIR /code
|
WORKDIR /var/www/note_kfet
|
||||||
COPY requirements /code/requirements
|
COPY . /var/www/note_kfet/
|
||||||
RUN pip install gunicorn ptpython --no-cache-dir
|
|
||||||
RUN pip install -r requirements/base.txt -r requirements/cas.txt -r requirements/production.txt --no-cache-dir
|
|
||||||
|
|
||||||
COPY . /code/
|
EXPOSE 8080
|
||||||
|
ENTRYPOINT ["/var/www/note_kfet/entrypoint.sh"]
|
||||||
# Configure nginx
|
|
||||||
RUN mkdir /run/nginx
|
|
||||||
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
|
|
||||||
RUN ln -sf /code/nginx_note.conf_docker /etc/nginx/conf.d/nginx_note.conf
|
|
||||||
RUN rm /etc/nginx/conf.d/default.conf
|
|
||||||
|
|
||||||
ENTRYPOINT ["/code/entrypoint.sh"]
|
|
||||||
EXPOSE 80
|
|
||||||
|
|
||||||
CMD ["./manage.py", "shell_plus", "--ptpython"]
|
|
||||||
|
|
69
README.md
69
README.md
|
@ -14,21 +14,25 @@ Sinon vous pouvez suivre les étapes ici.
|
||||||
### Installation avec Debian/Ubuntu
|
### Installation avec Debian/Ubuntu
|
||||||
|
|
||||||
1. **Installation des dépendances APT.**
|
1. **Installation des dépendances APT.**
|
||||||
|
On tire les dépendances le plus possible à partir des dépôts de Debian.
|
||||||
|
On a besoin d'un environnement LaTeX pour générer les factures.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ sudo apt install nginx python3 python3-pip python3-dev uwsgi uwsgi-plugin-python3 python3-venv git acl
|
$ sudo apt update
|
||||||
```
|
$ sudo apt install -t buster-backports -y python3-django python3-django-crispy-forms \
|
||||||
|
python3-django-extensions python3-django-filters python3-django-polymorphic \
|
||||||
La génération des factures de l'application trésorerie nécessite une installation de LaTeX suffisante,
|
python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil \
|
||||||
|
python3-babel python3-lockfile python3-pip python3-phonenumbers ipython3 \
|
||||||
```bash
|
uwsgi uwsgi-plugin-python3 \
|
||||||
$ sudo apt install texlive-latex-extra texlive-fonts-extra texlive-lang-french
|
texlive-latex-extra texlive-fonts-extra texlive-lang-french \
|
||||||
|
gettext libjs-bootstrap4 fonts-font-awesome \
|
||||||
|
nginx python3-venv git acl
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Clonage du dépot** dans `/var/www/note_kfet`,
|
2. **Clonage du dépot** dans `/var/www/note_kfet`,
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ mkdir -p /var/www/note_kfet && cd /var/www/note_kfet
|
$ sudo mkdir -p /var/www/note_kfet && cd /var/www/note_kfet
|
||||||
$ sudo chown www-data:www-data .
|
$ sudo chown www-data:www-data .
|
||||||
$ sudo chmod g+rwx .
|
$ sudo chmod g+rwx .
|
||||||
$ sudo -u www-data git clone git@gitlab.crans.org:bde/nk20.git .
|
$ sudo -u www-data git clone git@gitlab.crans.org:bde/nk20.git .
|
||||||
|
@ -39,8 +43,7 @@ Sinon vous pouvez suivre les étapes ici.
|
||||||
```bash
|
```bash
|
||||||
$ python3 -m venv env
|
$ python3 -m venv env
|
||||||
$ source env/bin/activate
|
$ source env/bin/activate
|
||||||
(env)$ pip3 install -r requirements/base.txt
|
(env)$ pip3 install -r requirements.txt
|
||||||
(env)$ pip3 install -r requirements/prod.txt # uniquement en prod, nécessite une base postgres
|
|
||||||
(env)$ deactivate # sortir de l'environnement
|
(env)$ deactivate # sortir de l'environnement
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -144,30 +147,44 @@ Sinon vous pouvez suivre les étapes ici.
|
||||||
|
|
||||||
Il est possible de travailler sur une instance Docker.
|
Il est possible de travailler sur une instance Docker.
|
||||||
|
|
||||||
1. Cloner le dépôt là où vous voulez :
|
Pour construire l'image Docker `nk20`,
|
||||||
|
|
||||||
$ git clone git@gitlab.crans.org:bde/nk20.git
|
```
|
||||||
|
git clone https://gitlab.crans.org/bde/nk20/ && cd nk20
|
||||||
|
docker build . -t nk20
|
||||||
|
```
|
||||||
|
|
||||||
2. Copiez le fichier `.env_example` à la racine du projet vers le fichier `.env`,
|
Ensuite pour lancer la note Kfet en tant que vous (option `-u`),
|
||||||
et mettez à jour vos variables d'environnement
|
l'exposer sur son port 80 (option `-p`) et monter le code en écriture (option `-v`),
|
||||||
|
|
||||||
3. Dans le fichier `docker_compose.yml`, qu'on suppose déjà configuré,
|
```
|
||||||
ajouter les lignes suivantes, en les adaptant à la configuration voulue :
|
docker run -it --rm -u $(id -u):$(id -g) -v "$(pwd):/var/www/note_kfet/" -p 80:8080 nk20
|
||||||
|
```
|
||||||
|
|
||||||
nk20:
|
Si vous souhaitez lancer une commande spéciale, vous pouvez l'ajouter à la fin, par exemple,
|
||||||
build: /chemin/vers/nk20
|
|
||||||
|
```
|
||||||
|
docker run -it --rm -u $(id -u):$(id -g) -v "$(pwd):/var/www/note_kfet/" -p 80:8080 nk20 python3 ./manage.py createsuperuser
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Avec Docker Compose
|
||||||
|
|
||||||
|
On vous conseilles de faire un fichier d'environnement `.env` en prenant exemple sur `.env_example`.
|
||||||
|
|
||||||
|
Pour par exemple utiliser le Docker de la note Kfet avec Traefik pour réaliser le HTTPS,
|
||||||
|
|
||||||
|
```YAML
|
||||||
|
nk20:
|
||||||
|
build: /chemin/vers/le/code/nk20
|
||||||
volumes:
|
volumes:
|
||||||
- /chemin/vers/nk20:/code/
|
- /chemin/vers/le/code/nk20:/var/www/note_kfet/
|
||||||
env_file: /chemin/vers/nk20/.env
|
env_file: /chemin/vers/le/code/nk20/.env
|
||||||
restart: always
|
restart: always
|
||||||
labels:
|
labels:
|
||||||
- traefik.domain=ndd.example.com
|
- traefik.domain=ndd.example.com
|
||||||
- traefik.frontend.rule=Host:ndd.example.com
|
- traefik.frontend.rule=Host:ndd.example.com
|
||||||
- traefik.port=8000
|
- traefik.port=8080
|
||||||
|
```
|
||||||
4. Enjoy :
|
|
||||||
|
|
||||||
$ docker-compose up -d nk20
|
|
||||||
|
|
||||||
### Lancer un serveur de développement
|
### Lancer un serveur de développement
|
||||||
|
|
||||||
|
@ -183,7 +200,7 @@ un serveur de développement par exemple sur son ordinateur.
|
||||||
|
|
||||||
$ python3 -m venv venv
|
$ python3 -m venv venv
|
||||||
$ source venv/bin/activate
|
$ source venv/bin/activate
|
||||||
(env)$ pip install -r requirements/base.txt
|
(env)$ pip install -r requirements.txt
|
||||||
|
|
||||||
3. Copier le fichier `.env_example` vers `.env` à la racine du projet et mettre à jour
|
3. Copier le fichier `.env_example` vers `.env` à la racine du projet et mettre à jour
|
||||||
ce qu'il faut
|
ce qu'il faut
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
- git
|
- git
|
||||||
- acl
|
- acl
|
||||||
- gettext
|
- gettext
|
||||||
|
- libjs-bootstrap4
|
||||||
|
- fonts-font-awesome
|
||||||
- texlive-latex-extra
|
- texlive-latex-extra
|
||||||
- texlive-fonts-extra
|
- texlive-fonts-extra
|
||||||
- texlive-lang-french
|
- texlive-lang-french
|
||||||
|
|
|
@ -53,7 +53,7 @@ server {
|
||||||
# Finally, send all non-media requests to the Django server.
|
# Finally, send all non-media requests to the Django server.
|
||||||
location / {
|
location / {
|
||||||
uwsgi_pass note;
|
uwsgi_pass note;
|
||||||
include /var/www/note_kfet/uwsgi_params; # the uwsgi_params file you installed
|
include /etc/nginx/uwsgi_params;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssl_certificate /etc/letsencrypt/live/nk20-beta.crans.org/fullchain.pem;
|
ssl_certificate /etc/letsencrypt/live/nk20-beta.crans.org/fullchain.pem;
|
||||||
|
|
|
@ -69,11 +69,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if can_lock_note %}
|
{% if can_lock_note %}
|
||||||
<button class="btn btn-sm btn-danger" data-toggle="modal" data-target="#lock-note-modal">
|
<button class="btn btn-sm btn-danger" data-toggle="modal" data-target="#lock-note-modal">
|
||||||
<i class="fas fa-ban"></i> {% trans 'Lock note' %}
|
<i class="fa fa-ban"></i> {% trans 'Lock note' %}
|
||||||
</button>
|
</button>
|
||||||
{% elif can_unlock_note %}
|
{% elif can_unlock_note %}
|
||||||
<button class="btn btn-sm btn-success" data-toggle="modal" data-target="#unlock-note-modal">
|
<button class="btn btn-sm btn-success" data-toggle="modal" data-target="#unlock-note-modal">
|
||||||
<i class="fas fa-check-circle"></i> {% trans 'Unlock note' %}
|
<i class="fa fa-check-circle"></i> {% trans 'Unlock note' %}
|
||||||
</button>
|
</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -7,7 +7,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if "member.change_profile_registration_valid"|has_perm:user %}
|
{% if "member.change_profile_registration_valid"|has_perm:user %}
|
||||||
<a class="btn btn-block btn-secondary mb-3" href="{% url 'registration:future_user_list' %}">
|
<a class="btn btn-block btn-secondary mb-3" href="{% url 'registration:future_user_list' %}">
|
||||||
<i class="fas fa-user-plus"></i> {% trans "Registrations" %}
|
<i class="fa fa-user-plus"></i> {% trans "Registrations" %}
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
</h3>
|
</h3>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="alert alert-info">
|
<div class="alert alert-info">
|
||||||
<i class="fas fa-info-circle"></i> {% trans "Superusers have all rights on everything, to manage the website." %}
|
<i class="fa fa-info-circle"></i> {% trans "Superusers have all rights on everything, to manage the website." %}
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-head">
|
<div class="card-head">
|
||||||
|
|
|
@ -43,14 +43,14 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
{% with bde_kfet_fee=club.parent_club.membership_fee_paid|add:club.parent_club.parent_club.membership_fee_paid %}
|
{% with bde_kfet_fee=club.parent_club.membership_fee_paid|add:club.parent_club.parent_club.membership_fee_paid %}
|
||||||
<dt class="col-xl-6">{% trans 'WEI fee (paid students)'|capfirst %}</dt>
|
<dt class="col-xl-6">{% trans 'WEI fee (paid students)'|capfirst %}</dt>
|
||||||
<dd class="col-xl-6">{{ club.membership_fee_paid|add:bde_kfet_fee|pretty_money }}
|
<dd class="col-xl-6">{{ club.membership_fee_paid|add:bde_kfet_fee|pretty_money }}
|
||||||
<i class="fas fa-question-circle"
|
<i class="fa fa-question-circle"
|
||||||
title="{% trans "The BDE membership is included in the WEI registration." %}"></i></dd>
|
title="{% trans "The BDE membership is included in the WEI registration." %}"></i></dd>
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
|
|
||||||
{% with bde_kfet_fee=club.parent_club.membership_fee_unpaid|add:club.parent_club.parent_club.membership_fee_unpaid %}
|
{% with bde_kfet_fee=club.parent_club.membership_fee_unpaid|add:club.parent_club.parent_club.membership_fee_unpaid %}
|
||||||
<dt class="col-xl-6">{% trans 'WEI fee (unpaid students)'|capfirst %}</dt>
|
<dt class="col-xl-6">{% trans 'WEI fee (unpaid students)'|capfirst %}</dt>
|
||||||
<dd class="col-xl-6">{{ club.membership_fee_unpaid|add:bde_kfet_fee|pretty_money }}
|
<dd class="col-xl-6">{{ club.membership_fee_unpaid|add:bde_kfet_fee|pretty_money }}
|
||||||
<i class="fas fa-question-circle"
|
<i class="fa fa-question-circle"
|
||||||
title="{% trans "The BDE membership is included in the WEI registration." %}"></i></dd>
|
title="{% trans "The BDE membership is included in the WEI registration." %}"></i></dd>
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -5,20 +5,29 @@
|
||||||
if [ -z ${NOTE_URL+x} ]; then
|
if [ -z ${NOTE_URL+x} ]; then
|
||||||
echo "Warning: your env files are not configurated."
|
echo "Warning: your env files are not configurated."
|
||||||
else
|
else
|
||||||
sed -i -e "s/example.com/$DOMAIN/g" /code/apps/member/fixtures/initial.json
|
sed -i -e "s/example.com/$DOMAIN/g" /var/www/note_kfet/apps/member/fixtures/initial.json
|
||||||
sed -i -e "s/localhost/$NOTE_URL/g" /code/note_kfet/fixtures/initial.json
|
sed -i -e "s/localhost/$NOTE_URL/g" /var/www/note_kfet/note_kfet/fixtures/initial.json
|
||||||
sed -i -e "s/\"\.\*\"/\"https?:\/\/$NOTE_URL\/.*\"/g" /code/note_kfet/fixtures/cas.json
|
sed -i -e "s/\"\.\*\"/\"https?:\/\/$NOTE_URL\/.*\"/g" /var/www/note_kfet/note_kfet/fixtures/cas.json
|
||||||
sed -i -e "s/REPLACEME/La Note Kfet \\\\ud83c\\\\udf7b/g" /code/note_kfet/fixtures/cas.json
|
sed -i -e "s/REPLACEME/La Note Kfet \\\\ud83c\\\\udf7b/g" /var/www/note_kfet/note_kfet/fixtures/cas.json
|
||||||
fi
|
fi
|
||||||
|
|
||||||
python manage.py compilemessages
|
# Set up Django project
|
||||||
python manage.py makemigrations
|
python3 manage.py collectstatic --noinput
|
||||||
python manage.py migrate
|
python3 manage.py compilemessages
|
||||||
|
python3 manage.py makemigrations
|
||||||
|
python3 manage.py migrate
|
||||||
|
|
||||||
nginx
|
if [ "$1" ]; then
|
||||||
|
# Command passed
|
||||||
if [ "$DJANGO_APP_STAGE" = "prod" ]; then
|
echo "Running $@..."
|
||||||
gunicorn -b 0.0.0.0:8000 --workers=2 --threads=4 --worker-class=gthread note_kfet.wsgi --access-logfile '-' --error-logfile '-';
|
$@
|
||||||
else
|
else
|
||||||
python manage.py runserver 0.0.0.0:8000;
|
# Launch server
|
||||||
|
if [ "$DJANGO_APP_STAGE" = "prod" ]; then
|
||||||
|
uwsgi --http-socket 0.0.0.0:8080 --master --plugins python3 \
|
||||||
|
--module note_kfet.wsgi:application --env DJANGO_SETTINGS_MODULE=note_kfet.settings \
|
||||||
|
--processes 4 --static-map /static=/var/www/note_kfet/static --harakiri=20 --max-requests=5000 --vacuum
|
||||||
|
else
|
||||||
|
python3 manage.py runserver 0.0.0.0:8080;
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
# This is an example NGINX site configuration for note_kfet in Docker
|
|
||||||
# Only HTTP, please use a reverse proxy to secure it!
|
|
||||||
|
|
||||||
server {
|
|
||||||
# Serve this site by default on HTTP
|
|
||||||
listen 80 default_server;
|
|
||||||
listen [::]:80 default_server;
|
|
||||||
|
|
||||||
# Max upload size
|
|
||||||
client_max_body_size 75M;
|
|
||||||
|
|
||||||
# Django statics and media
|
|
||||||
location /static {
|
|
||||||
alias /code/static;
|
|
||||||
}
|
|
||||||
location /media {
|
|
||||||
alias /code/media;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Send all non-media requests to the Django server.
|
|
||||||
location / {
|
|
||||||
proxy_pass http://127.0.0.1:8000;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_redirect off;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -164,8 +164,10 @@ LANGUAGES = [
|
||||||
STATIC_URL = '/static/'
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
# Add some custom statics from /note_kfet/static
|
# Add some custom statics from /note_kfet/static
|
||||||
|
# Because we are using Debian, also include /usr/share/javascript
|
||||||
STATICFILES_DIRS = [
|
STATICFILES_DIRS = [
|
||||||
os.path.join(BASE_DIR, 'note_kfet/static'),
|
os.path.join(BASE_DIR, 'note_kfet/static'),
|
||||||
|
'/usr/share/javascript',
|
||||||
]
|
]
|
||||||
|
|
||||||
# Collect statics to /static/
|
# Collect statics to /static/
|
||||||
|
|
|
@ -24,24 +24,14 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
<meta name="theme-color" content="#ffffff">
|
<meta name="theme-color" content="#ffffff">
|
||||||
|
|
||||||
{# Bootstrap, Font Awesome and custom CSS #}
|
{# Bootstrap, Font Awesome and custom CSS #}
|
||||||
<link rel="stylesheet"
|
<link rel="stylesheet" href="{% static "bootstrap4/css/bootstrap.min.css" %}">
|
||||||
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
|
<link rel="stylesheet" href="{% static "font-awesome/css/font-awesome.min.css" %}">
|
||||||
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
|
|
||||||
crossorigin="anonymous">
|
|
||||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.13.0/css/all.css">
|
|
||||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.13.0/css/v4-shims.css">
|
|
||||||
<link rel="stylesheet" href="{% static "css/custom.css" %}">
|
<link rel="stylesheet" href="{% static "css/custom.css" %}">
|
||||||
|
|
||||||
{# JQuery, Bootstrap and Turbolinks JavaScript #}
|
{# JQuery, Bootstrap and Turbolinks JavaScript #}
|
||||||
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
|
<script src="{% static "jquery/jquery.min.js" %}"></script>
|
||||||
integrity="sha384-vk5WoKIaW/vJyUAd9n/wmopsmNhiy+L2Z+SBxGYnUkunIxVxAv/UtMOhba/xskxh"
|
<script src="{% static "popper.js/umd/popper.min.js" %}"></script>
|
||||||
crossorigin="anonymous"></script>
|
<script src="{% static "bootstrap4/js/bootstrap.min.js" %}"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
|
|
||||||
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
|
|
||||||
crossorigin="anonymous"></script>
|
|
||||||
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"
|
|
||||||
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
|
|
||||||
crossorigin="anonymous"></script>
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.2.0/turbolinks.js"
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.2.0/turbolinks.js"
|
||||||
crossorigin="anonymous"></script>
|
crossorigin="anonymous"></script>
|
||||||
<script src="{% static "js/base.js" %}"></script>
|
<script src="{% static "js/base.js" %}"></script>
|
||||||
|
@ -69,54 +59,54 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
{% if "note.transactiontemplate"|not_empty_model_list %}
|
{% if "note.transactiontemplate"|not_empty_model_list %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
{% url 'note:consos' as url %}
|
{% url 'note:consos' as url %}
|
||||||
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fas fa-coffee"></i> {% trans 'Consumptions' %}</a>
|
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fa fa-coffee"></i> {% trans 'Consumptions' %}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if "note.transaction"|not_empty_model_list %}
|
{% if "note.transaction"|not_empty_model_list %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
{% url 'note:transfer' as url %}
|
{% url 'note:transfer' as url %}
|
||||||
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fas fa-exchange-alt"></i> {% trans 'Transfer' %} </a>
|
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fa fa-exchange"></i> {% trans 'Transfer' %} </a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if "auth.user"|model_list_length >= 2 %}
|
{% if "auth.user"|model_list_length >= 2 %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
{% url 'member:user_list' as url %}
|
{% url 'member:user_list' as url %}
|
||||||
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fas fa-user"></i> {% trans 'Users' %}</a>
|
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fa fa-user"></i> {% trans 'Users' %}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if "member.club"|not_empty_model_list %}
|
{% if "member.club"|not_empty_model_list %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
{% url 'member:club_list' as url %}
|
{% url 'member:club_list' as url %}
|
||||||
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fas fa-users"></i> {% trans 'Clubs' %}</a>
|
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fa fa-users"></i> {% trans 'Clubs' %}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if "activity.activity"|not_empty_model_list %}
|
{% if "activity.activity"|not_empty_model_list %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
{% url 'activity:activity_list' as url %}
|
{% url 'activity:activity_list' as url %}
|
||||||
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fas fa-calendar"></i> {% trans 'Activities' %}</a>
|
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fa fa-calendar"></i> {% trans 'Activities' %}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if "treasury.invoice"|not_empty_model_list %}
|
{% if "treasury.invoice"|not_empty_model_list %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
{% url 'treasury:invoice_list' as url %}
|
{% url 'treasury:invoice_list' as url %}
|
||||||
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fas fa-credit-card"></i> {% trans 'Treasury' %}</a>
|
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fa fa-credit-card"></i> {% trans 'Treasury' %}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if "wei.weiclub"|not_empty_model_list %}
|
{% if "wei.weiclub"|not_empty_model_list %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
{% url 'wei:current_wei_detail' as url %}
|
{% url 'wei:current_wei_detail' as url %}
|
||||||
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fas fa-bus"></i> {% trans 'WEI' %}</a>
|
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fa fa-bus"></i> {% trans 'WEI' %}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if request.user.is_authenticated %}
|
{% if request.user.is_authenticated %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
{% url 'permission:rights' as url %}
|
{% url 'permission:rights' as url %}
|
||||||
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fas fa-balance-scale"></i> {% trans 'Rights' %}</a>
|
<a class="nav-link {% if request.path_info == url %}active{% endif %}" href="{{ url }}"><i class="fa fa-balance-scale"></i> {% trans 'Rights' %}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if request.user.is_staff and ""|has_perm:user %}
|
{% if request.user.is_staff and ""|has_perm:user %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a data-turbolinks="false" class="nav-link" href="{% url 'admin:index' %}"><i class="fas fa-user-cog"></i> {% trans 'Admin' %}</a>
|
<a data-turbolinks="false" class="nav-link" href="{% url 'admin:index' %}"><i class="fa fa-cogs"></i> {% trans 'Admin' %}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -124,16 +114,16 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
{% if request.user.is_authenticated %}
|
{% if request.user.is_authenticated %}
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<i class="fas fa-user"></i>
|
<i class="fa fa-user"></i>
|
||||||
<span id="user_balance">{{ request.user.username }} ({{ request.user.note.balance | pretty_money }})</span>
|
<span id="user_balance">{{ request.user.username }} ({{ request.user.note.balance | pretty_money }})</span>
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-menu dropdown-menu-right"
|
<div class="dropdown-menu dropdown-menu-right"
|
||||||
aria-labelledby="navbarDropdownMenuLink">
|
aria-labelledby="navbarDropdownMenuLink">
|
||||||
<a class="dropdown-item" href="{% url 'member:user_detail' pk=request.user.pk %}">
|
<a class="dropdown-item" href="{% url 'member:user_detail' pk=request.user.pk %}">
|
||||||
<i class="fas fa-user"></i> Mon compte
|
<i class="fa fa-user"></i> Mon compte
|
||||||
</a>
|
</a>
|
||||||
<a class="dropdown-item" href="{% url 'logout' %}">
|
<a class="dropdown-item" href="{% url 'logout' %}">
|
||||||
<i class="fas fa-sign-out-alt"></i> Se déconnecter
|
<i class="fa fa-sign-out"></i> Se déconnecter
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
@ -141,14 +131,14 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
{% if request.path != "/registration/signup/" %}
|
{% if request.path != "/registration/signup/" %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'registration:signup' %}">
|
<a class="nav-link" href="{% url 'registration:signup' %}">
|
||||||
<i class="fas fa-user-plus"></i> S'inscrire
|
<i class="fa fa-user-plus"></i> S'inscrire
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if request.path != "/accounts/login/" %}
|
{% if request.path != "/accounts/login/" %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'login' %}">
|
<a class="nav-link" href="{% url 'login' %}">
|
||||||
<i class="fas fa-sign-in-alt"></i> Se connecter
|
<i class="fa fa-sign-in"></i> Se connecter
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
django-htcpcp-tea==0.3.1
|
||||||
|
django-mailer==2.0.1
|
||||||
|
django-phonenumber-field==4.0.0
|
||||||
|
django-tables2==2.1.0
|
||||||
|
django-rest-polymorphic==0.1.8
|
||||||
|
django-bootstrap-datepicker-plus==3.0.5
|
||||||
|
django-colorfield==0.3.2
|
|
@ -1,31 +0,0 @@
|
||||||
beautifulsoup4==4.9.1
|
|
||||||
certifi==2019.6.16
|
|
||||||
chardet==3.0.4
|
|
||||||
defusedxml==0.6.0
|
|
||||||
Django~=2.2
|
|
||||||
django-allauth==0.39.1
|
|
||||||
django-crispy-forms==1.7.2
|
|
||||||
django-extensions==2.1.9
|
|
||||||
django-filter==2.2.0
|
|
||||||
django-htcpcp-tea==0.3.1
|
|
||||||
django-mailer==2.0.1
|
|
||||||
django-phonenumber-field==4.0.0
|
|
||||||
django-polymorphic==2.0.3
|
|
||||||
django-tables2==2.1.0
|
|
||||||
docutils==0.14
|
|
||||||
idna==2.8
|
|
||||||
lxml==4.5.2
|
|
||||||
oauthlib==3.1.0
|
|
||||||
phonenumbers==8.12.7
|
|
||||||
Pillow==7.1.2
|
|
||||||
python3-openid==3.1.0
|
|
||||||
pytz==2019.1
|
|
||||||
requests==2.22.0
|
|
||||||
requests-oauthlib==1.2.0
|
|
||||||
six==1.12.0
|
|
||||||
sqlparse==0.3.0
|
|
||||||
djangorestframework==3.9.0
|
|
||||||
django-rest-polymorphic==0.1.8
|
|
||||||
urllib3==1.25.3
|
|
||||||
django-bootstrap-datepicker-plus==3.0.5
|
|
||||||
django-colorfield==0.3.2
|
|
|
@ -1 +0,0 @@
|
||||||
django-cas-server==1.2.0
|
|
|
@ -1 +0,0 @@
|
||||||
psycopg2-binary==2.8.4
|
|
9
tox.ini
9
tox.ini
|
@ -10,12 +10,11 @@ envlist =
|
||||||
skipsdist = True
|
skipsdist = True
|
||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
|
sitepackages = True
|
||||||
setenv =
|
setenv =
|
||||||
PYTHONWARNINGS = all
|
PYTHONWARNINGS = all
|
||||||
deps =
|
deps =
|
||||||
-r{toxinidir}/requirements/base.txt
|
-r{toxinidir}/requirements.txt
|
||||||
-r{toxinidir}/requirements/cas.txt
|
|
||||||
-r{toxinidir}/requirements/production.txt
|
|
||||||
coverage
|
coverage
|
||||||
commands =
|
commands =
|
||||||
./manage.py makemigrations
|
./manage.py makemigrations
|
||||||
|
@ -24,9 +23,7 @@ commands =
|
||||||
|
|
||||||
[testenv:linters]
|
[testenv:linters]
|
||||||
deps =
|
deps =
|
||||||
-r{toxinidir}/requirements/base.txt
|
-r{toxinidir}/requirements.txt
|
||||||
-r{toxinidir}/requirements/cas.txt
|
|
||||||
-r{toxinidir}/requirements/production.txt
|
|
||||||
flake8
|
flake8
|
||||||
flake8-colors
|
flake8-colors
|
||||||
flake8-import-order
|
flake8-import-order
|
||||||
|
|
26
uwsgi_params
26
uwsgi_params
|
@ -1,26 +0,0 @@
|
||||||
|
|
||||||
uwsgi_param QUERY_STRING $query_string;
|
|
||||||
uwsgi_param REQUEST_METHOD $request_method;
|
|
||||||
uwsgi_param CONTENT_TYPE $content_type;
|
|
||||||
uwsgi_param CONTENT_LENGTH $content_length;
|
|
||||||
|
|
||||||
uwsgi_param REQUEST_URI $request_uri;
|
|
||||||
uwsgi_param PATH_INFO $document_uri;
|
|
||||||
uwsgi_param DOCUMENT_ROOT $document_root;
|
|
||||||
uwsgi_param SERVER_PROTOCOL $server_protocol;
|
|
||||||
uwsgi_param REQUEST_SCHEME $scheme;
|
|
||||||
uwsgi_param HTTPS $https if_not_empty;
|
|
||||||
|
|
||||||
uwsgi_param REMOTE_ADDR $remote_addr;
|
|
||||||
uwsgi_param REMOTE_PORT $remote_port;
|
|
||||||
uwsgi_param SERVER_PORT $server_port;
|
|
||||||
uwsgi_param SERVER_NAME $server_name;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue