diff --git a/README.md b/README.md
index 15f0ec0d..db2cc93b 100644
--- a/README.md
+++ b/README.md
@@ -47,28 +47,49 @@ gérer la machine virtuelle :
- `vagrant ssh` vous connecte en SSH à la machine virtuelle, dans le dossier
où est installé GestioCOF. Vous pouvez utiliser les commandes Django
- habituelles (`manage.py runserver` etc.); toutefois pour lancer le serveur il faut faire
-
- python manage.py runserver 0.0.0.0:8000
-
- car par défaut Django n'écoute que sur l'adresse locale de la machine
- virtuelle - or vous voudrez accéder à GestioCOF depuis votre machine
- physique.
+ habituelles (`manage.py runserver` etc.) pour lancer
+ [le serveur en dev](#lancer-le-serveur-de-développement-standard) par
+ exemple
**Le dossier avec le code de GestioCOF est partagé entre la machine virtuelle
et votre machine physique : vous pouvez donc utiliser votre éditeur favori pour
coder depuis l'extérieur de la machine virtuelle, et les changements seront
répercutés dans la machine virtuelle.**
+#### Lancer le serveur de développement standard
+
+Pour lancer le serveur de développement, il faut faire
+
+ python manage.py runserver 0.0.0.0:8000
+
+car par défaut Django n'écoute que sur l'adresse locale de la machine virtuelle
+or vous voudrez accéder à GestioCOF depuis votre machine physique. L'url à
+entrer dans le navigateur est `localhost:8000`.
+
+#### Serveur de développement type production
+
+Sur la VM Vagrant, un serveur apache est configuré pour servir GestioCOF de
+façon similaire à la version en production : on utilise
+[Daphne](https://github.com/django/daphne/) et `python manage.py runworker`
+derrière un reverse-proxy apache. Le tout est monitoré par
+[supervisor](http://supervisord.org/).
+
+Ce serveur se lance tout seul et est accessible en dehors de la VM à l'url
+`localhost:8080`. Toutefois il ne se recharge pas tout seul lorsque le code
+change, il faut relancer le worker avec `sudo supervisorctl restart worker` pour
+visualiser la dernière version du code.
+
### Installation manuelle
Si vous optez pour une installation manuelle plutôt que d'utiliser Vagrant, il
est fortement conseillé d'utiliser un environnement virtuel pour Python.
Il vous faudra installer mercurial, pip, les librairies de développement de
-python, ainsi qu'un client et un serveur MySQL ; sous Debian et dérivées (Ubuntu, ...) :
+python, un client et un serveur MySQL ainsi qu'un serveur redis ; sous Debian et
+dérivées (Ubuntu, ...) :
sudo apt-get install mercurial python-pip python-dev libmysqlclient-dev
+ redis-server
Si vous décidez d'utiliser un environnement virtuel Python (virtualenv;
fortement conseillé), déplacez-vous dans le dossier où est installé GestioCOF
@@ -87,7 +108,7 @@ Vous pouvez maintenant installer les dépendances Python depuis les fichiers
pip install -r requirements.txt -r requirements-devel.txt
-Enfin, copiez le fichier `cof/settings_dev.py` dans `cof/settings.py`.
+Copiez le fichier `cof/settings_dev.py` dans `cof/settings.py`.
#### Installation avec MySQL
diff --git a/apache/django.wsgi b/apache/django.wsgi
deleted file mode 100644
index 7b9c271d..00000000
--- a/apache/django.wsgi
+++ /dev/null
@@ -1,7 +0,0 @@
-import os, sys
-sys.path.append (os.path.expanduser ('~gestion/www'))
-os.environ['DJANGO_SETTINGS_MODULE'] = 'cof.settings'
-
-import django.core.handlers.wsgi
-
-application = django.core.handlers.wsgi.WSGIHandler()
diff --git a/apache/wsgi.py b/apache/wsgi.py
deleted file mode 100644
index 177542a8..00000000
--- a/apache/wsgi.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-WSGI config for myproject project.
-It exposes the WSGI callable as a module-level variable named ``application``.
-For more information on this file, see
-https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
-"""
-
-from __future__ import division
-from __future__ import print_function
-from __future__ import unicode_literals
-
-import os
-from django.core.wsgi import get_wsgi_application
-
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cof.settings")
-application = get_wsgi_application()
diff --git a/bda/migrations/0008_py3.py b/bda/migrations/0008_py3.py
index 42718255..fe6a8eaf 100644
--- a/bda/migrations/0008_py3.py
+++ b/bda/migrations/0008_py3.py
@@ -14,12 +14,21 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='choixspectacle',
name='double_choice',
- field=models.CharField(verbose_name='Nombre de places', choices=[('1', '1 place'), ('autoquit', '2 places si possible, 1 sinon'), ('double', '2 places sinon rien')], default='1', max_length=10),
+ field=models.CharField(
+ verbose_name='Nombre de places',
+ choices=[('1', '1 place'),
+ ('autoquit', '2 places si possible, 1 sinon'),
+ ('double', '2 places sinon rien')],
+ max_length=10, default='1'),
),
migrations.AlterField(
model_name='participant',
name='paymenttype',
- field=models.CharField(verbose_name='Moyen de paiement', choices=[('cash', 'Cash'), ('cb', 'CB'), ('cheque', 'Chèque'), ('autre', 'Autre')], max_length=6, blank=True),
+ field=models.CharField(
+ blank=True,
+ choices=[('cash', 'Cash'), ('cb', 'CB'),
+ ('cheque', 'Chèque'), ('autre', 'Autre')],
+ max_length=6, verbose_name='Moyen de paiement'),
),
migrations.AlterField(
model_name='salle',
@@ -44,7 +53,8 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='spectacle',
name='listing',
- field=models.BooleanField(verbose_name='Les places sont sur listing'),
+ field=models.BooleanField(
+ verbose_name='Les places sont sur listing'),
),
migrations.AlterField(
model_name='spectacle',
@@ -59,7 +69,8 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='spectacle',
name='slots_description',
- field=models.TextField(verbose_name='Description des places', blank=True),
+ field=models.TextField(verbose_name='Description des places',
+ blank=True),
),
migrations.AlterField(
model_name='spectacle',
@@ -69,17 +80,20 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='tirage',
name='active',
- field=models.BooleanField(verbose_name='Tirage actif', default=False),
+ field=models.BooleanField(verbose_name='Tirage actif',
+ default=False),
),
migrations.AlterField(
model_name='tirage',
name='fermeture',
- field=models.DateTimeField(verbose_name='Date et heure de fermerture du tirage'),
+ field=models.DateTimeField(
+ verbose_name='Date et heure de fermerture du tirage'),
),
migrations.AlterField(
model_name='tirage',
name='ouverture',
- field=models.DateTimeField(verbose_name="Date et heure d'ouverture du tirage"),
+ field=models.DateTimeField(
+ verbose_name="Date et heure d'ouverture du tirage"),
),
migrations.AlterField(
model_name='tirage',
diff --git a/bda/models.py b/bda/models.py
index 8a7d0814..270921be 100644
--- a/bda/models.py
+++ b/bda/models.py
@@ -32,7 +32,8 @@ class Tirage(models.Model):
default=False)
def date_no_seconds(self):
- return self.fermeture.strftime('%d %b %Y %H:%M')
+ return self.fermeture.astimezone(timezone.get_current_timezone()) \
+ .strftime('%d %b %Y %H:%M')
def __str__(self):
return "%s - %s" % (self.title, self.date_no_seconds())
@@ -89,7 +90,8 @@ class Spectacle(models.Model):
return "%d" % calendar.timegm(self.date.utctimetuple())
def date_no_seconds(self):
- return self.date.strftime('%d %b %Y %H:%M')
+ return self.date.astimezone(timezone.get_current_timezone()) \
+ .strftime('%d %b %Y %H:%M')
def __str__(self):
return "%s - %s, %s, %.02f€" % (self.title, self.date_no_seconds(),
diff --git a/bda/templates/descriptions.html b/bda/templates/descriptions.html
index 3ab514f2..26da76b6 100644
--- a/bda/templates/descriptions.html
+++ b/bda/templates/descriptions.html
@@ -3,6 +3,7 @@