From 0eeba2b335807c8c19c2dbfd0463aa4df1375d0e Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Sun, 15 Apr 2018 21:46:47 +0200
Subject: doc: Début de la nouvelle documentation avec Sphinx
---
 Documentation/.gitignore             |   1 +
 Documentation/Makefile               |  20 +++
 Documentation/conf.py                | 170 ++++++++++++++++++++++
 Documentation/dev/contribute.rst     |   3 +
 Documentation/dev/internals.rst      |   3 +
 Documentation/dev/roadmap.rst        |  20 +++
 Documentation/dev/xml.rst            | 143 +++++++++++++++++++
 Documentation/index.rst              |  74 ++++++++++
 Documentation/usage/commands.rst     |  30 ++++
 Documentation/usage/installation.rst | 267 +++++++++++++++++++++++++++++++++++
 Documentation/usage/versions.rst     |  35 +++++
 11 files changed, 766 insertions(+)
 create mode 100644 Documentation/.gitignore
 create mode 100644 Documentation/Makefile
 create mode 100644 Documentation/conf.py
 create mode 100644 Documentation/dev/contribute.rst
 create mode 100644 Documentation/dev/internals.rst
 create mode 100644 Documentation/dev/roadmap.rst
 create mode 100644 Documentation/dev/xml.rst
 create mode 100644 Documentation/index.rst
 create mode 100644 Documentation/usage/commands.rst
 create mode 100644 Documentation/usage/installation.rst
 create mode 100644 Documentation/usage/versions.rst
(limited to 'Documentation')
diff --git a/Documentation/.gitignore b/Documentation/.gitignore
new file mode 100644
index 0000000..1d535b9
--- /dev/null
+++ b/Documentation/.gitignore
@@ -0,0 +1 @@
+_*/
diff --git a/Documentation/Makefile b/Documentation/Makefile
new file mode 100644
index 0000000..4c9ce86
--- /dev/null
+++ b/Documentation/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+SPHINXPROJ    = celcatsanitizer
+SOURCEDIR     = .
+BUILDDIR      = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
diff --git a/Documentation/conf.py b/Documentation/conf.py
new file mode 100644
index 0000000..bfd8e6a
--- /dev/null
+++ b/Documentation/conf.py
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+#
+# celcatsanitizer documentation build configuration file, created by
+# sphinx-quickstart on Mon Apr 16 12:10:54 2018.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'celcatsanitizer'
+copyright = u'2018, Alban Gruin'
+author = u'Alban Gruin'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = u'dev'
+# The full version, including alpha/beta/rc tags.
+release = u'dev'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = 'fr'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This patterns also effect to html_static_path and html_extra_path
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'alabaster'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#
+# html_theme_options = {}
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Custom sidebar templates, must be a dictionary that maps document names
+# to template names.
+#
+# This is required for the alabaster theme
+# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
+html_sidebars = {
+    '**': [
+        'about.html',
+        'navigation.html',
+        'relations.html',  # needs 'show_related': True theme option to display
+        'searchbox.html',
+    ]
+}
+
+
+# -- Options for HTMLHelp output ------------------------------------------
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'celcatsanitizerdoc'
+
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+    # The paper size ('letterpaper' or 'a4paper').
+    #
+    # 'papersize': 'letterpaper',
+
+    # The font size ('10pt', '11pt' or '12pt').
+    #
+    # 'pointsize': '10pt',
+
+    # Additional stuff for the LaTeX preamble.
+    #
+    # 'preamble': '',
+
+    # Latex figure (float) alignment
+    #
+    # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+latex_documents = [
+    (master_doc, 'celcatsanitizer.tex', u'celcatsanitizer Documentation',
+     u'Alban Gruin', 'manual'),
+]
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (master_doc, 'celcatsanitizer', u'celcatsanitizer Documentation',
+     [author], 1)
+]
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+    (master_doc, 'celcatsanitizer', u'celcatsanitizer Documentation',
+     author, 'celcatsanitizer', 'One line description of project.',
+     'Miscellaneous'),
+]
+
+
+
diff --git a/Documentation/dev/contribute.rst b/Documentation/dev/contribute.rst
new file mode 100644
index 0000000..faab4f5
--- /dev/null
+++ b/Documentation/dev/contribute.rst
@@ -0,0 +1,3 @@
+=======================================
+Guide de contribution à celcatsanitizer
+=======================================
diff --git a/Documentation/dev/internals.rst b/Documentation/dev/internals.rst
new file mode 100644
index 0000000..9800d06
--- /dev/null
+++ b/Documentation/dev/internals.rst
@@ -0,0 +1,3 @@
+=========================================
+Fonctionnement interne de celcatsanitizer
+=========================================
diff --git a/Documentation/dev/roadmap.rst b/Documentation/dev/roadmap.rst
new file mode 100644
index 0000000..a7db062
--- /dev/null
+++ b/Documentation/dev/roadmap.rst
@@ -0,0 +1,20 @@
+================
+Feuille de route
+================
+
+Version 0.14
+============
+ - Optimisation des requêtes en utilisant des fonctionnalités
+   spécifiques à PostgreSQL si nécessaire
+ - Remplacement du moteur de templates de Django par Jinja2_.
+
+.. _Jinja2: http://jinja.pocoo.org/
+
+Version 1.0
+===========
+ - Paquetage permettant l’installation par ``pip``.
+
+Futures fonctionnalités
+=======================
+ - Utilisation de l’aggrégat ``TruncWeek`` dès que Django le proposera
+   (*a priori*, dès la version 2.1).
diff --git a/Documentation/dev/xml.rst b/Documentation/dev/xml.rst
new file mode 100644
index 0000000..bb2ebd0
--- /dev/null
+++ b/Documentation/dev/xml.rst
@@ -0,0 +1,143 @@
+==================================
+Format des emplois du temps Celcat
+==================================
+
+Avant de pouvoir afficher les emplois du temps, il est nécessaire de
+parser les fichiers XML générés par Celcat.
+
+On a besoin de plusieurs informations concernant le cours :
+
+ - son nom ;
+ - son type ;
+ - sa semaine et son jour ;
+ - son début et sa fin ;
+ - son commentaire ;
+ - ses salles ;
+ - ses groupes ;
+
+Certaines de ces informations sont triviales à récupérer (comme son
+nom, son type, son commentaire…), mais d’autres (telles que son jour
+précis) est un peu plus délicat.
+
+Parser facilement le XML
+========================
+Pour traiter le XML facilement, celcatsanitizer utilise la fameuse
+librairie BeautifulSoup4. Pour récupérer le fichier, on utilise la
+librairie requests.
+
+Les semaines
+============
+La première chose à faire après avoir téléchargé le fichier est de
+récupérer la liste des semaines présentes. Les dates sont encodées
+d’une manière assez exotique :
+
+.. code:: xml
+
+    
+    Semaine 42, Semaine commençant le 16/10/2017
+    42
+    NNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+    
+    lundi
+    
+    
+    
+    
+    
+    
+    
+    
+    mardi
+    
+    
+    
+    
+    
+    
+    
+    mercredi
+    
+    
+    
+    
+    
+    
+    
+    
+    jeudi
+    
+    
+    
+    
+    
+    
+    
+    vendredi
+    
+    
+    
+    
+    
+    
+
+Vous voyez donc la date de début, le numéro de semaine, et la
+mystérieuse valeur ````. Il s’agit d’un identifiant de
+semaine. La propriété ``id`` du ```` ne semble pas être
+nécessaire pour comprendre le reste du fichier.
+
+.. _ref-week-dict:
+
+On va donc créer un tableau des semaines en se servant des
+```` comme clé, et le premier jour de la semaine comme
+valeur.
+
+Les cours
+=========
+Voici un exemple de cours :
+
+.. code:: xml
+
+    
+    1
+    07:45-09:45 COURS/TD
+    07:45
+    09:45
+    COURS/TD
+    
+    NNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+    
+    
+    - EDINF3F1 - Algorithmique et programmation
 
+    
+    - L2 Info s1 TDA4
 
+    
+    - 1TP1-B08bis
 
+
+Les différents éléments sont :
+
+================= ===================== =============================
+Donnée indiquée   Balise correspondante Plusieurs valeurs possibles ?
+================= ===================== =============================
+Nom du cours      ````          Oui
+Groupes concernés ````           Oui
+Salles            ````            Oui
+Type de cours     ````        Non
+Heure de début    ````       Non
+Heure de fin      ````         Non
+Jour              ````             Non
+Semaine           ````        Non
+Remarque          ````           Non
+================= ===================== =============================
+
+Quand une donnée peut prendre plusieurs valeurs à la fois, les
+différentes valeurs se trouvent dans des balises
+``- ``. celcatsanitizer traîte tous les groupes et toutes les
+salles, mais ne lis qu’un seul nom de cours.
+
+Dans l’exemple donné plus haut, il n’y a pas de champ remarque.
+
+Pour trouver le jours du cours, on prend la semaine référencée par la
+balise ````, on retrouve le début de la semaine
+correspondante à l’aide du :ref:`dictionnaire des semaines
+`, et on ajoute autant de jours qu’indiqué par la
+balise ````.
diff --git a/Documentation/index.rst b/Documentation/index.rst
new file mode 100644
index 0000000..92ad7b7
--- /dev/null
+++ b/Documentation/index.rst
@@ -0,0 +1,74 @@
+===============
+celcatsanitizer
+===============
+
+Présentation de celcatsanitizer
+===============================
+Qu’est-ce que celcatsanitizer ?
+-------------------------------
+
+celcatsanitizer est un outil basé sur Django_ permettant de reformater
+les emplois du temps générés par Celcat.
+
+Les emplois du temps, accessibles à travers un navigateur web,
+deviennent ainsi plus lisibles (notamment sur les appareils mobiles),
+plus rapides à charger et plus légères.
+
+Les pages générées par celcatsanitizer ont étées conçues pour être les
+plus légères possibles, tout en restant lisibles et fournies en
+informations. Les pages peuvent être chargées sans CSS, et peuvent
+êtres rendues sans problèmes par une large gamme de navigateurs.
+
+celcatsanitizer est aussi capable d’exporter les emplois du temps en
+ICS_.
+
+Le parseur de celcatsanitizer est optimisé pour les emplois du temps
+de l’Université Paul Sabatier, mais il est possible de le modifier. 
+
+Vous pouvez trouver une instance de celcatsanitizer à l’adresse
+https://edt.pa1ch.fr/. Cette instance utilise les emplois du temps de
+l’Université Paul Sabatier.
+
+.. _Django: https://www.django-project.com/
+.. _ICS: https://fr.wikipedia.org/wiki/ICalendar
+
+Qu’est-ce que n’est pas celcatsanitizer ?
+-----------------------------------------
+celcatsanitizer n’est pas capable de produire un emploi du temps de
+lui-même, seulement de reformater ceux produits par Celcat.
+
+Notes importantes
+-----------------
+Affiliation
+```````````
+celcatsanitizer est un projet mené par des étudiants. Il n’est soutenu
+d’aucune manière par Celcat ou l’Université Paul Sabatier.
+
+Licence
+```````
+celcatsanitizer est sous licence AGPL3_, ce qui signifie, entre
+autres, que toute modification de son code source **doit** être
+redistribuée.
+
+.. _AGPL3: https://www.gnu.org/licenses/agpl-3.0.fr.html
+
+Utilisation de celcatsanitizer
+==============================
+
+.. toctree::
+   :maxdepth: 2
+
+   usage/installation
+   usage/commands
+   usage/versions
+
+Développement
+=============
+
+.. toctree::
+   :maxdepth: 2
+
+   dev/contribute
+   dev/xml
+   dev/internals
+   dev/roadmap
diff --git a/Documentation/usage/commands.rst b/Documentation/usage/commands.rst
new file mode 100644
index 0000000..5dede31
--- /dev/null
+++ b/Documentation/usage/commands.rst
@@ -0,0 +1,30 @@
+================================================
+Manuel des commandes intégrées à celcatsanitizer
+================================================
+
+``cleancourses``
+================
+**ATTENTION : cette commande est irréversible.**
+
+Cette commande permet d’effacr tous les cours présents dans la base.
+
+``listtimetables``
+==================
+Affiche tous les emplois du temps présents dans la base de données,
+avec leur nom, leur source et leur identifiant interne dans la base de
+données.
+
+.. _ref-reparse:
+
+``reparse``
+===========
+Reparse les groupes dans la base de données.
+
+.. _ref-timetables:
+
+``timetables``
+==============
+Met à jour les emplois du temps présents dans la base de données.
+
+Il est fortement recommandé d’exécuter régulièrement cette commande
+:ref:`à l’aide d’une tâche cron `.     
diff --git a/Documentation/usage/installation.rst b/Documentation/usage/installation.rst
new file mode 100644
index 0000000..7290df1
--- /dev/null
+++ b/Documentation/usage/installation.rst
@@ -0,0 +1,267 @@
+===============================
+Installation de celcatsanitizer
+===============================
+
+Dépendances
+===========
+celcatsanitizer est écrit en Python 3. Il dépend des bibliothèques
+suivantes :
+
+ - `Django 2.0`_
+ - requests_, pour récupérer les emplois du temps en HTTP(S)
+ - BeautifulSoup4_, pour parser les emplois du temps en XML
+ - icalendar_, pour générer des fichiers ICS_.
+
+*A priori*, il est possible d’utiliser n’importe quel SGBD supporté
+par Django avec celcatsanitizer. Cependant, l’utilisation de
+PostgreSQL_ est fortement recommandée. Dans ce cas, vous aurez besoin
+d’installer le module psycopg2_.
+
+Pour l’instant, l’installation doit passer par git_.
+
+.. _Django 2.0: https://www.djangoproject.com/
+.. _requests: http://docs.python-requests.org/en/master/
+.. _BeautifulSoup4:
+  https://www.crummy.com/software/BeautifulSoup/bs4/doc/
+.. _icalendar: https://icalendar.readthedocs.io/en/latest/
+.. _ICS: https://fr.wikipedia.org/wiki/ICalendar
+.. _PostgreSQL: https://www.postgresql.org/
+.. _psycopg2: http://initd.org/psycopg/docs/install.html
+.. _git: https://git-scm.com/
+
+Notes sur Django
+----------------
+celcatsanitizer utilise des versions assez récentes de Django,
+notamment en ce qui concerne son ORM. Le passage de Django 1.10 à
+Django 1.11 s’est fait pour utiliser l’annotation ``ExtractWeek``, le
+passage de Django 1.11 à Django 2.0 pour utiliser l’attribut
+``distinct`` de l’aggrégat ``ArrayAgg``.
+
+celcatsanitizer passera à Django 2.1 lorsqu’il sortira pour utiliser
+l’annotation ``TruncWeek``, pour l’instant implémenté avec une requête
+SQL brute. Cette fonctionnalité ne sera nécessaire que pour les
+utilisateurs de PostgreSQL.
+
+Installation
+============
+Création de l’environnement virtuel
+-----------------------------------
+Cette étape est optionnelle, mais est tout de même fortement
+recommandée.
+
+Placez-vous dans le répertoire souhaité, installez l’environnement
+virtuel, puis activez-le :
+
+.. code:: shell
+
+    $ virtualenv -p python3 celcatsanitizer
+    $ cd celcatsanitizer
+    $ source bin/activate
+
+Il est possible que votre version de pip soit ancienne. Si vous le
+souhaitez, mettez-le à jour :
+
+.. code:: shell
+
+    $ pip install -U pip
+
+Installation des dépendances
+----------------------------
+
+.. code:: shell
+
+    $ pip install django beautifulsoup4 icalendar requests
+
+Si vous utilisez PostgreSQL, vous devez installer le module
+psycopg2 :
+
+.. code:: shell
+
+    $ pip install psycopg2
+
+Création du projet Django
+-------------------------
+
+.. code:: shell
+
+    $ django-admin startproject celcatsanitizer
+    $ cd celcatsanitizer
+
+Récupération des sources de celcatsanitizer
+-------------------------------------------
+
+.. code:: shell
+
+    $ git clone https://git.pa1ch.fr/alban/celcatsanitizer.git edt
+
+Pour la production, il est recommandé d’utiliser une version
+stable. Elles sont accessibles à travers les tags git.
+
+Configuration de Django
+=======================
+Avant de pouvoir lancer celcatsanitizer, vous allez devoir modifier
+quelques fichiers.
+
+``settings.py``
+---------------
+Dans le fichier ``celcatsanitizer/settings.py``, vous devrez renseigner
+plusieurs informations.
+
+Configuration des administrateurs
+`````````````````````````````````
+Vous pouvez retrouver la documentation de la variable ``ADMIN`` `sur le
+site de Django`__.
+
+Cette variable est **obligatoire**.
+
+__ https://docs.djangoproject.com/fr/2.0/ref/settings/#admins
+
+Configuration de la base de données
+```````````````````````````````````
+Vous pouvez retrouver la documentation relative à la configuration de
+la base de données `sur le site de Django`__.
+
+Cette étape est **obligatoire**.
+
+__ https://docs.djangoproject.com/fr/2.0/ref/settings/#databases
+
+Configuration du mode de Django
+```````````````````````````````
+Si jamais vous utilisez Django en production, vous **devez
+impérativement** mettre la valeur de la variable ``DEBUG`` à
+``False``.
+
+Ajout de celcatsanitizer à la liste des applications Django
+```````````````````````````````````````````````````````````
+Ajoutez la chaîne de caractère ``edt`` à la liste ``INSTALLED_APPS``.
+
+Cette étape est **obligatoire**.
+
+.. _ref-flatpages:
+
+Activation des flatpages
+````````````````````````
+celcatsanitizer se sert des flatpages pour rendre les pages "contact"
+et "à propos". Vous pouvez retrouver le guide d’installation `sur le
+site de Django`__. Effectuez uniquement les deux premières étapes,
+celcatsanitizer enregistre déjà une route pour les pages statiques, et
+la commande de l’étape 4 sera effectuée plus loin.
+
+Cette étape est **obligatoire**.
+
+__
+  https://docs.djangoproject.com/fr/2.0/ref/contrib/flatpages/#installation
+
+Gestion des fichiers statiques
+``````````````````````````````
+Si vous êtes en production, vous devez renseigner l’emplacement de
+vos fichiers statiques dans la variable ``STATIC_ROOT`` de la
+configuration de Django (vous pouvez retrouver la documentation
+correspondante sur le site de Django). Puis, exécutez la commande
+suivante :
+
+Cette étape est **obligatoire en production**, mais inutile en
+déboguage.
+
+Ajout du processeur de contexte de celcatsanitizer
+``````````````````````````````````````````````````
+Rajoutez la chaîne de caractères ``edt.views.ctx_processor`` à la
+liste ``context_processors`` dans la variable ``TEMPLATES``.
+
+Cette étape est **fortement recommandée**.
+
+Configuration de l’internationalisation
+```````````````````````````````````````
+Vous pouvez retrouver la documentation de l’internationalisation `sur
+le site de Django`__.
+
+Ce paramètre est **optionnel**.
+
+__ https://docs.djangoproject.com/fr/2.0/topics/i18n/
+
+``urls.py``
+-----------
+Dans le fichier ``celcatsanitizer/urls.py``, importez la fonction
+``django.conf.urls.include`` si elle ne l’est pas déjà, et rajouter
+``url(r'^', include("edt.urls"))`` à la *fin* de la liste
+``urlspatterns``.
+
+Cette étape est **obligatoire**.
+
+Derniers préparatifs
+====================
+Génération de la base de données
+--------------------------------
+Générez les migrations de Django et de celcatsanitizer, puis
+appliquez-les :
+
+.. code:: shell
+
+    $ ./manage.py makemigrations edt
+    $ ./manage.py migrate
+
+Collection des fichiers statiques
+---------------------------------
+Si vous êtes en production, il faut regrouper les fichiers
+statiques. Pour ce faire, exécutez la commande suivante :
+
+.. code:: shell
+
+    $ ./manage.py collectstatic
+
+Cette étape est **obligatoire** en production, mais inutile en
+déboguage.
+
+Création d’un super-utilisateur
+-------------------------------
+Pour pouvoir accéder à l’interface d’administration, il est important
+de créer un super-utilisateur. Pour cela, exécutez la commande
+suivante :
+
+.. code:: shell
+
+    $ ./manage.py createsuperuser
+
+Répondez ensuite aux questions posées.
+
+Cette étape est **fortement recommandée**.
+
+.. _ref-cron:
+
+Cron
+----
+Pour mettre à jour les emplois du temps de manière régulière, il faut
+rajouter :ref:`la commande de mise à jour ` dans une
+tâche cron.
+
+Lancement
+=========
+En mode de déboguage
+--------------------
+Exécutez tout simplement la commande suivante :
+
+.. code:: shell
+
+    $ ./manage.py runserver
+
+En production
+-------------
+Le serveur intégré à Django n’est pas adapté pour un usage en
+production. Il vaut mieux utiliser Apache avec mod_wsgi, ou avec un
+serveur gunicorn_ derrière nginx.
+
+.. _gunicorn: https://gunicorn.org/
+
+Ajout des pages statiques
+=========================
+:ref:`Comme indiqué plus haut `, celcatsanitizer fait
+appel aux flatpages de Django.
+
+À l’aide de l’interface d’administration de Django (si votre instance
+se trouve à l’adresse ``example.com``, vous pourrez y accéder à
+l’adresse ``example.com/admin``), dans la section "pages statiques",
+rajoutez les pages ``/a-propos/`` et ``/contact/``.
+
+Si vous êtes en production, changez le site de base (``example.com``)
+par le site sur lequel se trouvera votre instance de celcatsanitizer,
+trouvable dans la section "sites".
diff --git a/Documentation/usage/versions.rst b/Documentation/usage/versions.rst
new file mode 100644
index 0000000..0f354bc
--- /dev/null
+++ b/Documentation/usage/versions.rst
@@ -0,0 +1,35 @@
+================
+Notes de version
+================
+
+Version 0.13
+============
+Changements externes
+--------------------
+ - Ajout de l’emploi du temps des salles
+ - Ajout d’une fonctionnalité permettant de connaître les salles
+   disponibles
+ - Améliorations de la navigabilité du site
+
+   - Ajout de liens pour revenir en arrière sur le site
+   - Ajout de liens pour parcourir les semaines de l’emploi du temps
+
+ - Les groupes qui n’ont plus de cours du tout ne sont plus affichés
+ - Ajout d’une page contenant la liste complète des groupes
+ - Ajout d’une page contenant la liste complète des semaines de cours
+   pour les groupes et les salles
+ - Ajout d’un texte de description sur la page des ICS
+ - Création de la documentation
+
+Changements internes
+--------------------
+ - Passage à Django 2.0
+
+   - Utilisation des routes ``path()`` au lieu de ``url()``
+
+ - Création d’une table ``Source`` pour stocker la source des emplois
+   du temps. Cela permet d’éviter de récupérer plusieurs fois le même
+   fichier et d’éviter les doublons sur les emplois du temps des
+   salles.
+ - Ajout de la commande :ref:`reparse `
+ - Meilleure abstraction des templates, notamment de ``index.html``
-- 
cgit v1.2.1
From b6e146c48fa3c25e419bc0458e423cbef3dee133 Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Sun, 22 Apr 2018 12:07:56 +0200
Subject: doc: documentation des commandes administratives
---
 Documentation/index.rst                         |  5 ++-
 Documentation/usage/commands.rst                | 30 -----------------
 Documentation/usage/commands/cleancourses.rst   | 21 ++++++++++++
 Documentation/usage/commands/listtimetables.rst | 26 +++++++++++++++
 Documentation/usage/commands/reparse.rst        | 11 +++++++
 Documentation/usage/commands/timetables.rst     | 44 +++++++++++++++++++++++++
 Documentation/usage/installation.rst            |  4 +--
 Documentation/usage/versions.rst                |  2 +-
 8 files changed, 109 insertions(+), 34 deletions(-)
 delete mode 100644 Documentation/usage/commands.rst
 create mode 100644 Documentation/usage/commands/cleancourses.rst
 create mode 100644 Documentation/usage/commands/listtimetables.rst
 create mode 100644 Documentation/usage/commands/reparse.rst
 create mode 100644 Documentation/usage/commands/timetables.rst
(limited to 'Documentation')
diff --git a/Documentation/index.rst b/Documentation/index.rst
index 92ad7b7..c9e0b2a 100644
--- a/Documentation/index.rst
+++ b/Documentation/index.rst
@@ -59,7 +59,10 @@ Utilisation de celcatsanitizer
    :maxdepth: 2
 
    usage/installation
-   usage/commands
+   usage/commands/cleancourses
+   usage/commands/listtimetables
+   usage/commands/reparse
+   usage/commands/timetables
    usage/versions
 
 Développement
diff --git a/Documentation/usage/commands.rst b/Documentation/usage/commands.rst
deleted file mode 100644
index 5dede31..0000000
--- a/Documentation/usage/commands.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-================================================
-Manuel des commandes intégrées à celcatsanitizer
-================================================
-
-``cleancourses``
-================
-**ATTENTION : cette commande est irréversible.**
-
-Cette commande permet d’effacr tous les cours présents dans la base.
-
-``listtimetables``
-==================
-Affiche tous les emplois du temps présents dans la base de données,
-avec leur nom, leur source et leur identifiant interne dans la base de
-données.
-
-.. _ref-reparse:
-
-``reparse``
-===========
-Reparse les groupes dans la base de données.
-
-.. _ref-timetables:
-
-``timetables``
-==============
-Met à jour les emplois du temps présents dans la base de données.
-
-Il est fortement recommandé d’exécuter régulièrement cette commande
-:ref:`à l’aide d’une tâche cron `.     
diff --git a/Documentation/usage/commands/cleancourses.rst b/Documentation/usage/commands/cleancourses.rst
new file mode 100644
index 0000000..4ca60b0
--- /dev/null
+++ b/Documentation/usage/commands/cleancourses.rst
@@ -0,0 +1,21 @@
+================
+``cleancourses``
+================
+
+``cleancourses`` permet d’effacer des cours présents dans la base de
+données. Il peut soit s’agir de tous les cours ou des cours d’une
+seule source.
+
+**ATTENTION : cette commande est irréversible.**
+
+
+Utilisation
+===========
+
+.. code:: shell
+
+   $ ./manage.py cleancourses [--source id]
+
+``--source`` permet de spécifier la suppression des cours provenant
+d’une seule source. ``id`` correspond à l’ID de la source, trouvable
+à l’aide de la commande :doc:`listtimetables`.
diff --git a/Documentation/usage/commands/listtimetables.rst b/Documentation/usage/commands/listtimetables.rst
new file mode 100644
index 0000000..94485b6
--- /dev/null
+++ b/Documentation/usage/commands/listtimetables.rst
@@ -0,0 +1,26 @@
+==================
+``listtimetables``
+==================
+
+``listtimetables`` affiche tous les emplois du temps présents dans la
+base de données, avec leur nom, leur source et leur identifiant
+interne dans la base de données.
+
+Utilisation
+===========
+.. code:: shell
+
+    $ ./manage.py listtimetables
+
+Format de sortie
+================
+Cette commande affiche les sources avec leur URL et leur ID interne
+(utilisable avec la commande :doc:`cleancourses`), ainsi que la liste
+des emplois du temps associés à cette source.
+
+Exemple de sortie
+-----------------
+::
+
+    L1 Info, L1 Miashs      : https://edt.univ-tlse3.fr/FSI/2017_2018/L1/L1_SN/g222621.xml (id: 3)
+    L2 Info : https://edt.univ-tlse3.fr/FSI/2017_2018/L2/L2_Info/g224636.xml (id: 13)
diff --git a/Documentation/usage/commands/reparse.rst b/Documentation/usage/commands/reparse.rst
new file mode 100644
index 0000000..78a54b7
--- /dev/null
+++ b/Documentation/usage/commands/reparse.rst
@@ -0,0 +1,11 @@
+===========
+``reparse``
+===========
+
+``reparse`` reparse tous les groupes dans la base de données.
+
+Utilisation
+===========
+.. code:: shell
+
+    $ ./manage.py reparse
diff --git a/Documentation/usage/commands/timetables.rst b/Documentation/usage/commands/timetables.rst
new file mode 100644
index 0000000..723b5aa
--- /dev/null
+++ b/Documentation/usage/commands/timetables.rst
@@ -0,0 +1,44 @@
+==============
+``timetables``
+==============
+
+``timetables`` met à jour les emplois du temps présents dans la base
+de données.
+
+Il est fortement recommandé d’exécuter régulièrement cette commande
+:ref:`à l’aide d’une tâche cron `.
+
+Utilisation
+===========
+.. code:: shell
+
+    $ ./manage.py timetables [--all] [--force] [--week week] [--year year]
+
+Par défaut, ``timetables`` met à jour seulement la semaine courante ou
+à venir le week-end, et ne met pas à jour si la dernière mise à jour
+présente dans la base de données est plus récente que celle présente
+dans la source. Les différents paramètres permettent de contrôler ce
+comportement :
+
+``--all`` permet de mettre à jour toutes les semaines présentes dans
+la source.
+
+``--force`` force la mise à jour, même si la dernière mise à jour des
+emplois du temps présente dans la base de données est plus récente que
+celle présente dans la source.
+
+``--week`` permet de spécifier la semaine à mettre à jour.
+
+``--year`` permet de spécifier l’année à mettre à jour.
+
+Comportement
+============
+Pour chaque emploi du temps, ``timetables`` récupère la source,
+supprime les cours sur la période couverte par cette mise à jour,
+parse la source et insère les cours dans la base de données.
+
+Cette mise à jour est effectuée de manière transactionnelle : si la
+mise à jour d’une source échoue au milieu du processus, les données
+supprimées au début seront entièrement restaurées, les données
+rajoutées seront supprimées, et une erreur sera affichée. Cela
+n’affecte pas la mise à jour des autres emplois du temps.
diff --git a/Documentation/usage/installation.rst b/Documentation/usage/installation.rst
index 7290df1..e3ae9e9 100644
--- a/Documentation/usage/installation.rst
+++ b/Documentation/usage/installation.rst
@@ -231,8 +231,8 @@ Cette étape est **fortement recommandée**.
 Cron
 ----
 Pour mettre à jour les emplois du temps de manière régulière, il faut
-rajouter :ref:`la commande de mise à jour ` dans une
-tâche cron.
+rajouter :doc:`la commande de mise à jour ` dans
+une tâche cron.
 
 Lancement
 =========
diff --git a/Documentation/usage/versions.rst b/Documentation/usage/versions.rst
index 0f354bc..d6b8f00 100644
--- a/Documentation/usage/versions.rst
+++ b/Documentation/usage/versions.rst
@@ -31,5 +31,5 @@ Changements internes
    du temps. Cela permet d’éviter de récupérer plusieurs fois le même
    fichier et d’éviter les doublons sur les emplois du temps des
    salles.
- - Ajout de la commande :ref:`reparse `
+ - Ajout de la commande :doc:`reparse `
  - Meilleure abstraction des templates, notamment de ``index.html``
-- 
cgit v1.2.1
From 236df1e91d5b00fcd19a47ba886721951337aa82 Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Sun, 22 Apr 2018 15:27:45 +0200
Subject: doc: reformulation d’un paragraphe
---
 Documentation/dev/xml.rst | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)
(limited to 'Documentation')
diff --git a/Documentation/dev/xml.rst b/Documentation/dev/xml.rst
index bb2ebd0..a48a3d7 100644
--- a/Documentation/dev/xml.rst
+++ b/Documentation/dev/xml.rst
@@ -13,7 +13,7 @@ On a besoin de plusieurs informations concernant le cours :
  - son début et sa fin ;
  - son commentaire ;
  - ses salles ;
- - ses groupes ;
+ - ses groupes.
 
 Certaines de ces informations sont triviales à récupérer (comme son
 nom, son type, son commentaire…), mais d’autres (telles que son jour
@@ -21,9 +21,13 @@ précis) est un peu plus délicat.
 
 Parser facilement le XML
 ========================
-Pour traiter le XML facilement, celcatsanitizer utilise la fameuse
-librairie BeautifulSoup4. Pour récupérer le fichier, on utilise la
-librairie requests.
+Pour récupérer les fichiers à distance, celcatsanitizer utilise la
+bibliothèque requests_, et se sert de BeautifulSoup4_ pour parser les
+fichiers XML.
+
+.. _BeautifulSoup4:
+  https://www.crummy.com/software/BeautifulSoup/bs4/doc/
+.. _requests: http://docs.python-requests.org/en/master/
 
 Les semaines
 ============
-- 
cgit v1.2.1
From 99025660d1d5d36fb374159b505ee29884faaab7 Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Sun, 22 Apr 2018 15:57:37 +0200
Subject: doc: Guide de contribution
---
 Documentation/dev/contribute.rst | 52 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)
(limited to 'Documentation')
diff --git a/Documentation/dev/contribute.rst b/Documentation/dev/contribute.rst
index faab4f5..ed6d44e 100644
--- a/Documentation/dev/contribute.rst
+++ b/Documentation/dev/contribute.rst
@@ -1,3 +1,55 @@
 =======================================
 Guide de contribution à celcatsanitizer
 =======================================
+
+.. _ref-list:
+
+Liste de diffusion
+==================
+Le développement se déroule sur la liste de diffusion
+``celcatsanitizer [arobase] framalistes [point] org``. Attention, les
+messages de cette liste sont archivés publiquement.
+
+Dépôt
+=====
+Le dépôt se trouve à l’adresse
+https://git.pa1ch.fr/alban/celcatsanitizer.git. Clonez-le en local à
+l’aide de git_.
+
+Bien que la forge logicielle supporte les *issues* et les *pull
+requests*, ces fonctionnalités ne sont pas utilisées pour le
+développement de celcatsanitizer.
+
+.. _git: https://git-scm.com/
+
+Sur quelle branche travailler ?
+===============================
+Pour réaliser des correctifs de bogue dans une version stable,
+effectuez vos changements sur la branche ``master``. Ne rajoutez pas
+de nouvelle fonctionnalité ou ne changez pas la structure de la base
+de données sur cette branche.
+
+Pour rajouter de nouvelles fonctionnalités, effectuez vos changements
+sur la branche ``futur``. Contactez l’équipe de développement pour
+avoir un avis.
+
+Si jamais vous voulez corriger un bogue sur la branche ``futur`` et
+que la branche ``master`` est aussi affecté, n’hésitez-pas à le
+rétro-porter.
+
+N’oubliez pas de `signer vos commits`_ (avec ``Signed-off-by:``). Si
+vos patches sont conséquents, n’hésitez pas à rajouter votre nom au
+*copyright*.
+
+.. _signer vos commits:
+  https://git-scm.com/docs/git-commit#git-commit--s
+
+Envoyer les patches
+===================
+Envoyez vos patches sur :ref:`la liste de diffusion
+`. Formattez vos patches avec git-format-patches_ et
+envoyez-les avec git-send-email_. Rebasez vos changements si
+nécessaire.
+
+.. _git-format-patches: https://git-scm.com/docs/git-format-patch
+.. _git-send-email: https://git-scm.com/docs/git-send-email
-- 
cgit v1.2.1
From 1ca0575a0633d281b9dc2ca10b7c0ad2fded86a7 Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Sun, 22 Apr 2018 18:42:14 +0200
Subject: doc: finalisation
---
 Documentation/conf.py           | 99 +++++------------------------------------
 Documentation/dev/internals.rst |  3 --
 Documentation/index.rst         |  1 -
 3 files changed, 11 insertions(+), 92 deletions(-)
 delete mode 100644 Documentation/dev/internals.rst
(limited to 'Documentation')
diff --git a/Documentation/conf.py b/Documentation/conf.py
index bfd8e6a..69020ab 100644
--- a/Documentation/conf.py
+++ b/Documentation/conf.py
@@ -1,114 +1,40 @@
 # -*- coding: utf-8 -*-
-#
-# celcatsanitizer documentation build configuration file, created by
-# sphinx-quickstart on Mon Apr 16 12:10:54 2018.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
 
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+from datetime import datetime
 
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
+extensions = []
+templates_path = ['_templates']
 source_suffix = '.rst'
-
-# The master toctree document.
 master_doc = 'index'
+todo_include_todos = False
 
 # General information about the project.
 project = u'celcatsanitizer'
-copyright = u'2018, Alban Gruin'
+year = datetime.now().year
+copyright = u'%d, Alban Gruin' % year
 author = u'Alban Gruin'
 
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
 version = u'dev'
-# The full version, including alpha/beta/rc tags.
 release = u'dev'
 
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
 language = 'fr'
 
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
 exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
 
-# The name of the Pygments (syntax highlighting) style to use.
 pygments_style = 'sphinx'
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-#
 html_theme = 'alabaster'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-#
-# html_theme_options = {}
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# Custom sidebar templates, must be a dictionary that maps document names
-# to template names.
-#
-# This is required for the alabaster theme
-# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
 html_sidebars = {
     '**': [
         'about.html',
         'navigation.html',
-        'relations.html',  # needs 'show_related': True theme option to display
-        'searchbox.html',
     ]
 }
 
+html_theme_options = {
+    'description': "Un outil pour reformater les emplois du temps de Celcat",
+    'extra_nav_links': {"Sources":
+                        "https://git.pa1ch.fr/alban/celcatsanitizer"},
+}
 
 # -- Options for HTMLHelp output ------------------------------------------
 
@@ -165,6 +91,3 @@ texinfo_documents = [
      author, 'celcatsanitizer', 'One line description of project.',
      'Miscellaneous'),
 ]
-
-
-
diff --git a/Documentation/dev/internals.rst b/Documentation/dev/internals.rst
deleted file mode 100644
index 9800d06..0000000
--- a/Documentation/dev/internals.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-=========================================
-Fonctionnement interne de celcatsanitizer
-=========================================
diff --git a/Documentation/index.rst b/Documentation/index.rst
index c9e0b2a..992db09 100644
--- a/Documentation/index.rst
+++ b/Documentation/index.rst
@@ -73,5 +73,4 @@ Développement
 
    dev/contribute
    dev/xml
-   dev/internals
    dev/roadmap
-- 
cgit v1.2.1
From ea38d01d76f695d529284c841fe9ba7f441bad1b Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Mon, 23 Apr 2018 12:03:00 +0200
Subject: doc: corrections de grammaire
---
 Documentation/index.rst                       | 2 +-
 Documentation/usage/commands/cleancourses.rst | 1 -
 Documentation/usage/installation.rst          | 3 +--
 3 files changed, 2 insertions(+), 4 deletions(-)
(limited to 'Documentation')
diff --git a/Documentation/index.rst b/Documentation/index.rst
index 992db09..e793dd2 100644
--- a/Documentation/index.rst
+++ b/Documentation/index.rst
@@ -12,7 +12,7 @@ les emplois du temps générés par Celcat.
 
 Les emplois du temps, accessibles à travers un navigateur web,
 deviennent ainsi plus lisibles (notamment sur les appareils mobiles),
-plus rapides à charger et plus légères.
+plus rapides à charger et plus légers.
 
 Les pages générées par celcatsanitizer ont étées conçues pour être les
 plus légères possibles, tout en restant lisibles et fournies en
diff --git a/Documentation/usage/commands/cleancourses.rst b/Documentation/usage/commands/cleancourses.rst
index 4ca60b0..6e4f152 100644
--- a/Documentation/usage/commands/cleancourses.rst
+++ b/Documentation/usage/commands/cleancourses.rst
@@ -8,7 +8,6 @@ seule source.
 
 **ATTENTION : cette commande est irréversible.**
 
-
 Utilisation
 ===========
 
diff --git a/Documentation/usage/installation.rst b/Documentation/usage/installation.rst
index e3ae9e9..795d4a9 100644
--- a/Documentation/usage/installation.rst
+++ b/Documentation/usage/installation.rst
@@ -157,8 +157,7 @@ Gestion des fichiers statiques
 Si vous êtes en production, vous devez renseigner l’emplacement de
 vos fichiers statiques dans la variable ``STATIC_ROOT`` de la
 configuration de Django (vous pouvez retrouver la documentation
-correspondante sur le site de Django). Puis, exécutez la commande
-suivante :
+correspondante sur le site de Django).
 
 Cette étape est **obligatoire en production**, mais inutile en
 déboguage.
-- 
cgit v1.2.1
From 8a533b6f86dc3315c3359f9e0df7af360b698a48 Mon Sep 17 00:00:00 2001
From: Alban Gruin
Date: Mon, 23 Apr 2018 16:22:50 +0200
Subject: doc: ajout de la méthode d’installation avec requirements.txt
---
 Documentation/usage/installation.rst | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)
(limited to 'Documentation')
diff --git a/Documentation/usage/installation.rst b/Documentation/usage/installation.rst
index 795d4a9..2455996 100644
--- a/Documentation/usage/installation.rst
+++ b/Documentation/usage/installation.rst
@@ -67,17 +67,35 @@ souhaitez, mettez-le à jour :
 
 Installation des dépendances
 ----------------------------
+Vous pouvez demander à ``pip`` d’installer les dépendances à partir du
+fichier ``requirements.txt`` présent dans le dépôt :
+
+.. code:: shell
+
+    $ pip install -r requirements.txt
+
+Cette commande installera aussi ``psycopg2-binary`` et ``gunicorn``.
+
+Il est aussi possible d’installer les dépendances à la main :
 
 .. code:: shell
 
     $ pip install django beautifulsoup4 icalendar requests
 
 Si vous utilisez PostgreSQL, vous devez installer le module
-psycopg2 :
+psycopg2 :
+
+.. code:: shell
+
+    $ pip install psycopg2-binary
+
+Si vous êtes en production, il est recommandé d’utiliser gunicorn_ si
+vous n’utilisez pas le serveur Apache. Installez-le de la même
+manière :
 
 .. code:: shell
 
-    $ pip install psycopg2
+    $ pip install gunicorn
 
 Création du projet Django
 -------------------------
@@ -247,9 +265,10 @@ En production
 -------------
 Le serveur intégré à Django n’est pas adapté pour un usage en
 production. Il vaut mieux utiliser Apache avec mod_wsgi, ou avec un
-serveur gunicorn_ derrière nginx.
+serveur gunicorn_ derrière nginx_.
 
 .. _gunicorn: https://gunicorn.org/
+.. _nginx: https://nginx.org/en/
 
 Ajout des pages statiques
 =========================
-- 
cgit v1.2.1