# Principales dépendances

  • Python 3.6
  • Django 3 pour le site
  • PostgreSQL pour la base de données
  • PuLP pour la modélisation en ILP (Integer Linear Programming)
  • Un solveur de ILP, e.g. CBC, Gurobi
  • Redis pour le cache de Django (optionnel)

# Obtention de flop

# Installation préalables

# Vi

Pour visualiser et éditer des fichiers

sudo apt install vi

# Git

sudo apt install git

# Éventuellement Python

sudo apt install python3.7 python3.7-minimal python3.7-venv python3-pip python3-virtualenv virtualenv

# Création d'un utilisateur dédié

On peut éventuellement créer un utilisateur dédié pour flop, que l'on nommera fedt. Dans la suite, on supposera que vous êtes l'utilisateur fedt ; si ce n'est pas le cas, remplacer toutes les occurrences de fedt par votre nom d'utilisateur.

On crée un utilisateur unix :

sudo addgroup fedt  # On crée le groupe

puis on crée l'utilisateur avec les options :

* -c : commentaire
* -d : indique le home de l'utilisateur
* -g : indique le groupe de l'utilisateur
* -r : crée un compte système
* -m : crée le répertoire home de l'utilisateur
* -s : défini le shell de l'utilisateur
sudo useradd -c "Utilisateur de FlOpEDT" -d /home/fedt -s /bin/bash -m -g fedt -r fedt

# Récupération des sources du logiciel

On se connecte éventuellement avec le compte fedt :

sudo -i -u fedt

On se place dans le répertoire de l'utilisateur fedt

cd /home/fedt

On récupère le dépôt git :

git clone https://framagit.org/flopedt/FlOpEDT.git

On se déplace dans le répertoire :

cd FlOpEDT/

On change de branche pour passer sur celle de développement :

git checkout dev

# Installation et lancement sous docker

# Installation de docker

Installer docker et docker-compose. sudo apt install docker docker-compose

# Lancement de l'application sous docker

Lancer la commande suivante :

make start (make stop pour arrêter l'application)

(En cas de

ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

songez à une exécution en sudo.)

L'application sera accessible à l'adresse http://localhost:8000.

Vous pouvez importer les données d'exemple contenues dans le fichier dump.json.bz2 (qui est une base pour jouer avec l'interface) avec la commande :

make init

Vous pourrez alors vous connecter avec l'utilisateur MOI et le mot de passe passe. Cet utilisateur possède les droits associés aux responsables des emplois du temps. Pour la vision d'une personne enseignante classique, utiliser l'un des autres login (En fait, tous les utilisateurs ont le même mot de passe passe !).

Deux exemples de configuration sont disponibles pour exécuter l'application avec Docker : development et production. La configuration development est utilisée par défaut par les cibles du fichier Makefile. Pour utiliser la configuration production, les deux étapes suivantes sont nécessaires :

  • CONFIG=production make install
  • CONFIG=production make [build|init|start|stop]

# Installation et lancement sans docker

# Configuration de l'environnement virtuel python

On utilise la commande suivante :

virtualenv -p /usr/bin/python3.7 venv

On utilise ce virtualenv :

source venv/bin/activate

On met à jour PIP :

pip3 install --upgrade pip
  Requirement already up-to-date: pip in ./venv/lib/python3.7/site-packages (20.0.2)

On installe les modules python3 nécessaires :

pip3 install -r requirements.txt

On installe également :

pip3 install python-memcached
pip3 install ipython
pip3 install daphne

On sort de l'environnement virtuel :

deactivate

# Mise en place de la base de données

On installe le système de gestion de bases de données postgreSQL :

sudo apt install postgresql

On utilise le compte postgres :

sudo -i -u postgres

On va utiliser psql pour créer la base de données :

psql                                            # On lance la commande psql
postgres=# CREATE USER flop_user WITH PASSWORD 'xxxxxxxxxxxxxxxxx'; # On crée l'utilisateur flop_user
postgres=# CREATE DATABASE flop_db_yyyyyyyyyyyy WITH OWNER flop_user;  # On crée la base de données
postgres=# \q                              # On quitte l'invite de commande psql

On édite ensuite le fichier de configuration de Django /home/fedt/FlOpEDT/FlOpEDT/FlOpEDT/settings/local.py avec les bonnes valeurs.

# Installation d'un solveur de programme linéaire en nombres entiers

Pour générer des emplois du temps qui satisfont les contraintes, il est nécessaire d'installer un solveur de programme linéaire en nombres entiers. Il en existe plusieurs, libres ou propriétaires, et il suffit d'en installer un.

# CBC -- Common Public License

On installe le paquet suivant :

sudo apt install coinor-cbc

# Gurobi -- Propriétaire

Attention : Gurobi n'est pas gratuit, il nécessite une licence d'utilisation.

# Création d'un compte sur le site de l'éditeur

Pour obtenir une licence académique, il faut créer un compte sur le site de l'éditeur. Il faut ensuite télécharger l'archive compressé du logiciel gurobi sur le site de l'éditeur. Une fois le lien récupéré, on peut télécharger le logiciel sur le serveur :

cd /usr/local/src
wget "https://packages.gurobi.com/9.0/gurobi9.0.2_linux64.tar.gz"

# Installation de Gurobi

En tant que root, on décompresse l'archive :

tar xzf gurobi9.0.2_linux64.tar.gz

On déplace le répertoire dans /home/fedt pour éviter des problèmes de droits, mais le logiciel pourrait très bien être installé de manière globale.

mv gurobi902/ /home/fedt/

On modifie les droits sur le répertoire :

chown -R fedt:fedt /home/fedt/gurobi902

# Activation de la licence

On récupère la commande à taper sur le site de l'éditeur. On se déplace ensuite dans le répertoire où sont stockés les fichiers exécutables :

sudo -i -u fedt
cd gurobi902/linux64/bin

On exécute la commande pour activer la licence :

./grbgetkey 9da552dc-8085-11ea-ae9e-020d093b5256

La commande devrait vous demander ou stocker la licence, si vous ne modifiez rien, vous devriez obtenir ceci :

info  : grbgetkey version 9.0.2, build v9.0.2rc0
info  : Contacting Gurobi key server...
info  : Key for license ID 439793 was successfully retrieved
info  : License expires at the end of the day on 2020-06-16
info  : Saving license key...

In which directory would you like to store the Gurobi license key file?
[hit Enter to store it in /home/fedt]: 

info  : License 439793 written to file /home/fedt/gurobi.lic

Important : Les licences académiques ne durent que 3 mois, renouvelables !!!

# Installation du module python pour Gurobi

Il faut au préalable s'assurer d'avoir deux fichiers :

  • .bashrc
  • .profile

Suivant comment vous avez créé l'utilisateur fedt, ces fichiers peuvent être absents, vous pouvez les copier avec les commandes :

sudo -i -u fedt
cp /etc/skel/.bashrc .
cp /etc/skel/.profile .

Il faut ensuite éditer le fichier .bashrc et ajouter :

# Gurobi 
export GUROBI_HOME="/home/fedt/gurobi902/linux64"
export PATH="${PATH}:${GUROBI_HOME}/bin"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${GUROBI_HOME}/lib"

On peut forcer le chargement du fichier .bashrc (pour éviter de se reconnecter) :

source .bashrc

On peut désormais installer le module python pour gurobi :

cd FlOpEDT/                # On se déplace dans le répertoire FlOpEDT pour charger notre environnement virtuel python
source venv/bin/activate   # On charge l'environnement virtuel python
cd                         # On revient à la racine de notre 'home'
cd gurobi902/linux64/      # On se déplace dans le répertoire ou est stocké le fichier d'installation du module python
python3.7 setup.py install # On lance l'installation

Vous devriez obtenir ceci :

 running install
 running build
 running build_py
 creating build
 creating build/lib
 creating build/lib/gurobipy
 copying lib/python3.7_utf32/gurobipy/__init__.py -> build/lib/gurobipy
 copying lib/python3.7_utf32/gurobipy/gurobipy.so -> build/lib/gurobipy
 running install_lib
 creating /home/fedt/FlOpEDT/venv/lib/python3.7/site-packages/gurobipy
 copying build/lib/gurobipy/gurobipy.so -> /home/fedt/FlOpEDT/venv/lib/python3.7/site-packages/gurobipy
 copying build/lib/gurobipy/__init__.py -> /home/fedt/FlOpEDT/venv/lib/python3.7/site-packages/gurobipy
 byte-compiling /home/fedt/FlOpEDT/venv/lib/python3.7/site-packages/gurobipy/__init__.py to __init__.cpython-37.pyc
 running install_egg_info
 Writing /home/fedt/FlOpEDT/venv/lib/python3.7/site-packages/gurobipy-9.0.2.egg-info
 removing /home/fedt/gurobi902/linux64/build

Si tout est bon, en lançant python, vous devriez pouvoir importer le module sans erreur :

 python3.7
 Python 3.7.3 (default, Dec 20 2019, 18:57:59) 
 [GCC 8.3.0] on linux
 Type "help", "copyright", "credits" or "license" for more information.
 >>> import gurobipy
 >>> exit()
 deactivate

# Configuration de Django

On retourne dans l'environnement virtuel :

sudo -i -u fedt              # On utilise le compte linux fedt
cd FlOpEDT/                  # On se déplace dans le bon répertoire
source venv/bin/activate     # On active notre environnement virtuel
cd FlOpEDT/                  # On se déplace à nouveau dans le bon répertoire ( ~/FlOpEDT/FlOpEDT$ )
python3.7 manage.py migrate  # On lance les migrations

Ceci nous donne quelque chose de ressemblant à :

(venv) fedt@yaddle:~/FlOpEDT/FlOpEDT$ python3.7 manage.py migrate
Operations to perform:
  Apply all migrations: TTapp, admin, auth, base, configuration, contenttypes, displayweb, easter_egg, people, quote, sessions, solve_board
Running migrations:
  Applying base.0001_initial... OK
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying people.0001_initial... OK
  Applying base.0002_auto_20180712_0749... OK
  Applying base.0003_auto_20180722_1209... OK
  Applying base.0004_auto_20181030_1440... OK
  Applying base.0005_auto_20181022_0910... OK
  Applying people.0002_tutor_departments... OK
  Applying people.0003_auto_20181129_1019... OK
  Applying people.0004_auto_20181219_0858... OK
  Applying people.0005_auto_20190116_2204... OK
  Applying base.0006_edtversion_department... OK
  Applying base.0007_auto_20181025_0914... OK
  Applying base.0008_regen_department... OK
  Applying base.0009_merge_20181031_0831... OK
  Applying base.0010_auto_20181101_0724... OK
  Applying base.0011_auto_20181102_1101... OK
  Applying base.0012_period_department... OK
  Applying base.0013_coursetype_department... OK
  Applying base.0014_auto_20181113_1042... OK
  Applying base.0015_auto_20181219_0858... OK
  Applying base.0016_grouptype_department... OK
  Applying base.0017_auto_20190120_1719... OK
  Applying people.0005_grouppreferences_studentpreferences... OK
  Applying people.0006_auto_20190310_1746... OK
  Applying people.0007_auto_20190311_1920... OK
  Applying base.0015_auto_20181116_1522... OK
  Applying base.0016_scheduledcourse_day... OK
  Applying base.0017_auto_20181116_1554... OK
  Applying base.0018_auto_20181117_2138... OK
  Applying base.0019_auto_20181117_2154... OK
  Applying base.0020_scheduledcourse_tday... OK
  Applying base.0021_remove_scheduledcourse_day... OK
  Applying base.0022_auto_20181117_2200... OK
  Applying base.0023_timegeneralsettings... OK
  Applying base.0024_timegeneralsettings_days... OK
  Applying base.0025_auto_20181118_1420... OK
  Applying base.0026_courseslot_generalslot_step... OK
  Applying base.0027_auto_20181126_1441... OK
  Applying base.0028_auto_20181126_1614... OK
  Applying base.0029_auto_20181201_1708... OK
  Applying base.0030_auto_20181201_1713... OK
  Applying base.0031_auto_20190117_1008... OK
  Applying displayweb.0001_initial... OK
  Applying displayweb.0002_auto_20190424_1055... OK
  Applying base.0032_auto_20190424_1054... OK
  Applying TTapp.0001_initial... OK
  Applying TTapp.0002_auto_20180712_0749... OK
  Applying TTapp.0003_auto_20180712_0749... OK
  Applying TTapp.0004_limitedroomchoices... OK
  Applying TTapp.0005_auto_20181102_1101... OK
  Applying TTapp.0006_auto_20181108_1045... OK
  Applying TTapp.0007_auto_20181113_1031... OK
  Applying TTapp.0008_auto_20181219_0858... OK
  Applying TTapp.0009_auto_20190116_1031... OK
  Applying TTapp.0010_customconstraint... OK
  Applying TTapp.0011_auto_20190527_2050... OK
  Applying TTapp.0012_auto_20190603_2046... OK
  Applying TTapp.0013_auto_20191028_2047... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying people.0008_auto_20190611_1444... OK
  Applying base.0033_timegeneralsettings_default_preference_duration... OK
  Applying people.0009_userdepartmentsettings... OK
  Applying people.0010_auto_20190618_1243... OK
  Applying people.0011_auto_20190624_0757... OK
  Applying people.0012_tutor_max_hours_per_day... OK
  Applying people.0013_auto_20190926_1259... OK
  Applying people.0014_remove_fullstaff_department... OK
  Applying people.0015_userdepartmentsettings_is_admin... OK
  Applying people.0016_auto_20200302_1718... OK
  Applying base.0034_room_departments... OK
  Applying base.0035_auto_20190627_1131... OK
  Applying base.0036_Refactor_code_to_english... OK
  Applying base.0037_auto_20191106_1656... OK
  Applying base.0038_auto_20191108_1448... OK
  Applying base.0039_auto_20191122_1532... OK
  Applying base.0040_auto_20191127_1543... OK
  Applying base.0041_module_url... OK
  Applying base.0042_auto_20200302_1718... OK
  Applying base.0043_auto_20200302_1749... OK
  Applying base.0044_auto_20200302_1752... OK
  Applying base.0045_auto_20200303_2329... OK
  Applying base.0046_roomsort_tutor... OK
  Applying base.0047_module_description... OK
  Applying base.0047_auto_20200310_1118... OK
  Applying base.0048_auto_20200309_1826...Subrooms
Departments
RoomPreferences: OK
 OK
  Applying base.0049_auto_20200310_1233... OK
  Applying base.0050_auto_20200310_1424... OK
  Applying base.0051_remove_room_basic... OK
  Applying configuration.0001_initial... OK
  Applying configuration.0002_delete_updateconfig... OK
  Applying displayweb.0003_tutordisplay... OK
  Applying easter_egg.0001_initial... OK
  Applying easter_egg.0002_auto_20200313_1653... OK
  Applying people.0017_notificationspreferences... OK
  Applying quote.0001_initial... OK
  Applying sessions.0001_initial... OK
  Applying solve_board.0001_initial... OK

On importe les données fournies qui servent de jeu de test :

python3.7 manage.py loaddata ../dump.json

Ce qui nous donne :

 Installed 10863 object(s) from 1 fixture(s)

Important : Si on souhaite supprimer ces données, on peut utiliser la commande :

 python3.7 manage.py flush

# Lancement de Django

Pour lancer le serveur manuellement, on utilise :

python3.7 manage.py runserver

Vous pouvez désormais normalement accéder au site en tapant dans un navigateur :

http://localhost:8000