aboutsummaryrefslogtreecommitdiff
path: root/Documentation
diff options
context:
space:
mode:
authorAlban Gruin2018-04-25 21:26:03 +0200
committerAlban Gruin2018-04-25 21:26:03 +0200
commit54c5dbb98293acea9b470808e5a35e99c004f265 (patch)
tree7fb350d07e2f2a4d687b00fd034e638bd02f8526 /Documentation
parent772caa72ce7f80bfeb5fbb1d05b57838dafd48c3 (diff)
parent5488a93bf2e04d2f19e287186011dcbb436a238b (diff)
Merge branch 'stable/0.13.z' into prod/pa1ch/0.y.z
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/.gitignore1
-rw-r--r--Documentation/Makefile20
-rw-r--r--Documentation/conf.py93
-rw-r--r--Documentation/dev/contribute.rst55
-rw-r--r--Documentation/dev/roadmap.rst20
-rw-r--r--Documentation/dev/xml.rst147
-rw-r--r--Documentation/index.rst76
-rw-r--r--Documentation/usage/commands/cleancourses.rst20
-rw-r--r--Documentation/usage/commands/listtimetables.rst26
-rw-r--r--Documentation/usage/commands/reparse.rst11
-rw-r--r--Documentation/usage/commands/timetables.rst44
-rw-r--r--Documentation/usage/installation.rst285
-rw-r--r--Documentation/usage/versions.rst35
13 files changed, 833 insertions, 0 deletions
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..683b981
--- /dev/null
+++ b/Documentation/conf.py
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+
+from datetime import datetime
+
+extensions = []
+templates_path = ['_templates']
+source_suffix = '.rst'
+master_doc = 'index'
+todo_include_todos = False
+
+# General information about the project.
+project = u'celcatsanitizer'
+year = datetime.now().year
+copyright = u'%d, Alban Gruin' % year
+author = u'Alban Gruin'
+
+version = u'0.13'
+release = u'0.13.0'
+
+language = 'fr'
+
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+pygments_style = 'sphinx'
+html_theme = 'alabaster'
+html_sidebars = {
+ '**': [
+ 'about.html',
+ 'navigation.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 ------------------------------------------
+
+# 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..ed6d44e
--- /dev/null
+++ b/Documentation/dev/contribute.rst
@@ -0,0 +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
+<ref-list>`. 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
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..a48a3d7
--- /dev/null
+++ b/Documentation/dev/xml.rst
@@ -0,0 +1,147 @@
+==================================
+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 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
+============
+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
+
+ <span id="1" date="16/10/2017" rawix="9" rawlen="1">
+ <description>Semaine 42, Semaine commençant le 16/10/2017</description>
+ <title>42</title>
+ <alleventweeks>NNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN</alleventweeks>
+ <day id="0">
+ <name>lundi</name>
+ <row id="0" />
+ <row id="1" />
+ <row id="2" />
+ <row id="3" />
+ <row id="4" />
+ <row id="5" />
+ <row id="6" /></day>
+ <day id="1">
+ <name>mardi</name>
+ <row id="0" />
+ <row id="1" />
+ <row id="2" />
+ <row id="3" />
+ <row id="4" />
+ <row id="5" /></day>
+ <day id="2">
+ <name>mercredi</name>
+ <row id="0" />
+ <row id="1" />
+ <row id="2" />
+ <row id="3" />
+ <row id="4" />
+ <row id="5" />
+ <row id="6" /></day>
+ <day id="3">
+ <name>jeudi</name>
+ <row id="0" />
+ <row id="1" />
+ <row id="2" />
+ <row id="3" />
+ <row id="4" />
+ <row id="5" /></day>
+ <day id="4">
+ <name>vendredi</name>
+ <row id="0" />
+ <row id="1" />
+ <row id="2" />
+ <row id="3" />
+ <row id="4" />
+ <row id="5" /></day></span>
+
+Vous voyez donc la date de début, le numéro de semaine, et la
+mystérieuse valeur ``<alleventweeks>``. Il s’agit d’un identifiant de
+semaine. La propriété ``id`` du ``<span>`` 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
+``<alleventweeks>`` comme clé, et le premier jour de la semaine comme
+valeur.
+
+Les cours
+=========
+Voici un exemple de cours :
+
+.. code:: xml
+
+ <event id="351687" timesort="07450945" colour="BEA7B8" ecs="4" ecc="11" er="0" scb="1">
+ <day>1</day>
+ <prettytimes>07:45-09:45 COURS/TD</prettytimes>
+ <starttime>07:45</starttime>
+ <endtime>09:45</endtime>
+ <category>COURS/TD</category>
+ <prettyweeks></prettyweeks>
+ <rawweeks>NNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN</rawweeks>
+ <resources>
+ <module title="Matière">
+ <item>EDINF3F1 - Algorithmique et programmation</item></module>
+ <group title="Groupe">
+ <item>L2 Info s1 TDA4</item></group>
+ <room title="Salle">
+ <item>1TP1-B08bis</item></room></resources></event>
+
+Les différents éléments sont :
+
+================= ===================== =============================
+Donnée indiquée Balise correspondante Plusieurs valeurs possibles ?
+================= ===================== =============================
+Nom du cours ``<module>`` Oui
+Groupes concernés ``<group>`` Oui
+Salles ``<room>`` Oui
+Type de cours ``<category>`` Non
+Heure de début ``<starttime>`` Non
+Heure de fin ``<endtime>`` Non
+Jour ``<day>`` Non
+Semaine ``<rawweeks>`` Non
+Remarque ``<notes>`` Non
+================= ===================== =============================
+
+Quand une donnée peut prendre plusieurs valeurs à la fois, les
+différentes valeurs se trouvent dans des balises
+``<item>``. 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 ``<rawweeks>``, on retrouve le début de la semaine
+correspondante à l’aide du :ref:`dictionnaire des semaines
+<ref-week-dict>`, et on ajoute autant de jours qu’indiqué par la
+balise ``<day>``.
diff --git a/Documentation/index.rst b/Documentation/index.rst
new file mode 100644
index 0000000..e793dd2
--- /dev/null
+++ b/Documentation/index.rst
@@ -0,0 +1,76 @@
+===============
+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é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
+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/cleancourses
+ usage/commands/listtimetables
+ usage/commands/reparse
+ usage/commands/timetables
+ usage/versions
+
+Développement
+=============
+
+.. toctree::
+ :maxdepth: 2
+
+ dev/contribute
+ dev/xml
+ dev/roadmap
diff --git a/Documentation/usage/commands/cleancourses.rst b/Documentation/usage/commands/cleancourses.rst
new file mode 100644
index 0000000..6e4f152
--- /dev/null
+++ b/Documentation/usage/commands/cleancourses.rst
@@ -0,0 +1,20 @@
+================
+``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 <ref-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
new file mode 100644
index 0000000..2455996
--- /dev/null
+++ b/Documentation/usage/installation.rst
@@ -0,0 +1,285 @@
+===============================
+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
+----------------------------
+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 :
+
+.. 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 gunicorn
+
+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).
+
+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 :doc:`la commande de mise à jour <commands/timetables>` 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/
+.. _nginx: https://nginx.org/en/
+
+Ajout des pages statiques
+=========================
+:ref:`Comme indiqué plus haut <ref-flatpages>`, 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..d6b8f00
--- /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 :doc:`reparse <commands/reparse>`
+ - Meilleure abstraction des templates, notamment de ``index.html``