initialisation depuis le modèle cookiecutter
révision
674cca92c5
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"presets": [ "@babel/preset-env" ]
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
# Browsers that we support
|
||||
# see: https://github.com/browserslist/browserslist#readme
|
||||
|
||||
>= 1%
|
||||
last 1 major version
|
||||
not dead
|
||||
Chrome >= 45
|
||||
Firefox >= 38
|
||||
Edge >= 12
|
||||
Explorer >= 10
|
||||
iOS >= 9
|
||||
Safari >= 9
|
||||
Android >= 4.4
|
||||
Opera >= 30
|
|
@ -0,0 +1,29 @@
|
|||
# http://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.{py,rst,ini}]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.py]
|
||||
line_length = 80
|
||||
known_first_party = danse
|
||||
multi_line_output = 3
|
||||
default_section = THIRDPARTY
|
||||
|
||||
[*.{html,css,scss,js,json,yml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
|
@ -0,0 +1,34 @@
|
|||
{
|
||||
"root": true,
|
||||
"parser": "babel-eslint",
|
||||
"extends": [
|
||||
"plugin:import/errors",
|
||||
"plugin:import/warnings",
|
||||
"xo/esnext",
|
||||
"xo/browser"
|
||||
],
|
||||
"rules": {
|
||||
"capitalized-comments": "off",
|
||||
"indent": [
|
||||
"error",
|
||||
2,
|
||||
{
|
||||
"SwitchCase": 1
|
||||
}
|
||||
],
|
||||
"max-params": [
|
||||
"warn",
|
||||
5
|
||||
],
|
||||
"multiline-ternary": [
|
||||
"error",
|
||||
"always-multiline"
|
||||
],
|
||||
"new-cap": "off",
|
||||
"object-curly-spacing": [
|
||||
"error",
|
||||
"always"
|
||||
],
|
||||
"prefer-destructuring": "off"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
danse/static/** -diff
|
||||
assets/img/** -diff
|
||||
assets/fonts/** -diff
|
|
@ -0,0 +1,44 @@
|
|||
# Editors
|
||||
*~
|
||||
*.sw[po]
|
||||
|
||||
# Python
|
||||
*.py[cod]
|
||||
__pycache__
|
||||
|
||||
# Virtual environment
|
||||
.env
|
||||
venv
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
pip-log.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
.coverage
|
||||
.tox
|
||||
nosetests.xml
|
||||
htmlcov
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Builds
|
||||
danse/static/
|
||||
docs/build/
|
||||
styleguide/index.html
|
||||
|
||||
# NPM
|
||||
node_modules/
|
||||
|
||||
# Databases
|
||||
sqlite.db
|
||||
|
||||
# Local configuration
|
||||
config.env
|
||||
|
||||
# Local overrides and variable content
|
||||
local/
|
||||
var/
|
|
@ -0,0 +1,26 @@
|
|||
<type>(<portée>): <sujet>
|
||||
|
||||
<description>
|
||||
|
||||
<footer>
|
||||
|
||||
# Type définit le type de commit
|
||||
# - build: Système de build
|
||||
# - ci: Intégration continue
|
||||
# - doc: Documentation
|
||||
# - feat: Ajout d'une fonctionnalité
|
||||
# - fix: Correction de bogue
|
||||
# - perf: Amélioration des performances
|
||||
# - ref: Changement du code qui ne change rien au fonctionnement
|
||||
# - style: Changement du style du code (sans changer la logique)
|
||||
# - test: Modification des tests
|
||||
# Portée définit quelle partie de votre librairie / application est affectée par
|
||||
# le commit (cette information est optionnelle)
|
||||
# Sujet contient une description succinte des changements
|
||||
# - En utilisant l'impératif présent
|
||||
# - Sans majuscule au début
|
||||
# - Pas de "." à la fin de la description
|
||||
# Description permet de détailler plus en profondeur les motivations derrière le
|
||||
# changement. Les règles sont les mêmes que pour la partie Sujet.
|
||||
# Footer contient les changements importants (Breaking Changes) et les
|
||||
# références à des issues.
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"extends": [
|
||||
"stylelint-config-twbs-bootstrap/scss"
|
||||
],
|
||||
"rules": {
|
||||
"value-list-comma-newline-after": "always-multi-line",
|
||||
"value-list-comma-newline-before": "never-multi-line",
|
||||
"value-list-comma-space-after": "always-single-line",
|
||||
"scss/at-function-named-arguments": null,
|
||||
"scss/dollar-variable-default": null
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
# Changelog
|
||||
All notable changes to Danse ! will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [Unreleased]
|
||||
### Added
|
|
@ -0,0 +1 @@
|
|||
This software is developped by Cliss XXI.
|
Fichier diff supprimé car celui-ci est trop grand
Voir la Diff
|
@ -0,0 +1,162 @@
|
|||
# -*- mode: makefile-gmake -*-
|
||||
## Définition des variables
|
||||
# Le nom de l'exécutable Python à utiliser ou son chemin absolu
|
||||
# (ex. : python ou python3).
|
||||
PYTHON_EXE := python3
|
||||
# S'il faut utiliser un environnement virtuel (y ou n).
|
||||
USE_VENV := y
|
||||
# Configuration de l'environnement virtuel.
|
||||
VENV_DIR := venv
|
||||
VENV_OPT := --system-site-packages
|
||||
|
||||
# Définis les chemins et options des exécutables.
|
||||
PYTHON_EXE_BASENAME := $(shell basename $(PYTHON_EXE))
|
||||
VENV_PYTHON := --python=$(PYTHON_EXE_BASENAME)
|
||||
ifeq ($(USE_VENV), y)
|
||||
PYTHON := $(VENV_DIR)/bin/$(PYTHON_EXE_BASENAME)
|
||||
PIP := $(VENV_DIR)/bin/pip
|
||||
else
|
||||
PYTHON := $(shell which $(PYTHON_EXE))
|
||||
PIP := $(shell which pip)
|
||||
endif
|
||||
|
||||
# Détermine si black est présent.
|
||||
USE_BLACK := $(shell $(PYTHON) -c 'import black; print("1")' 2>/dev/null)
|
||||
|
||||
# Détermine s'il faut charger le fichier de configuration.
|
||||
ifneq ($(READ_CONFIG_FILE), 0)
|
||||
READ_CONFIG_FILE := 1
|
||||
else
|
||||
READ_CONFIG_FILE := 0
|
||||
endif
|
||||
|
||||
# Détermine l'environnement à utiliser.
|
||||
DEFAULT_ENV := production
|
||||
ifndef ENV
|
||||
ifeq ($(READ_CONFIG_FILE), 1)
|
||||
# Commence par chercher la dernière valeur de DJANGO_SETTINGS_MODULE,
|
||||
# puis de ENV s'il n'y en a pas, ou utilise l'environnement par défaut.
|
||||
ENV = $(shell \
|
||||
sed -n -e '/^DJANGO_SETTINGS_MODULE/s/[^.]*\.settings\.\([^.]*\)/\1/p' \
|
||||
-e '/^ENV/s/[^=]*=\(.*\)/\1/p' config.env 2> /dev/null \
|
||||
| tail -n 1 | grep -Ee '^..*' || echo "$(DEFAULT_ENV)")
|
||||
else
|
||||
ifdef DJANGO_SETTINGS_MODULE
|
||||
ENV = $(shell echo $(DJANGO_SETTINGS_MODULE) | cut -d. -f3)
|
||||
else
|
||||
ENV := $(DEFAULT_ENV)
|
||||
endif # ifdef DJANGO_SETTINGS_MODULE
|
||||
endif # ifeq READ_CONFIG_FILE
|
||||
endif # ifndef ENV
|
||||
|
||||
# Définis EDITOR pour l'édition interactive.
|
||||
ifndef EDITOR
|
||||
ifdef VISUAL
|
||||
EDITOR := $(VISUAL)
|
||||
else
|
||||
EDITOR := vi
|
||||
endif
|
||||
endif
|
||||
|
||||
# Définition des cibles -------------------------------------------------------
|
||||
|
||||
.PHONY: clean-pyc clean-build clean-static clear-venv help check check-config
|
||||
.DEFAULT_GOAL := help
|
||||
|
||||
# Commentaire d'une cible : #-> interne ##-> aide production+dev ###-> aide dev
|
||||
help: ## affiche cette aide
|
||||
ifeq ($(ENV), production)
|
||||
@perl -nle'print $& if m{^[a-zA-Z_-]+:[^#]*?## .*$$}' $(MAKEFILE_LIST) \
|
||||
| sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
|
||||
else
|
||||
@perl -nle'print $& if m{^[a-zA-Z_-]+:[^#]*?###? .*$$}' $(MAKEFILE_LIST) \
|
||||
| sort | awk 'BEGIN {FS = ":.*?###? "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
|
||||
endif
|
||||
|
||||
clean: clean-build clean-pyc clean-static ## nettoie tous les fichiers temporaires
|
||||
|
||||
clean-build: ### nettoie les fichiers de construction du paquet
|
||||
rm -rf build/
|
||||
rm -rf dist/
|
||||
rm -rf *.egg-info
|
||||
|
||||
clean-pyc: ### nettoie les fichiers temporaires python
|
||||
find danse/ \
|
||||
\( -name '*.pyc' -o -name '*.pyo' -o -name '*~' \) -exec rm -f {} +
|
||||
|
||||
clean-static: ### nettoie les fichiers "static" collectés
|
||||
rm -rf var/static
|
||||
|
||||
init: create-venv config.env update ## initialise l'environnement et l'application
|
||||
|
||||
config.env:
|
||||
ifeq ($(READ_CONFIG_FILE), 1)
|
||||
cp config.env.example config.env
|
||||
chmod go-rwx config.env
|
||||
$(EDITOR) config.env
|
||||
endif
|
||||
|
||||
update: check-config install-deps migrate static ## mets à jour l'application et ses dépendances
|
||||
touch danse/wsgi.py
|
||||
|
||||
check: check-config ## vérifie la configuration de l'instance
|
||||
$(PYTHON) manage.py check
|
||||
|
||||
check-config:
|
||||
@find . -maxdepth 1 -name config.env -perm /o+rwx -exec false {} + || \
|
||||
{ echo "\033[31mErreur :\033[0m les permissions de config.env ne sont pas bonnes, \
|
||||
vous devriez au moins faire : chmod o-rwx config.env"; false; }
|
||||
|
||||
install-deps: ## installe les dépendances de l'application
|
||||
$(PIP) install --upgrade --requirement requirements/$(ENV).txt
|
||||
|
||||
migrate: ## mets à jour le schéma de la base de données
|
||||
$(PYTHON) manage.py migrate
|
||||
|
||||
static: ## collecte les fichiers statiques
|
||||
ifeq ($(ENV), production)
|
||||
@echo "Collecte des fichiers statiques..."
|
||||
$(PYTHON) manage.py collectstatic --no-input --verbosity 0
|
||||
endif
|
||||
|
||||
## Cibles liées à l'environnement virtuel
|
||||
|
||||
create-venv: $(PYTHON)
|
||||
|
||||
$(PYTHON):
|
||||
ifeq ($(USE_VENV), y)
|
||||
virtualenv $(VENV_OPT) $(VENV_PYTHON) $(VENV_DIR)
|
||||
else
|
||||
@echo "\033[31mErreur !\033[0m Impossible de trouver l'exécutable Python $(PYTHON)"
|
||||
@exit 1
|
||||
endif
|
||||
|
||||
clear-venv: ## supprime l'environnement virtuel
|
||||
-rm -rf $(VENV_DIR)
|
||||
|
||||
## Cibles pour le développement
|
||||
|
||||
serve: ### démarre un serveur local pour l'application
|
||||
$(PYTHON) manage.py runserver
|
||||
|
||||
test: ### lance les tests de l'application
|
||||
$(PYTHON) -m pytest --cov --cov-report=term:skip-covered
|
||||
|
||||
cov: test ### vérifie la couverture de code
|
||||
$(PYTHON) -m coverage html
|
||||
@echo open htmlcov/index.html
|
||||
|
||||
lint: ### vérifie la syntaxe et le code python
|
||||
@$(PYTHON) -m flake8 danse \
|
||||
|| echo "\033[31m[flake8]\033[0m Veuillez corriger les erreurs ci-dessus."
|
||||
@$(PYTHON) -m isort --check --recursive danse \
|
||||
|| echo "\033[31m[isort]\033[0m Veuillez corriger l'ordre des imports avec : make fix-lint"
|
||||
ifdef USE_BLACK
|
||||
@$(PYTHON) -m black --check danse
|
||||
endif
|
||||
|
||||
fix-lint: ### corrige la syntaxe et ordonne les imports python
|
||||
$(PYTHON) -m isort --recursive danse
|
||||
ifdef USE_BLACK
|
||||
$(PYTHON) -m black danse
|
||||
endif
|
|
@ -0,0 +1,258 @@
|
|||
# Danse !
|
||||
|
||||
La carte d'un incroyable territoire chorégraphique
|
||||
|
||||
**Table of content**
|
||||
|
||||
- [Give a try](#give-a-try)
|
||||
- [Installation](#installation)
|
||||
- [Deployment](#deployment)
|
||||
- [Structure](#structure)
|
||||
- [Development](#development)
|
||||
|
||||
## Give a try
|
||||
|
||||
On a Debian-based host - running at least Debian Stretch:
|
||||
|
||||
```
|
||||
$ sudo apt install python3 virtualenv git make
|
||||
$ git clone https://forge.cliss21.org/cliss21/danse
|
||||
$ cd danse/
|
||||
$ make init
|
||||
|
||||
A configuration will be created interactively; uncomment
|
||||
ENV=development
|
||||
|
||||
$ make test # optional
|
||||
$ make serve
|
||||
```
|
||||
|
||||
Then visit [http://127.0.0.1:8000/](http://127.0.0.1:8000/) in your web browser.
|
||||
|
||||
## Installation
|
||||
### Requirements
|
||||
|
||||
On a Debian-based host - running at least Debian Stretch, you will need the
|
||||
following packages:
|
||||
- python3
|
||||
- virtualenv
|
||||
- make
|
||||
- git (recommended for getting the source)
|
||||
- python3-mysqldb (optional, in case of a MySQL / MariaDB database)
|
||||
- python3-psycopg2 (optional, in case of a PostgreSQL database)
|
||||
|
||||
### Quick start
|
||||
|
||||
It assumes that you already have the application source code locally - the best
|
||||
way is by cloning this repository - and that you are in this folder.
|
||||
|
||||
1. Define your local configuration in a file named `config.env`, which can be
|
||||
copied from `config.env.example` and edited to suits your needs.
|
||||
|
||||
Depending on your environment, you will have to create your database and the
|
||||
user at first.
|
||||
|
||||
2. Run `make init`.
|
||||
|
||||
Note that if there is no `config.env` file, it will be created interactively.
|
||||
|
||||
That's it! Your environment is now initialized with the application installed.
|
||||
To update it, once the source code is checked out, simply run `make update`.
|
||||
|
||||
You can also check that your application is well configured by running
|
||||
`make check`.
|
||||
|
||||
### Manual installation
|
||||
|
||||
If you don't want to use the `Makefile` facilities, here is what is done behind the scene.
|
||||
|
||||
It assumes that you have downloaded the last release of Danse !,
|
||||
extracted it and that you moved to that folder.
|
||||
|
||||
1. Start by creating a new virtual environment under `./venv` and activate it:
|
||||
|
||||
$ virtualenv --system-site-packages ./venv
|
||||
$ source ./venv/bin/activate
|
||||
|
||||
2. Install the required Python packages depending on your environment:
|
||||
|
||||
$ pip install -r requirements/production.txt
|
||||
... or ...
|
||||
$ pip install -r requirements/development.txt
|
||||
|
||||
3. Configure the application by setting the proper environment variables
|
||||
depending on your environment. You can use the `config.env.example` which
|
||||
give you the main variables with example values.
|
||||
|
||||
$ cp config.env.example config.env
|
||||
$ nano config.env
|
||||
$ chmod go-rwx config.env
|
||||
|
||||
Note that this `./config.env` file will be loaded by default when the
|
||||
application starts. If you don't want that, just move this file away or set
|
||||
the `READ_CONFIG_FILE` environment variable to `0`.
|
||||
|
||||
4. Create the database tables - it assumes that you have created the database
|
||||
and set the proper configuration to use it:
|
||||
|
||||
$ ./manage.py migrate
|
||||
|
||||
That's it! You should now be able to start the Django development server to
|
||||
check that everything is working fine with:
|
||||
|
||||
$ ./manage.py runserver
|
||||
|
||||
## Deployment
|
||||
|
||||
Here is an example deployment using NGINX - as the Web server - and uWSGI - as
|
||||
the application server.
|
||||
|
||||
The uWSGI configuration doesn't require a special configuration, except that we
|
||||
are using Python 3 and a virtual environment. Note that if you serve the
|
||||
application on a sub-location, you will have to add `route-run = fixpathinfo:`
|
||||
to your uWSGI configuration (from
|
||||
[v2.0.11](https://uwsgi-docs.readthedocs.io/en/latest/Changelog-2.0.11.html#fixpathinfo-routing-action)).
|
||||
|
||||
In the `server` block of your NGINX configuration, add the following blocks and
|
||||
set the path to your application instance and to the uWSGI socket:
|
||||
|
||||
```
|
||||
location / {
|
||||
include uwsgi_params;
|
||||
uwsgi_pass unix:<uwsgi_socket_path>;
|
||||
}
|
||||
location /media {
|
||||
alias <app_instance_path>/var/media;
|
||||
}
|
||||
location /static {
|
||||
alias <app_instance_path>/var/static;
|
||||
# Optional: don't log access to assets
|
||||
access_log off;
|
||||
}
|
||||
location = /favicon.ico {
|
||||
alias <app_instance_path>/var/static/favicon/favicon.ico;
|
||||
# Optional: don't log access to the favicon
|
||||
access_log off;
|
||||
}
|
||||
```
|
||||
|
||||
## Structure
|
||||
### Overview
|
||||
|
||||
All the application files - e.g. Django code including settings, templates and
|
||||
statics - are located into `danse/`.
|
||||
|
||||
Two environments are defined - either for requirements and settings:
|
||||
- `development`: for local application development and testing. It uses a
|
||||
SQLite3 database and enable debugging by default, add some useful settings
|
||||
and applications for development purpose - i.e. the `django-debug-toolbar`.
|
||||
- `production`: for production. It checks that configuration is set and
|
||||
correct, try to optimize performances and enforce some settings - i.e. HTTPS
|
||||
related ones.
|
||||
|
||||
### Local changes
|
||||
|
||||
You can override and extend statics and templates locally. This can be useful
|
||||
if you have to change the logo for a specific instance for example. For that,
|
||||
just put your files under the `local/static/` and `local/templates/` folders.
|
||||
|
||||
Regarding the statics, do not forget to collect them after that. Note also that
|
||||
the `local/` folder is ignored by *git*.
|
||||
|
||||
### Variable content
|
||||
|
||||
All the variable content - e.g. user-uploaded media, collected statics - are
|
||||
stored inside the `var/` folder. It is also ignored by *git* as it's specific
|
||||
to each application installation.
|
||||
|
||||
So, you will have to configure your Web server to serve the `var/media/` and
|
||||
`var/static/` folders, which should point to `/media/` and `/static/`,
|
||||
respectively.
|
||||
|
||||
## Development
|
||||
|
||||
The easiest way to deploy a development environment is by using the `Makefile`.
|
||||
|
||||
Before running `make init`, ensure that you have either set `ENV=development`
|
||||
in the `config.env` file or have this environment variable. Note that you can
|
||||
still change this variable later and run `make init` again.
|
||||
|
||||
There is some additional rules when developing, which are mainly wrappers for
|
||||
`manage.py`. You can list all of them by running `make help`. Here are the main ones:
|
||||
- `make serve`: run a development server
|
||||
- `make test`: test the whole application
|
||||
- `make lint`: check the Python code syntax
|
||||
|
||||
### Assets
|
||||
|
||||
The assets - e.g. CSS, JavaScript, images, fonts - are generated using a
|
||||
[Gulp](https://gulpjs.com/)-powered build system with these features:
|
||||
- SCSS compilation and prefixing
|
||||
- JavaScript module bundling with webpack
|
||||
- Styleguide and components preview
|
||||
- Built-in BrowserSync server
|
||||
- Compression for production builds
|
||||
|
||||
The source files live in `assets/`, and the styleguide in `styleguide/`.
|
||||
|
||||
#### Requirements
|
||||
|
||||
You will need to have [npm](https://www.npmjs.com/) installed on your system.
|
||||
If you are running Debian, do not rely on the npm package which is either
|
||||
outdated or removed - starting from Debian Stretch. Instead, here is a way
|
||||
to install the last version as a regular user:
|
||||
|
||||
1. Ensure that you have the following Debian packages installed, from at least
|
||||
`stretch-backports`:
|
||||
- nodejs
|
||||
- node-rimraf
|
||||
|
||||
2. Set the npm's installation prefix as an environment variable:
|
||||
|
||||
$ export npm_config_prefix=~/.node_modules
|
||||
|
||||
3. Retrieve and execute the last npm's installation script:
|
||||
|
||||
$ curl -L https://www.npmjs.com/install.sh | sh
|
||||
|
||||
4. Add the npm's binary folder to your environment variables:
|
||||
|
||||
$ export PATH="${HOME}/.node_modules/bin:${PATH}"
|
||||
|
||||
In order to keep those environment variables the next time you will log in,
|
||||
you can append the following lines to the end of your `~/.profile` file:
|
||||
|
||||
```bash
|
||||
if [ -d "${HOME}/.node_modules/bin" ] ; then
|
||||
PATH="${HOME}/.node_modules/bin:${PATH}"
|
||||
export npm_config_prefix=~/.node_modules
|
||||
fi
|
||||
```
|
||||
|
||||
5. That's it! You can check that npm is now installed by running the following:
|
||||
|
||||
$ npm --version
|
||||
|
||||
#### Usage
|
||||
|
||||
Start by installing the application dependencies - which are defined in
|
||||
`package.json` - by running: `npm install`.
|
||||
|
||||
The following tasks are then available:
|
||||
- `npm run build`: build all the assets for development and production use,
|
||||
and put them in the static folder - e.g `danse/static`.
|
||||
- `npm run styleguide`: run a server with the styleguide and watch for file
|
||||
changes.
|
||||
- `npm run serve`: run a proxy server to the app - which must already be served on
|
||||
`localhost:8000` - with the styleguide on `/styleguide` and watch for file
|
||||
changes.
|
||||
- `npm run lint`: lint the JavaScript and the SCSS code.
|
||||
|
||||
In production, only the static files will be used. It is recommended to commit
|
||||
the compiled assets just before a new release only. This will prevent to have a
|
||||
growing repository due to the minified files.
|
||||
|
||||
## License
|
||||
|
||||
Danse ! is developed by Cliss XXI and licensed under the
|
||||
[AGPLv3+](LICENSE).
|
|
@ -0,0 +1,27 @@
|
|||
import './vendor/bootstrap';
|
||||
|
||||
import EventHandler from 'bootstrap/js/src/dom/event-handler';
|
||||
|
||||
/**
|
||||
* ------------------------------------------------------------------------
|
||||
* Constantes
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
const EVENT_KEY = '.app';
|
||||
|
||||
const Event = {
|
||||
LOAD: `load${EVENT_KEY}`
|
||||
};
|
||||
|
||||
/**
|
||||
* ------------------------------------------------------------------------
|
||||
* Application principale
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
// Supprime la classe .no-js une fois la page chargée
|
||||
EventHandler.on(window, Event.LOAD, () => {
|
||||
document.documentElement.classList
|
||||
.remove('no-js');
|
||||
});
|
|
@ -0,0 +1,22 @@
|
|||
// -----------------------------------------------------------------------------
|
||||
// Bootstrap
|
||||
// -----------------------------------------------------------------------------
|
||||
// see: ../../node_modules/bootstrap/js/index.umd.js
|
||||
|
||||
// Import all Bootstrap components
|
||||
|
||||
import 'bootstrap';
|
||||
|
||||
// ... or import them individually
|
||||
|
||||
// import 'bootstrap/js/src/alert';
|
||||
// import 'bootstrap/js/src/button';
|
||||
// import 'bootstrap/js/src/carousel';
|
||||
// import 'bootstrap/js/src/collapse';
|
||||
// import 'bootstrap/js/src/dropdown';
|
||||
// import 'bootstrap/js/src/modal';
|
||||
// import 'bootstrap/js/src/popover';
|
||||
// import 'bootstrap/js/src/scrollspy';
|
||||
// import 'bootstrap/js/src/tab';
|
||||
// import 'bootstrap/js/src/toast';
|
||||
// import 'bootstrap/js/src/tooltip';
|
|
@ -0,0 +1,24 @@
|
|||
// -----------------------------------------------------------------------------
|
||||
// Bootstrap's configuration for the application
|
||||
// -----------------------------------------------------------------------------
|
||||
// see: ../../node_modules/bootstrap/scss/_variables.scss
|
||||
|
||||
// Color system
|
||||
|
||||
// You can generate a color scheme with:
|
||||
// https://palx.jxnblk.com/
|
||||
$blue: #007bff;
|
||||
$indigo: #6610f2;
|
||||
$purple: #6f42c1;
|
||||
$pink: #e83e8c;
|
||||
$red: #dc3545;
|
||||
$orange: #fd7e14;
|
||||
$yellow: #ffc107;
|
||||
$green: #28a745;
|
||||
$teal: #20c997;
|
||||
$cyan: #17a2b8;
|
||||
|
||||
// Add 'error' as an alternative to 'danger' since it is used by Django.
|
||||
$theme-colors: (
|
||||
"error": $red
|
||||
);
|
|
@ -0,0 +1,8 @@
|
|||
// -----------------------------------------------------------------------------
|
||||
// Application-wide variables
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
/// Path to fonts and images folders, relative to css/app.css.
|
||||
/// @type String
|
||||
$font-path: "../fonts";
|
||||
$img-path: "../img";
|
|
@ -0,0 +1,22 @@
|
|||
@charset "utf-8";
|
||||
|
||||
// Variables et utilitaires
|
||||
@import "abstracts/variables";
|
||||
@import "abstracts/variables-bootstrap";
|
||||
|
||||
// Librairies
|
||||
@import "vendor/bootstrap";
|
||||
|
||||
// Styles de base
|
||||
@import "base/fonts";
|
||||
@import "base/typography";
|
||||
|
||||
// Agencement des sections
|
||||
// @import "layout/header";
|
||||
// @import "layout/footer";
|
||||
|
||||
// Composants
|
||||
@import "components/forms";
|
||||
|
||||
// Pages spécifiques
|
||||
// @import "pages/home";
|
|
@ -0,0 +1,3 @@
|
|||
// -----------------------------------------------------------------------------
|
||||
// Définition des polices utilisées
|
||||
// -----------------------------------------------------------------------------
|
|
@ -0,0 +1,8 @@
|
|||
// -----------------------------------------------------------------------------
|
||||
// Étends la typographie de base
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
legend {
|
||||
// FIXME: Corrige temporairement twbs/bootstrap#29712
|
||||
display: contents;
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
// -----------------------------------------------------------------------------
|
||||
// Étends la mise en forme des formulaires
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// Définis le curseur des champs et labels désactivés.
|
||||
.form-control:disabled,
|
||||
.form-check-input:disabled ~ .form-check-label {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
// Définis le curseur des champs checkbox et radio.
|
||||
.form-check-input,
|
||||
.form-check-label {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
// Étends les classes de base.
|
||||
|
||||
.form-text {
|
||||
color: $dark;
|
||||
}
|
||||
|
||||
.required {
|
||||
font-size: 90%;
|
||||
color: $danger;
|
||||
}
|
||||
|
||||
// Conteneur d'un champ.
|
||||
.form-group {
|
||||
margin-bottom: $spacer;
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
@charset "utf-8";
|
||||
|
||||
// Configuration and helpers
|
||||
@import "abstracts/variables";
|
||||
|
||||
// Fork Awesome
|
||||
// ------------
|
||||
// @link https://forkawesome.github.io/
|
||||
|
||||
$fa-font-path: "#{$font-path}/fork-awesome";
|
||||
|
||||
@import "fork-awesome/scss/fork-awesome";
|
|
@ -0,0 +1,55 @@
|
|||
// ----------------------------------------------------------------------------
|
||||
// Bootstrap
|
||||
// ----------------------------------------------------------------------------
|
||||
// see: ../../node_modules/bootstrap/scss/bootstrap.scss
|
||||
|
||||
/// Import all Bootstrap components
|
||||
|
||||
@import "bootstrap/scss/bootstrap";
|
||||
|
||||
/// ... or import them individually
|
||||
|
||||
// Configuration
|
||||
|
||||
// @import "bootstrap/scss/functions";
|
||||
// @import "bootstrap/scss/variables";
|
||||
// @import "bootstrap/scss/mixins";
|
||||
// @import "bootstrap/scss/utilities";
|
||||
|
||||
// Layout & components
|
||||
|
||||
// @import "bootstrap/scss/root";
|
||||
// @import "bootstrap/scss/reboot";
|
||||
// @import "bootstrap/scss/type";
|
||||
// @import "bootstrap/scss/images";
|
||||
// @import "bootstrap/scss/grid";
|
||||
// @import "bootstrap/scss/tables";
|
||||
// @import "bootstrap/scss/forms";
|
||||
// @import "bootstrap/scss/buttons";
|
||||
// @import "bootstrap/scss/transitions";
|
||||
// @import "bootstrap/scss/dropdown";
|
||||
// @import "bootstrap/scss/button-group";
|
||||
// @import "bootstrap/scss/nav";
|
||||
// @import "bootstrap/scss/navbar";
|
||||
// @import "bootstrap/scss/card";
|
||||
// @import "bootstrap/scss/breadcrumb";
|
||||
// @import "bootstrap/scss/pagination";
|
||||
// @import "bootstrap/scss/badge";
|
||||
// @import "bootstrap/scss/alert";
|
||||
// @import "bootstrap/scss/progress";
|
||||
// @import "bootstrap/scss/list-group";
|
||||
// @import "bootstrap/scss/close";
|
||||
// @import "bootstrap/scss/toasts";
|
||||
// @import "bootstrap/scss/modal";
|
||||
// @import "bootstrap/scss/tooltip";
|
||||
// @import "bootstrap/scss/popover";
|
||||
// @import "bootstrap/scss/carousel";
|
||||
// @import "bootstrap/scss/spinners";
|
||||
|
||||
// Helpers
|
||||
|
||||
// @import "bootstrap/scss/helpers";
|
||||
|
||||
// Utilities
|
||||
|
||||
// @import "bootstrap/scss/utilities/api";
|
|
@ -0,0 +1,105 @@
|
|||
###########################################################
|
||||
# #
|
||||
# Edit the following configuration to suits your needs. #
|
||||
# #
|
||||
###########################################################
|
||||
|
||||
###############################################################################
|
||||
# MAINS SETTINGS
|
||||
###############################################################################
|
||||
|
||||
# Environment to use within the application.
|
||||
#
|
||||
# The environment is used to load the proper settings for your application
|
||||
# instance. There is two ways for defining it, with the following precedence:
|
||||
# - DJANGO_SETTINGS_MODULE: the Python path to the settings module to use. It
|
||||
# allows you to define and use your own settings module. Use it with care!
|
||||
# Note: the module name will be used as the environment.
|
||||
# - ENV: the environment to use, which is one of 'production' or 'development'.
|
||||
#
|
||||
# Default is the 'production' environment.
|
||||
#ENV=production
|
||||
#ENV=development
|
||||
|
||||
# The secret key used to provide cryptographic signing.
|
||||
#
|
||||
# It should be set to a unique, unpredictable value. On a GNU/Linux system, you
|
||||
# could generate a new one with:
|
||||
#
|
||||
# $ head -c50 /dev/urandom | base64
|
||||
#
|
||||
# /!\ Required in production.
|
||||
#DJANGO_SECRET_KEY=CHANGEME!!!
|
||||
|
||||
# A coma-separated string representing the host/domain names that this
|
||||
# application instance can serve.
|
||||
#
|
||||
# /!\ Required in production.
|
||||
#DJANGO_ALLOWED_HOSTS=example.org,
|
||||
|
||||
###############################################################################
|
||||
# DATABASE SETTINGS
|
||||
###############################################################################
|
||||
|
||||
# Database configuration, as an URI.
|
||||
#
|
||||
# In production, the recommended database backend for better performances is
|
||||
# PostgreSQL - or MySQL if you prefer.
|
||||
#
|
||||
# Default is a SQLite database in development only.
|
||||
#
|
||||
# /!\ Required in production.
|
||||
#DJANGO_DATABASE_URL=postgres://user:password@127.0.0.1:5432/danse
|
||||
#DJANGO_DATABASE_URL=mysql://user:password@127.0.0.1:3306/danse
|
||||
|
||||
###############################################################################
|
||||
# EMAILS SETTINGS
|
||||
###############################################################################
|
||||
|
||||
# Email configuration for sending messages, as an URI.
|
||||
#
|
||||
# In production, you should either use a local SMTP server or a relay one. The
|
||||
# URI will be in that case of the form:
|
||||
#
|
||||
# PROTOCOL://[USER:PASSWORD@]HOST[:PORT]
|
||||
#
|
||||
# PROTOCOL can be smtp, smtp+ssl or smtp+tls. Note that special characters
|
||||
# in USER and PASSWORD - e.g. @ - must be escaped. It can be achieve with:
|
||||
#
|
||||
# $ python3 -c 'from urllib.parse import quote as q;print(q("USER")+":"+q("PASSWORD"))'
|
||||
#
|
||||
# Default is the local SMTP server in production and the console in development.
|
||||
#DJANGO_EMAIL_URL=smtp://localhost:25
|
||||
|
||||
# Default email address to use for various automated correspondence.
|
||||
#
|
||||
# /!\ Required in production.
|
||||
#DEFAULT_FROM_EMAIL=webmaster@example.org
|
||||
|
||||
# A comma separated list of all the people who get production error
|
||||
# notifications, following rfc2822 format
|
||||
#ADMINS='Cliss XXI <tech@cliss21.com>'
|
||||
|
||||
###############################################################################
|
||||
# MISC SETTINGS
|
||||
###############################################################################
|
||||
|
||||
# URL prefix on which the application is served.
|
||||
#
|
||||
# This is used to generate the static and media URLs, but also links to the
|
||||
# application which require an absolute URL.
|
||||
#
|
||||
# Default is '/', e.g. at the domain root.
|
||||
#APP_LOCATION=/
|
||||
|
||||
# Base directory of the app instance, where the local and var folders are
|
||||
# located.
|
||||
#
|
||||
# Default is the current directory.
|
||||
#BASE_DIR=
|
||||
|
||||
# Turn on/off debug mode.
|
||||
#
|
||||
# Note that it's always disabled in production.
|
||||
#DJANGO_DEBUG=off
|
||||
#DJANGO_DEBUG_TOOLBAR=on
|
|
@ -0,0 +1 @@
|
|||
__version__ = '0.1.0'
|
|
@ -0,0 +1 @@
|
|||
default_app_config = 'danse.base.apps.BaseConfig'
|
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class BaseConfig(AppConfig):
|
||||
name = 'danse.base'
|
||||
verbose_name = "Base"
|
|
@ -0,0 +1,33 @@
|
|||
import functools
|
||||
import os.path
|
||||
|
||||
from django import template
|
||||
from django.conf import settings
|
||||
from django.contrib.staticfiles import finders
|
||||
from django.templatetags.static import static
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@functools.lru_cache(maxsize=None)
|
||||
def get_minified_static_path(path):
|
||||
"""Retourne de préférence le chemin d'un fichier compressé.
|
||||
|
||||
Détermine et retourne le chemin relatif à utiliser pour le fichier
|
||||
statique `path`, en fonction de l'environnement. Si elle existe, la
|
||||
version compressée (e.g. avec le suffixe `.min` avant l'extension) du
|
||||
fichier sera retournée quand le débogage est désactivé.
|
||||
"""
|
||||
if settings.DEBUG:
|
||||
return path
|
||||
root, ext = os.path.splitext(path)
|
||||
min_path = '{}.min{}'.format(root, ext or '')
|
||||
if finders.find(min_path):
|
||||
return min_path
|
||||
return path
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
def minified(path):
|
||||
"""Retourne le chemin absolu d'un fichier statique compressé."""
|
||||
return static(get_minified_static_path(path))
|
|
@ -0,0 +1,43 @@
|
|||
from django.template import Context, Template
|
||||
|
||||
import pytest
|
||||
|
||||
from ..templatetags.minified import get_minified_static_path
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_static_find(monkeypatch):
|
||||
def find(*args, **kwargs):
|
||||
return True
|
||||
|
||||
# patch pour trouver n'importe quel fichier dans les statics
|
||||
monkeypatch.setattr('django.contrib.staticfiles.finders.find', find)
|
||||
|
||||
|
||||
class TestMinified:
|
||||
def setup(self):
|
||||
# vide le cache avant chaque test
|
||||
get_minified_static_path.cache_clear()
|
||||
|
||||
def test_get_path_debug(self, mock_static_find, settings):
|
||||
settings.DEBUG = True
|
||||
assert get_minified_static_path('test/debug.css') == 'test/debug.css'
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'path, result',
|
||||
[
|
||||
('test/app.css', 'test/app.min.css'),
|
||||
('test/no_extension', 'test/no_extension.min'),
|
||||
],
|
||||
)
|
||||
def test_get_path_exists(self, mock_static_find, path, result):
|
||||
assert get_minified_static_path(path) == result
|
||||
|
||||
def test_get_path_not_found(self):
|
||||
assert get_minified_static_path('unknown.txt') == 'unknown.txt'
|
||||
|
||||
def test_tag(self, mock_static_find, settings):
|
||||
rendered = Template(
|
||||
'{% load minified %}{% minified "test/tag.css" %}'
|
||||
).render(Context())
|
||||
assert rendered == settings.STATIC_URL + 'test/tag.min.css'
|
|
@ -0,0 +1,25 @@
|
|||
import environ
|
||||
|
||||
"""The default environment to use."""
|
||||
DEFAULT_ENVIRONMENT = 'production'
|
||||
|
||||
"""The environment variables of the app instance."""
|
||||
env = environ.Env()
|
||||
|
||||
"""Path to the package root - e.g. Django project."""
|
||||
root_dir = environ.Path(__file__) - 2
|
||||
|
||||
"""Path to the base directory of the app instance."""
|
||||
base_dir = env.path('BASE_DIR', default=str(root_dir - 1))
|
||||
|
||||
# Load config.env, OS environment variables will take precedence
|
||||
if env.bool('READ_CONFIG_FILE', default=True):
|
||||
env.read_env(str(base_dir.path('config.env')))
|
||||
|
||||
"""The Django settings module's name to use."""
|
||||
DJANGO_SETTINGS_MODULE = env(
|
||||
'DJANGO_SETTINGS_MODULE',
|
||||
default='danse.settings.{}'.format(
|
||||
env('ENV', default=DEFAULT_ENVIRONMENT)
|
||||
),
|
||||
)
|
|
@ -0,0 +1,262 @@
|
|||
"""
|
||||
Django settings for Danse ! project.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/stable/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/stable/ref/settings/
|
||||
"""
|
||||
import os.path
|
||||
from email.utils import getaddresses
|
||||
|
||||
from . import base_dir, env, root_dir
|
||||
|
||||
# ENVIRONMENT VARIABLES AND PATHS
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
# Local directory used for static and templates overrides
|
||||
local_dir = base_dir.path('local')
|
||||
|
||||
# Directory for variable stuffs, i.e. user-uploaded media
|
||||
var_dir = base_dir.path('var')
|
||||
if not os.path.isdir(var_dir()):
|
||||
os.mkdir(var_dir(), mode=0o755)
|
||||
|
||||
# Location on which the application is served
|
||||
APP_LOCATION = env('APP_LOCATION', default='/')
|
||||
|
||||
# GENERAL
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#debug
|
||||
DEBUG = env.bool('DJANGO_DEBUG', default=True)
|
||||
|
||||
# Local time zone for this installation
|
||||
TIME_ZONE = 'Europe/Paris'
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#language-code
|
||||
LANGUAGE_CODE = 'fr'
|
||||
|
||||
# https://docs.djangoproject.com/en/dev/ref/settings/#site-id
|
||||
SITE_ID = 1
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#use-i18n
|
||||
USE_I18N = True
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#use-l10n
|
||||
USE_L10N = True
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#use-tz
|
||||
USE_TZ = True
|
||||
|
||||
# DATABASES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#databases
|
||||
# https://django-environ.readthedocs.io/en/stable/#supported-types
|
||||
DATABASES = {
|
||||
'default': env.db(
|
||||
'DJANGO_DATABASE_URL',
|
||||
default='sqlite:///{}'.format(base_dir('sqlite.db')),
|
||||
)
|
||||
}
|
||||
|
||||
# URLS
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#root-urlconf
|
||||
ROOT_URLCONF = 'danse.urls'
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#wsgi-application
|
||||
WSGI_APPLICATION = 'danse.wsgi.application'
|
||||
|
||||
# APP CONFIGURATION
|
||||
# ------------------------------------------------------------------------------
|
||||
DJANGO_APPS = [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
]
|
||||
|
||||
WAGTAIL_APPS = [
|
||||
'wagtail.contrib.forms',
|
||||
'wagtail.contrib.redirects',
|
||||
'wagtail.embeds',
|
||||
'wagtail.sites',
|
||||
'wagtail.users',
|
||||
'wagtail.snippets',
|
||||
'wagtail.documents',
|
||||
'wagtail.images',
|
||||
'wagtail.search',
|
||||
'wagtail.admin',
|
||||
'wagtail.core',
|
||||
'modelcluster',
|
||||
'taggit',
|
||||
]
|
||||
|
||||
# Project dependencies
|
||||
THIRD_PARTY_APPS = []
|
||||
|
||||
# Project applications
|
||||
LOCAL_APPS = ['danse.base']
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#installed-apps
|
||||
INSTALLED_APPS = DJANGO_APPS + WAGTAIL_APPS + THIRD_PARTY_APPS + LOCAL_APPS
|
||||
|
||||
# PASSWORDS
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#password-hashers
|
||||
PASSWORD_HASHERS = [
|
||||
# https://docs.djangoproject.com/en/stable/topics/auth/passwords/#using-argon2-with-django
|
||||
# 'django.contrib.auth.hashers.Argon2PasswordHasher',
|
||||
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
|
||||
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
|
||||
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
|
||||
'django.contrib.auth.hashers.BCryptPasswordHasher',
|
||||
]
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-validation
|
||||
AUTH_PASSWORD_VALIDATORS = [
|
||||
{
|
||||
'NAME': (
|
||||
'django.contrib.auth.password_validation.'
|
||||
'UserAttributeSimilarityValidator'
|
||||
)
|
||||
},
|
||||
{
|
||||
'NAME': (
|
||||
'django.contrib.auth.password_validation.MinimumLengthValidator'
|
||||
)
|
||||
},
|
||||
{
|
||||
'NAME': (
|
||||
'django.contrib.auth.password_validation.'
|
||||
'CommonPasswordValidator'
|
||||
)
|
||||
},
|
||||
{
|
||||
'NAME': (
|
||||
'django.contrib.auth.password_validation.'
|
||||
'NumericPasswordValidator'
|
||||
)
|
||||
},
|
||||
]
|
||||
|
||||
# MIDDLEWARE
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#middleware
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'wagtail.core.middleware.SiteMiddleware',
|
||||
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
|
||||
]
|
||||
|
||||
# STATIC
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#static-files
|
||||
STATIC_ROOT = var_dir('static')
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#static-url
|
||||
STATIC_URL = os.path.join(APP_LOCATION, 'static/')
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#staticfiles-dirs
|
||||
STATICFILES_DIRS = [root_dir('static')]
|
||||
if os.path.isdir(local_dir('static')):
|
||||
STATICFILES_DIRS.insert(0, local_dir('static'))
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/contrib/staticfiles/#staticfiles-finders
|
||||
STATICFILES_FINDERS = [
|
||||
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||
]
|
||||
|
||||
# MEDIA
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#media-root
|
||||
MEDIA_ROOT = var_dir('media')
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#media-url
|
||||
MEDIA_URL = os.path.join(APP_LOCATION, 'media/')
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#file-upload-directory-permissions
|
||||
FILE_UPLOAD_DIRECTORY_PERMISSIONS = 0o755
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#file-upload-permissions
|
||||
FILE_UPLOAD_PERMISSIONS = 0o644
|
||||
|
||||
# TEMPLATES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#templates
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [root_dir('templates')],
|
||||
'OPTIONS': {
|
||||
'debug': DEBUG,
|
||||
'loaders': [
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader',
|
||||
],
|
||||
'context_processors': [
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.template.context_processors.media',
|
||||
'django.template.context_processors.static',
|
||||
'django.template.context_processors.tz',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
}
|
||||
]
|
||||
if os.path.isdir(local_dir('templates')):
|
||||
TEMPLATES[0]['DIRS'].insert(0, local_dir('templates'))
|
||||
|
||||
# FIXTURES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#fixture-dirs
|
||||
FIXTURE_DIRS = [root_dir('fixtures')]
|
||||
|
||||
# EMAIL
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/topics/email/#email-backends
|
||||
# https://django-environ.readthedocs.io/en/stable/#supported-types
|
||||
vars().update(env.email_url('DJANGO_EMAIL_URL', default='smtp://localhost:25'))
|
||||
|
||||
DEFAULT_FROM_EMAIL = env('DEFAULT_FROM_EMAIL', default='webmaster@localhost')
|
||||
# Use the same email address for error messages
|
||||
SERVER_EMAIL = DEFAULT_FROM_EMAIL
|
||||
|
||||
# ADMIN
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#admins
|
||||
ADMINS = getaddresses([env('ADMINS', default='Cliss XXI <tech@cliss21.com>')])
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#managers
|
||||
MANAGERS = ADMINS
|
||||
|
||||
# SESSIONS AND COOKIES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#session-cookie-path
|
||||
SESSION_COOKIE_PATH = APP_LOCATION
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#csrf-cookie-path
|
||||
CSRF_COOKIE_PATH = APP_LOCATION
|
||||
|
||||
# WAGTAIL
|
||||
# ------------------------------------------------------------------------------
|
||||
# http://docs.wagtail.io/en/stable/advanced_topics/settings.html
|
||||
WAGTAIL_SITE_NAME = "Danse !"
|
||||
|
||||
# Disable Gravatar provider
|
||||
WAGTAIL_GRAVATAR_PROVIDER_URL = None
|
||||
|
||||
# Disable update checking on the dashboard
|
||||
WAGTAIL_ENABLE_UPDATE_CHECK = False
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# APPLICATION AND 3RD PARTY LIBRARY SETTINGS
|
||||
# ------------------------------------------------------------------------------
|
|
@ -0,0 +1,50 @@
|
|||
"""
|
||||
Development settings.
|
||||
|
||||
- use Console backend for emails sending by default
|
||||
- add the django-debug-toolbar
|
||||
"""
|
||||
from .base import * # noqa
|
||||
from .base import INSTALLED_APPS, MIDDLEWARE, env
|
||||
|
||||
# GENERAL
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#secret-key
|
||||
SECRET_KEY = env('DJANGO_SECRET_KEY', default='CHANGEME!!!')
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#allowed-hosts
|
||||
ALLOWED_HOSTS = env.list(
|
||||
'DJANGO_ALLOWED_HOSTS', default=['localhost', '0.0.0.0', '127.0.0.1']
|
||||
)
|
||||
|
||||
# EMAIL
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/topics/email/#email-backends
|
||||
# https://django-environ.readthedocs.io/en/stable/#supported-types
|
||||
vars().update(env.email_url('DJANGO_EMAIL_URL', default='consolemail://'))
|
||||
|
||||
# WAGTAIL
|
||||
# ------------------------------------------------------------------------------
|
||||
# http://docs.wagtail.io/en/stable/contributing/styleguide.html
|
||||
INSTALLED_APPS += ['wagtail.contrib.styleguide']
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# APPLICATION AND 3RD PARTY LIBRARY SETTINGS
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
# DJANGO DEBUG TOOLBAR
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://django-debug-toolbar.readthedocs.io/en/stable/installation.html
|
||||
if env.bool('DJANGO_DEBUG_TOOLBAR', default=False):
|
||||
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
|
||||
INSTALLED_APPS += ['debug_toolbar']
|
||||
INTERNAL_IPS = ['127.0.0.1']
|
||||
DEBUG_TOOLBAR_CONFIG = {
|
||||
'DISABLE_PANELS': ['debug_toolbar.panels.redirects.RedirectsPanel'],
|
||||
'SHOW_TEMPLATE_CONTEXT': True,
|
||||
}
|
||||
|
||||
# DJANGO EXTENSIONS
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://django-extensions.readthedocs.io/en/stable/index.html
|
||||
INSTALLED_APPS += ['django_extensions']
|
|
@ -0,0 +1,106 @@
|
|||
"""
|
||||
Production settings.
|
||||
|
||||
- validate the configuration
|
||||
- disable debug mode
|
||||
- load secret key from environment variables
|
||||
- set other production configurations
|
||||
"""
|
||||
import os
|
||||
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
from .base import * # noqa
|
||||
from .base import TEMPLATES, env, var_dir
|
||||
|
||||
# CONFIGURATION VALIDATION
|
||||
# ------------------------------------------------------------------------------
|
||||
# Ensure that the database configuration has been set
|
||||
if not env('DJANGO_DATABASE_URL', default=None):
|
||||
raise ImproperlyConfigured(
|
||||
"No database configuration has been set, you should check "
|
||||
"the value of your DATABASE_URL environment variable."
|
||||
)
|
||||
|
||||
# Ensure that the default email address has been set
|
||||
if not env('DEFAULT_FROM_EMAIL', default=None):
|
||||
raise ImproperlyConfigured(
|
||||
"No default email address has been set, you should check "
|
||||
"the value of your DEFAULT_FROM_EMAIL environment variable."
|
||||
)
|
||||
|
||||
# GENERAL
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#debug
|
||||
DEBUG = False
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#secret-key
|
||||
SECRET_KEY = env('DJANGO_SECRET_KEY')
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#allowed-hosts
|
||||
ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=[])
|
||||
|
||||
# TEMPLATES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#templates
|
||||
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
|
||||
TEMPLATES[0]['OPTIONS']['loaders'] = [
|
||||
(
|
||||
'django.template.loaders.cached.Loader',
|
||||
[
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader',
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
# LOGGING
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/topics/logging/
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': False,
|
||||
'formatters': {
|
||||
'verbose': {
|
||||
'format': '%(asctime)s - %(levelname)s - %(module)s: %(message)s'
|
||||
}
|
||||
},
|
||||
'handlers': {
|
||||
'mail_admins': {
|
||||
'level': 'ERROR',
|
||||
'class': 'django.utils.log.AdminEmailHandler',
|
||||
},
|
||||
'file': {
|
||||
'level': 'DEBUG',
|
||||
'class': 'logging.handlers.TimedRotatingFileHandler',
|
||||
'filename': var_dir('log/danse.log'),
|
||||
'formatter': 'verbose',
|
||||
'when': 'midnight',
|
||||
'interval': 1,
|
||||
'backupCount': 30,
|
||||
},
|
||||
},
|
||||
'loggers': {
|
||||
'django': {
|
||||
'level': 'WARNING',
|
||||
'handlers': ['file'],
|
||||
'propagate': True,
|
||||
},
|
||||
'django.request': {
|
||||
'level': 'WARNING',
|
||||
'handlers': ['file', 'mail_admins'],
|
||||
'propagate': True,
|
||||
},
|
||||
'danse': {
|
||||
'level': 'INFO',
|
||||
'handlers': ['file', 'mail_admins'],
|
||||
'propagate': True,
|
||||
},
|
||||
},
|
||||
}
|
||||
if not os.path.isdir(var_dir('log')):
|
||||
os.mkdir(var_dir('log'), mode=0o750)
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# APPLICATION AND 3RD PARTY LIBRARY SETTINGS
|
||||
# ------------------------------------------------------------------------------
|
|
@ -0,0 +1,54 @@
|
|||
"""
|
||||
With these settings, tests run faster.
|
||||
"""
|
||||
from .base import * # noqa
|
||||
from .base import TEMPLATES, env
|
||||
|
||||
# GENERAL
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#debug
|
||||
DEBUG = False
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#secret-key
|
||||
SECRET_KEY = env('DJANGO_SECRET_KEY', default='CHANGEME!!!')
|
||||
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#test-runner
|
||||
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
|
||||
|
||||
# CACHES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#caches
|
||||
CACHES = {
|
||||
'default': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': '',
|
||||
}
|
||||
}
|
||||
|
||||
# PASSWORDS
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#password-hashers
|
||||
PASSWORD_HASHERS = ['django.contrib.auth.hashers.MD5PasswordHasher']
|
||||
|
||||
# TEMPLATES
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#templates
|
||||
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
|
||||
TEMPLATES[0]['OPTIONS']['loaders'] = [
|
||||
(
|
||||
'django.template.loaders.cached.Loader',
|
||||
[
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader',
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
# EMAIL
|
||||
# ------------------------------------------------------------------------------
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#email-backend
|
||||
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#email-host
|
||||
EMAIL_HOST = 'localhost'
|
||||
# https://docs.djangoproject.com/en/stable/ref/settings/#email-port
|
||||
EMAIL_PORT = 1025
|
|
@ -0,0 +1,7 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Page introuvable{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<p>La page que vous demandez semble introuvable...</p>
|
||||
{% endblock %}
|
|
@ -0,0 +1,7 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Erreur interne{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<p>Une erreur inattendue est survenue...</p>
|
||||
{% endblock %}
|
|
@ -0,0 +1,44 @@
|
|||
{% load minified %}<!DOCTYPE html>
|
||||
<html class="no-js" lang="fr">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<title>
|
||||
{% block title %}{{ page.seo_title|default:page.title }}{% endblock %}
|
||||
{% block title_suffix %}- Danse !{% endblock %}
|
||||
</title>
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="keywords" content="">
|
||||
|
||||
{% block css %}
|
||||
<link rel="stylesheet" href="{% minified "css/fork-awesome.css" %}">
|
||||
<link rel="stylesheet" href="{% minified "css/app.css" %}">
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_head %}{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div class="alert{% if message.tags %} {{ message.tags }}{% endif %}">{{ message }}</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% block content %}
|
||||
<p>Utilisez ce modèle pour démarrer rapidement une nouvelle application.</p>
|
||||
{% endblock %}
|
||||
|
||||
</div><!-- .container -->
|
||||
|
||||
{% block modal %}{% endblock %}
|
||||
|
||||
{% block javascript %}
|
||||
<script src="{% minified "js/app.js" %}"></script>
|
||||
{% endblock %}
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,43 @@
|
|||
from django.conf import settings
|
||||
from django.contrib import admin
|
||||
from django.urls import include, path
|
||||
|
||||
from wagtail.admin import urls as wagtailadmin_urls
|
||||
from wagtail.core import urls as wagtail_urls
|
||||
from wagtail.documents import urls as wagtaildocs_urls
|
||||
|
||||
urlpatterns = [
|
||||
path('django-admin/', admin.site.urls),
|
||||
|
||||
# Wagtail's applications
|
||||
path('admin/', include(wagtailadmin_urls)),
|
||||
path('documents/', include(wagtaildocs_urls)),
|
||||
|
||||
# Local applications
|
||||
# ...
|
||||
]
|
||||
|
||||
if settings.DEBUG:
|
||||
from django.conf.urls.static import static
|
||||
from django.views import defaults as default_views
|
||||
|
||||
# This allows the error pages to be debugged during development, just visit
|
||||
# these url in browser to see how these error pages look like.
|
||||
urlpatterns += [
|
||||
path('400/', default_views.bad_request,
|
||||
kwargs={'exception': Exception('Bad Request!')}),
|
||||
path('403/', default_views.permission_denied,
|
||||
kwargs={'exception': Exception('Permission Denied')}),
|
||||
path('404/', default_views.page_not_found,
|
||||
kwargs={'exception': Exception('Page not Found')}),
|
||||
path('500/', default_views.server_error),
|
||||
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
||||
if 'debug_toolbar' in settings.INSTALLED_APPS:
|
||||
import debug_toolbar
|
||||
urlpatterns.insert(0, path('__debug__/', include(debug_toolbar.urls)))
|
||||
|
||||
# Root application
|
||||
urlpatterns += [
|
||||
path('', include(wagtail_urls)),
|
||||
]
|
|
@ -0,0 +1,21 @@
|
|||
"""
|
||||
WSGI config for Danse ! project.
|
||||
|
||||
This module contains the WSGI application used by Django's development server
|
||||
and any production WSGI deployments. It should expose a module-level variable
|
||||
named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
|
||||
this application via the ``WSGI_APPLICATION`` setting.
|
||||
"""
|
||||
import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
from danse.settings import DJANGO_SETTINGS_MODULE
|
||||
|
||||
# Set the default settings module to use.
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', DJANGO_SETTINGS_MODULE)
|
||||
|
||||
# This application object is used by any WSGI server configured to use this
|
||||
# file. This includes Django's development server, if the WSGI_APPLICATION
|
||||
# setting points here.
|
||||
application = get_wsgi_application()
|
|
@ -0,0 +1,287 @@
|
|||
/* eslint-env node */
|
||||
|
||||
const autoprefixer = require('autoprefixer');
|
||||
const merge = require('merge-stream');
|
||||
const rimraf = require('rimraf');
|
||||
const sherpa = require('style-sherpa');
|
||||
const named = require('vinyl-named');
|
||||
const webpack = require('webpack');
|
||||
const webpackStream = require('webpack-stream');
|
||||
|
||||
const gulp = require('gulp');
|
||||
const plugins = require('gulp-load-plugins');
|
||||
|
||||
const browser = require('browser-sync').create();
|
||||
|
||||
// Load all Gulp plugins into one variable
|
||||
const $ = plugins({
|
||||
rename: {
|
||||
'gulp-touch-fd': 'touch'
|
||||
}
|
||||
});
|
||||
|
||||
/// Configuration -------------------------------------------------------------
|
||||
|
||||
const CONFIG = {
|
||||
// Proxy target of the BrowserSync'server
|
||||
SERVER_PROXY: 'http://127.0.0.1:8000',
|
||||
|
||||
// Port on which the BrowserSync'server will listen
|
||||
SERVER_PORT: 8090,
|
||||
|
||||
// Paths to other assets which will be copied
|
||||
ASSETS_FILES: [
|
||||
{
|
||||
src: [
|
||||
'assets/**/*',
|
||||
'!assets/{img,js,scss}',
|
||||
'!assets/{img,js,scss}/**/*'
|
||||
],
|
||||
dest: ''
|
||||
},
|
||||
{
|
||||
// ForkAwesome
|
||||
src: 'node_modules/fork-awesome/fonts/*',
|
||||
dest: 'fonts/fork-awesome'
|
||||
}
|
||||
],
|
||||
|
||||
// Paths to images which will be compressed and copied
|
||||
IMAGES_FILES: [
|
||||
'assets/img/**/*'
|
||||
],
|
||||
|
||||
// Paths to JavaScript entries which will be bundled
|
||||
JS_ENTRIES: [
|
||||
'assets/js/app.js'
|
||||
],
|
||||
|
||||
// Paths to Sass files which will be compiled
|
||||
SASS_ENTRIES: [
|
||||
'assets/scss/app.scss',
|
||||
'assets/scss/fork-awesome.scss'
|
||||
],
|
||||
|
||||
// Paths to Sass libraries, which can then be loaded with @import
|
||||
SASS_INCLUDE_PATHS: [
|
||||
'node_modules'
|
||||
],
|
||||
|
||||
// Path to the build output, which can safely be be cleaned
|
||||
BUILD_PATH: 'danse/static'
|
||||
};
|
||||
|
||||
/// CSS -----------------------------------------------------------------------
|
||||
|
||||
// Compile Sass into CSS.
|
||||
function cssTranspile() {
|
||||
return gulp.src(CONFIG.SASS_ENTRIES)
|
||||
.pipe($.sourcemaps.init())
|
||||
.pipe($.sass({
|
||||
includePaths: CONFIG.SASS_INCLUDE_PATHS
|
||||
}).on('error', $.sass.logError))
|
||||
.pipe($.postcss([
|
||||
autoprefixer()
|
||||
]))
|
||||
.pipe($.sourcemaps.write('.'))
|
||||
.pipe(gulp.dest(`${CONFIG.BUILD_PATH}/css`))
|
||||
.pipe($.touch())
|
||||
.pipe(browser.reload({ stream: true }));
|
||||
}
|
||||
|
||||
// Lint Sass files.
|
||||
function cssLint() {
|
||||
return gulp.src('assets/scss/**/*.scss')
|
||||
.pipe($.stylelint({
|
||||
failAfterError: true,
|
||||
reporters: [
|
||||
{ formatter: 'verbose', console: true }
|
||||
]
|
||||
}));
|
||||
}
|
||||
|
||||
// Compress CSS files.
|
||||
function cssMinify() {
|
||||
return gulp.src([
|
||||
`${CONFIG.BUILD_PATH}/css/*.css`,
|
||||
`!${CONFIG.BUILD_PATH}/css/*.min.css`
|
||||
])
|
||||
.pipe($.cleanCss())
|
||||
.pipe($.rename({ suffix: '.min' }))
|
||||
.pipe(gulp.dest(`${CONFIG.BUILD_PATH}/css`));
|
||||
}
|
||||
|
||||
exports.css = gulp.series(cssTranspile, cssMinify);
|
||||
|
||||
/// JavaScript ----------------------------------------------------------------
|
||||
|
||||
const webpackConfig = {
|
||||
devtool: 'source-map',
|
||||
mode: 'development',
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /.js$/,
|
||||
use: {
|
||||
loader: 'babel-loader',
|
||||
options: {
|
||||
presets: ['@babel/preset-env'],
|
||||
compact: false
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
stats: {
|
||||
chunks: false,
|
||||
entrypoints: false
|
||||
}
|
||||
};
|
||||
|
||||
// Bundle JavaScript module.
|
||||
function jsBundle() {
|
||||
return gulp.src(CONFIG.JS_ENTRIES)
|
||||
.pipe(named())
|
||||
.pipe(webpackStream(webpackConfig, webpack))
|
||||
.pipe(gulp.dest(`${CONFIG.BUILD_PATH}/js`));
|
||||
}
|
||||
|
||||
// Lint JavaScript source files.
|
||||
function jsLint() {
|
||||
return gulp.src('assets/js/**/*.js')
|
||||
.pipe($.eslint())
|
||||
.pipe($.eslint.format())
|
||||
.pipe($.eslint.failAfterError());
|
||||
}
|
||||
|
||||
// Compress JavaScript files.
|
||||
function jsMinify() {
|
||||
return gulp.src([
|
||||
`${CONFIG.BUILD_PATH}/js/*.js`,
|
||||
`!${CONFIG.BUILD_PATH}/js/*.min.js`
|
||||
])
|
||||
.pipe($.terser())
|
||||
.pipe($.rename({ suffix: '.min' }))
|
||||
.pipe(gulp.dest(`${CONFIG.BUILD_PATH}/js`));
|
||||
}
|
||||
|
||||
exports.js = gulp.series(jsBundle, jsMinify);
|
||||
|
||||
/// Other assets --------------------------------------------------------------
|
||||
|
||||
// Compress and copy images.
|
||||
function images() {
|
||||
return gulp.src(CONFIG.IMAGES_FILES)
|
||||
.pipe($.imagemin({ progressive: true }))
|
||||
.pipe(gulp.dest(`${CONFIG.BUILD_PATH}/img`));
|
||||
}
|
||||
|
||||
// Copy other assets files.
|
||||
function assets() {
|
||||
return merge(CONFIG.ASSETS_FILES.map(
|
||||
item => gulp.src(item.src)
|
||||
.pipe(gulp.dest(`${CONFIG.BUILD_PATH}/${item.dest}`))
|
||||
));
|
||||
}
|
||||
|
||||
/// HTML files ----------------------------------------------------------------
|
||||
|
||||
// Generate a style guide from the Markdown content.
|
||||
function styleguide(done) {
|
||||
sherpa('styleguide/index.md', {
|
||||
output: 'styleguide/index.html',
|
||||
template: 'styleguide/template.html'
|
||||
}, done);
|
||||
}
|
||||
|
||||
/// BrowserSync servers -------------------------------------------------------
|
||||
|
||||
// Start a server with BrowserSync and proxify the application in.
|
||||
function proxyServer(done) {
|
||||
browser.init({
|
||||
proxy: CONFIG.SERVER_PROXY,
|
||||
port: CONFIG.SERVER_PORT,
|
||||
serveStatic: [
|
||||
{
|
||||
route: '/static',
|
||||
dir: CONFIG.BUILD_PATH
|
||||
},
|
||||
{
|
||||
route: '/styleguide',
|
||||
dir: './styleguide'
|
||||
}
|
||||
],
|
||||
ghostMode: false,
|
||||
notify: false
|
||||
});
|
||||
done();
|
||||
}
|
||||
|
||||
// Start a server with BrowserSync with the styleguide.
|
||||
function styleguideServer(done) {
|
||||
browser.init({
|
||||
server: {
|
||||
baseDir: './styleguide',
|
||||
routes: {
|
||||
'/static': CONFIG.BUILD_PATH
|
||||
}
|
||||
},
|
||||
port: CONFIG.SERVER_PORT,
|
||||
ghostMode: false,
|
||||
notify: false
|
||||
});
|
||||
|
||||
done();
|
||||
}
|
||||
|
||||
/// Utils ---------------------------------------------------------------------
|
||||
|
||||
function clean(done) {
|
||||
rimraf(CONFIG.BUILD_PATH, done);
|
||||
}
|
||||
|
||||
// Reload the BrowserSync server.
|
||||
function reload(done) {
|
||||
browser.reload();
|
||||
done();
|
||||
}
|
||||
|
||||
// Watch for changes to static assets, Sass and JavaScript.
|
||||
function watch() {
|
||||
gulp.watch('assets/scss/**/*.scss',
|
||||
gulp.series(exports.css));
|
||||
gulp.watch('assets/js/**/*.js',
|
||||
gulp.series(exports.js, reload));
|
||||
|
||||
gulp.watch(CONFIG.IMAGES_FILES,
|
||||
gulp.series(images, reload));
|
||||
|
||||
gulp.watch([].concat(...CONFIG.ASSETS_FILES.map(a => a.src)),
|
||||
gulp.series(assets, reload));
|
||||
|
||||
gulp.watch(['styleguide/*', '!styleguide/index.html'],
|
||||
gulp.series(styleguide, reload));
|
||||
}
|
||||
|
||||
/// General tasks -------------------------------------------------------------
|
||||
|
||||
// Build and compress CSS, JavaScript and other assets.
|
||||
exports.build = gulp.series(
|
||||
clean,
|
||||
gulp.parallel(cssTranspile, jsBundle),
|
||||
gulp.parallel(cssMinify, jsMinify),
|
||||
gulp.parallel(images, assets),
|
||||
styleguide
|
||||
);
|
||||
|
||||
// Run a development server and watch for file changes.
|
||||
exports.serve = gulp.series(proxyServer, watch);
|
||||
|
||||
// Run a preview server and watch for file changes.
|
||||
exports.styleguide = gulp.series(styleguideServer, watch);
|
||||
|
||||
// Lint Sass and JavaScript sources.
|
||||
exports.lint = gulp.parallel(cssLint, jsLint);
|
||||
|
||||
// An alias to the 'build' task.
|
||||
exports.default = exports.build;
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
|
||||
from danse.settings import DJANGO_SETTINGS_MODULE
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Set the default settings module to use.
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', DJANGO_SETTINGS_MODULE)
|
||||
|
||||
try:
|
||||
from django.core.management import execute_from_command_line
|
||||
except ImportError:
|
||||
# The above import may fail for some other reason. Ensure that the
|
||||
# issue is really that Django is missing to avoid masking other
|
||||
# exceptions on Python 2.
|
||||
try:
|
||||
import django # noqa
|
||||
except ImportError:
|
||||
raise ImportError(
|
||||
"Couldn't import Django. Are you sure it's installed and "
|
||||
"available on your PYTHONPATH environment variable? Did you "
|
||||
"forget to activate a virtual environment?"
|
||||
)
|
||||
raise
|
||||
|
||||
execute_from_command_line(sys.argv)
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
"name": "danse",
|
||||
"version": "0.1.0",
|
||||
"description": "La carte d'un incroyable territoire chorégraphique",
|
||||
"author": "Cliss XXI <tech@cliss21.com>",
|
||||
"license": "AGPL-3.0+",
|
||||
"scripts": {
|
||||
"build": "gulp build",
|
||||
"lint": "gulp lint",
|
||||
"serve": "gulp serve",
|
||||
"styleguide": "gulp styleguide"
|
||||
},
|
||||
"dependencies": {
|
||||
"bootstrap": "github:twbs/bootstrap#05fb3f2",
|
||||
"fork-awesome": "~1.1.7",
|
||||
"popper.js": "~1.16.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.8.4",
|
||||
"@babel/preset-env": "^7.8.4",
|
||||
"autoprefixer": "^9.7.4",
|
||||
"babel-eslint": "^10.0.3",
|
||||
"babel-loader": "^8.0.6",
|
||||
"browser-sync": "^2.26.7",
|
||||
"eslint": "^6.7.2",
|
||||
"eslint-config-xo": "^0.27.2",
|
||||
"eslint-plugin-import": "^2.20.0",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-babel": "^8.0.0",
|
||||
"gulp-clean-css": "^4.2.0",
|
||||
"gulp-cli": "^2.2.0",
|
||||
"gulp-eslint": "^6.0.0",
|
||||
"gulp-imagemin": "^7.1.0",
|
||||
"gulp-load-plugins": "^2.0.1",
|
||||
"gulp-postcss": "^8.0.0",
|
||||
"gulp-rename": "^2.0.0",
|
||||
"gulp-sass": "^4.0.2",
|
||||
"gulp-sourcemaps": "^2.6.5",
|
||||
"gulp-stylelint": "^13.0.0",
|
||||
"gulp-terser": "^1.2.0",
|
||||
"gulp-touch-fd": "^2.0.0",
|
||||
"merge-stream": "^2.0.0",
|
||||
"rimraf": "^3.0.1",
|
||||
"style-sherpa": "^1.0.0",
|
||||
"stylelint": "^13.0.0",
|
||||
"stylelint-config-twbs-bootstrap": "^2.0.0",
|
||||
"vinyl-named": "^1.1.0",
|
||||
"webpack": "^4.41.2",
|
||||
"webpack-stream": "^5.2.1"
|
||||
},
|
||||
"private": true
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
[tool.black]
|
||||
line-length = 79
|
||||
skip-string-normalization = true
|
||||
exclude = '''
|
||||
/(
|
||||
\.git
|
||||
| venv
|
||||
| local
|
||||
| var
|
||||
| migrations
|
||||
| node_modules
|
||||
| assets
|
||||
)/
|
||||
| urls(|_.+|/.+).py
|
||||
'''
|
|
@ -0,0 +1,3 @@
|
|||
# This file is here because many Platforms as a Service look for
|
||||
# requirements.txt in the root directory of a project.
|
||||
-r requirements/production.txt
|
|
@ -0,0 +1,8 @@
|
|||
# Django
|
||||
# ------------------------------------------------------------------------------
|
||||
django >=2.2,<2.3 # https://www.djangoproject.com/
|
||||
django-environ ==0.4.5 # https://github.com/joke2k/django-environ
|
||||
|
||||
# Wagtail
|
||||
# ------------------------------------------------------------------------------
|
||||
wagtail >=2.7,<2.8 # https://wagtail.io
|
|
@ -0,0 +1,6 @@
|
|||
-r test.txt
|
||||
|
||||
# Django
|
||||
# ------------------------------------------------------------------------------
|
||||
django-debug-toolbar # https://github.com/jazzband/django-debug-toolbar
|
||||
django-extensions # https://github.com/django-extensions/django-extensions
|
|
@ -0,0 +1,3 @@
|
|||
-r base.txt
|
||||
|
||||
# PRECAUTION: avoid production dependencies that aren't in development.
|
|
@ -0,0 +1,17 @@
|
|||
-r base.txt
|
||||
|
||||
# Testing
|
||||
# ------------------------------------------------------------------------------
|
||||
pytest # https://github.com/pytest-dev/pytest
|
||||
pytest-sugar # https://github.com/Frozenball/pytest-sugar
|
||||
|
||||
# Code quality
|
||||
# ------------------------------------------------------------------------------
|
||||
black; python_version>'3.5' # https://github.com/python/black
|
||||
flake8 >=3.5.0 # https://github.com/pycqa/flake8
|
||||
isort # https://github.com/timothycrosley/isort
|
||||
pytest-cov # https://github.com/pytest-dev/pytest-cov
|
||||
|
||||
# Django
|
||||
# ------------------------------------------------------------------------------
|
||||
pytest-django # https://github.com/pytest-dev/pytest-django
|
Certains fichiers ne sont pas affichés car ce diff contient trop de modifications Voir plus
Chargement…
Référencer dans un nouveau ticket