===============================
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_ et LXML_, pour parser les emplois du temps en XML
 - icalendar_, pour générer des fichiers ICS_.

celcatsanitizer requiert Python 3.4 au minimum, et marche avec les
versions 3.5 et 3.6. Les versions antérieures de Python 3 n’ont pas
étés testées, et les versions supérieures devraient fonctionner sans
problèmes.

*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/
.. _LXML: https://lxml.de/
.. _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

Sélection du parseur
````````````````````
celcatsanitizer dispose d’un système de parseurs modulaires depuis la
:ref:`version 0.14 <ref-ver-0.14>`, et embarque par défaut deux
parseurs :

 - ``edt.management.parsers.ups2017``, pour le format utilisé par
   l’Université Paul Sabatier en 2017. C’est le parseur utilisé par
   défaut si aucun autre n’est spécifié. Ce parseur utilise
   BeautifulSoup4_.
 - ``edt.management.parsers.ups2018``, pour le format utilisé par
   l’Université Paul Sabatier en 2018. Ce parseur utilise LXML_ et
   exploite l’IO asynchrone de Python.

Pour spécifier le parseur à utiliser, il faut rajouter une variable
``CS_PARSER``, contenant le parseur à utiliser sous forme de chaîne de
caractères.  Pour utiliser le parseur
``edt.management.parsers.ups2018``, il faut donc rajouter cette
ligne :

.. code:: Python

    CS_PARSERS = "edt.management.parsers.ups2018"

Pour l’instant, le parseur est global. Il n’est pas encore possible
d’en spécifier un par source d’emploi du temps.

Vous **devez** vérifier le format des emplois du temps à parser, cette
étape est donc **obligatoire**.

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".