From d77a4dde3e342cec3668e972a4bdce19c627fefb Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Sun, 6 Nov 2016 01:36:10 +0100 Subject: [PATCH 1/9] GestioCOF devrait fonctionner sur / aussi bien que sur /gestion --- cof/settings_dev.py | 10 +++------- cof/urls.py | 20 ++++++++------------ kfet/routing.py | 4 +--- provisioning/apache.conf | 10 ++++++++++ provisioning/bootstrap.sh | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/cof/settings_dev.py b/cof/settings_dev.py index 6747963b..11c2faf9 100644 --- a/cof/settings_dev.py +++ b/cof/settings_dev.py @@ -135,10 +135,6 @@ MEDIA_URL = '/media/' # Various additional settings SITE_ID = 1 -# URL prefix for admin static files -- CSS, JavaScript and images. -# Make sure to use a trailing slash. -# Examples: "http://foo.com/static/admin/", "/static/admin/". -ADMIN_MEDIA_PREFIX = '/static/grappelli/' GRAPPELLI_ADMIN_HEADLINE = "GestioCOF" GRAPPELLI_ADMIN_TITLE = "GestioCOF" @@ -155,12 +151,12 @@ MAIL_DATA = { 'REPLYTO': 'BdA-Revente '}, } -LOGIN_URL = "/gestion/login" -LOGIN_REDIRECT_URL = "/gestion/" +LOGIN_URL = "cof-login" +LOGIN_REDIRECT_URL = "home" CAS_SERVER_URL = 'https://cas.eleves.ens.fr/' CAS_IGNORE_REFERER = True -CAS_REDIRECT_URL = '/gestion/' +CAS_REDIRECT_URL = '/' CAS_EMAIL_FORMAT = "%s@clipper.ens.fr" AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', diff --git a/cof/urls.py b/cof/urls.py index 263fc3a0..f3d6905e 100644 --- a/cof/urls.py +++ b/cof/urls.py @@ -24,7 +24,7 @@ from gestioncof.autocomplete import autocomplete autocomplete_light.autodiscover() admin.autodiscover() -my_urlpatterns = [ +urlpatterns = [ # Page d'accueil url(r'^$', gestioncof_views.home, name='home'), # Le BdA @@ -48,7 +48,7 @@ my_urlpatterns = [ url(r'^cas/logout$', django_cas_views.logout), url(r'^outsider/login$', gestioncof_views.login_ext), url(r'^outsider/logout$', django_views.logout, {'next_page': 'home'}), - url(r'^login$', gestioncof_views.login), + url(r'^login$', gestioncof_views.login, name="cof-login"), url(r'^logout$', gestioncof_views.logout), # Infos persos url(r'^profile$', gestioncof_views.profile), @@ -81,14 +81,10 @@ my_urlpatterns = [ url(r'^utile_bda/bda_diff$', gestioncof_views.liste_bdadiff), url(r'^utile_cof/diff_cof$', gestioncof_views.liste_diffcof), url(r'^utile_bda/bda_revente$', gestioncof_views.liste_bdarevente), - url(r'^k-fet/', include('kfet.urls')) -] + \ - (static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - if settings.DEBUG - else []) -# Si on est en production, MEDIA_ROOT est servi par Apache. -# Il faut dire à Django de servir MEDIA_ROOT lui-même en développement. - -urlpatterns = [ - url(r'^gestion/', include(my_urlpatterns)) + url(r'^k-fet/', include('kfet.urls')), ] + +if settings.DEBUG: + # Si on est en production, MEDIA_ROOT est servi par Apache. + # Il faut dire à Django de servir MEDIA_ROOT lui-même en développement. + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/kfet/routing.py b/kfet/routing.py index 9c816c92..63e0c963 100644 --- a/kfet/routing.py +++ b/kfet/routing.py @@ -8,7 +8,5 @@ from channels.routing import route, route_class from kfet import consumers channel_routing = [ - route_class(consumers.KPsul, path=r"^/gestion/ws/k-fet/k-psul/$"), - #route("websocket.connect", ws_kpsul_history_connect), - #route('websocket.receive', ws_message) + route_class(consumers.KPsul, path=r"^ws/k-fet/k-psul/$"), ] diff --git a/provisioning/apache.conf b/provisioning/apache.conf index 001c6ec9..cc815592 100644 --- a/provisioning/apache.conf +++ b/provisioning/apache.conf @@ -6,6 +6,16 @@ ProxyRequests Off ProxyPass /static/ ! ProxyPass /media/ ! + # Pour utiliser un sous-dossier (typiquement /gestion/), il faut faire a la + # place des lignes suivantes: + # + # RequestHeader set Daphne-Root-Path /gestion + # ProxyPass /gestion/ws/ ws://127.0.0.1:8001/gestion/ws/ + # ProxyPass /gestion http://127.0.0.1:8001/gestion + # ProxyPassReverse /gestion http://127.0.0.1:8001/gestion + # + # Penser egalement a changer les /static/ et /media/ dans la config apache + # ainsi que dans les settings django. ProxyPass /ws/ ws://127.0.0.1:8001/ws/ ProxyPass / http://127.0.0.1:8001/ ProxyPassReverse / http://127.0.0.1:8001/ diff --git a/provisioning/bootstrap.sh b/provisioning/bootstrap.sh index f072e6fc..152e903a 100644 --- a/provisioning/bootstrap.sh +++ b/provisioning/bootstrap.sh @@ -23,7 +23,7 @@ mysql -uroot -p$DBPASSWD -e "CREATE DATABASE $DBNAME; GRANT ALL PRIVILEGES ON $D # Installation et configuration d'Apache apt-get install -y apache2 -a2enmod proxy proxy_http +a2enmod proxy proxy_http proxy_wstunnel headers cp /vagrant/provisioning/apache.conf /etc/apache2/sites-available/gestiocof.conf a2ensite gestiocof a2dissite 000-default From a63f1da2e11c7ce172229af1140ffd466508632f Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Sun, 6 Nov 2016 19:44:05 +0100 Subject: [PATCH 2/9] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20django=5Fdebug?= =?UTF-8?q?=5Ftoolbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cof/settings_dev.py | 1 + cof/urls.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/cof/settings_dev.py b/cof/settings_dev.py index 11c2faf9..8a622318 100644 --- a/cof/settings_dev.py +++ b/cof/settings_dev.py @@ -53,6 +53,7 @@ INSTALLED_APPS = ( ) MIDDLEWARE_CLASSES = ( + 'debug_toolbar.middleware.DebugToolbarMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', diff --git a/cof/urls.py b/cof/urls.py index f3d6905e..5134456a 100644 --- a/cof/urls.py +++ b/cof/urls.py @@ -85,6 +85,11 @@ urlpatterns = [ ] if settings.DEBUG: + import debug_toolbar + urlpatterns += [ + url(r'^__debug__/', include(debug_toolbar.urls)), + ] + # Si on est en production, MEDIA_ROOT est servi par Apache. # Il faut dire à Django de servir MEDIA_ROOT lui-même en développement. urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From 76a88be4ef729d32e4e2b29d5f05fdd20886fd93 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Tue, 8 Nov 2016 10:28:00 -0200 Subject: [PATCH 3/9] check date spectacle --- bda/views.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bda/views.py b/bda/views.py index b9ce0825..9b667cc2 100644 --- a/bda/views.py +++ b/bda/views.py @@ -331,11 +331,12 @@ def revente(request, tirage_id): id=revente_id) if rev.exists(): revente = rev.get() - revente.date = timezone.now() - timedelta(hours=1) - revente.soldTo = None - if revente.answered_mail: - revente.answered_mail.clear() - revente.save() + if revente.attribution.spectacle.date > timezone.now(): + revente.date = timezone.now() - timedelta(hours=1) + revente.soldTo = None + if revente.answered_mail: + revente.answered_mail.clear() + revente.save() else: resellform = ResellForm(participant, prefix='resell') From 929672a2a97d22d379ed8ecd811313dd38ec8664 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Tue, 8 Nov 2016 10:41:12 -0200 Subject: [PATCH 4/9] check date admin --- bda/admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bda/admin.py b/bda/admin.py index 87a269d4..a9b3c51f 100644 --- a/bda/admin.py +++ b/bda/admin.py @@ -257,7 +257,8 @@ class SpectacleReventeAdmin(admin.ModelAdmin): Réinitialise les reventes. """ count = queryset.count() - for revente in queryset.all(): + for revente in queryset.filter( + attribution__spectacle__date__gte=timezone.now()): revente.date = timezone.now() - timedelta(hours=1) revente.soldTo = None revente.notif_sent = False From cce574a11b6085a198e134f85021593ab974d1d3 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Tue, 8 Nov 2016 09:48:55 +0100 Subject: [PATCH 5/9] Supprime do_resell MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La fonction utilitaire `bda.views.do_resell` n’est plus utilisée depuis la nouvelle version de bda-revente. --- bda/views.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/bda/views.py b/bda/views.py index 8beeb84b..5f84228b 100644 --- a/bda/views.py +++ b/bda/views.py @@ -263,25 +263,6 @@ def tirage(request, tirage_id): return render(request, "bda-token.html", {"form": form}) -def do_resell(request, form): - spectacle = form.cleaned_data["spectacle"] - count = form.cleaned_data["count"] - places = "2 places" if count == "2" else "une place" - mail = """Bonjour, - -Je souhaite revendre %s pour %s le %s (%s) à %.02f€. -Contactez moi par email si vous êtes intéressé·e·s ! - -%s (%s)""" % (places, spectacle.title, spectacle.date_no_seconds(), - spectacle.location, spectacle.price, - request.user.get_full_name(), request.user.email) - send_mail("%s" % spectacle, mail, - request.user.email, ["bda-revente@lists.ens.fr"], - fail_silently=False) - return render(request, "bda-success.html", - {"show": spectacle, "places": places}) - - @login_required def revente(request, tirage_id): tirage = get_object_or_404(Tirage, id=tirage_id) From afab33f5a1cd123b8ef3929cf77a1ad3a1b53c91 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Tue, 8 Nov 2016 10:57:40 +0100 Subject: [PATCH 6/9] Supprime Spectacle.__repr__ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La méthode `bda.models.Spectacle.__repr__` est buggée (elle retourne une chaîne unicode alors que `__repr__` doit *toujours* renvoyer une chaîne ASCII) et pose des problèmes de crash lors de l’affichage d’objets `Spectacle` dans le REPL python. La méthode `__repr__` héritée de `django.db.models.Model` devrait être suffisante. --- bda/models.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/bda/models.py b/bda/models.py index 6fb22189..ccc49222 100644 --- a/bda/models.py +++ b/bda/models.py @@ -86,9 +86,6 @@ class Spectacle(models.Model): verbose_name = "Spectacle" ordering = ("date", "title",) - def __repr__(self): - return "[%s]" % self - def timestamp(self): return "%d" % calendar.timegm(self.date.utctimetuple()) From 3c362014b0c2bb4da178ddd6f1573eb063ae766c Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Sun, 13 Nov 2016 12:22:48 +0100 Subject: [PATCH 7/9] =?UTF-8?q?Remplace=20simplejson=20par=20json=20de=20l?= =?UTF-8?q?a=20biblioth=C3=A8que=20standard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gestioncof/petits_cours_views.py | 6 +++--- requirements.txt | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index e9fe511e..c3e43ea8 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -30,7 +30,7 @@ from captcha.fields import ReCaptchaField from datetime import datetime import base64 -import simplejson +import json def render_template(template_path, data): @@ -153,7 +153,7 @@ def _finalize_traitement(request, demande, proposals, proposed_for, "proposed_mails": proposed_mails, "mainmail": mainmail, "attribdata": - base64.b64encode(simplejson.dumps(attribdata) + base64.b64encode(json.dumps(attribdata) .encode('utf_8')), "redo": redo, "errors": errors, @@ -262,7 +262,7 @@ def _traitement_post(request, demande): extra = request.POST["extra"].strip() redo = "redo" in request.POST attribdata = request.POST["attribdata"] - attribdata = dict(simplejson.loads(base64.b64decode(attribdata))) + attribdata = dict(json.loads(base64.b64decode(attribdata))) for matiere in demande.matieres.all(): if matiere.id not in attribdata: unsatisfied.append(matiere) diff --git a/requirements.txt b/requirements.txt index 23f4d618..f7f6deca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,6 @@ django-grappelli==2.8.1 django-recaptcha==1.0.5 mysqlclient==1.3.7 Pillow==3.3.0 -simplejson==3.8.2 six==1.10.0 unicodecsv==0.14.1 icalendar==3.10 From a5ee17d0b5b2e040f71280e58b6bdadbf6cfa567 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Sun, 13 Nov 2016 11:29:28 +0100 Subject: [PATCH 8/9] Lance les tests de gestioCOF sur gitlab-ci --- .gitlab-ci.yml | 40 ++++++++++++++++++++++++++++++++++++++++ cof/settings_dev.py | 3 ++- requirements-devel.txt | 1 + 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..f420a9f5 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,40 @@ +services: + - mysql:latest + - redis:latest + +variables: + # GestioCOF settings + DJANGO_SETTINGS_MODULE: "cof.settings_dev" + DBNAME: "cof_gestion" + DBUSER: "cof_gestion" + DBPASSWD: "cof_password" + DBHOST: "mysql" + REDIS_HOST: "redis" + + # Cached packages + PYTHONPATH: "$CI_PROJECT_DIR/vendor/python" + + # mysql service configuration + MYSQL_DATABASE: "$DBNAME" + MYSQL_USER: "$DBUSER" + MYSQL_PASSWORD: "$DBPASSWD" + MYSQL_ROOT_PASSWORD: "root_password" + + +cache: + paths: + - vendor/python + - vendor/pip + - vendor/apt + +before_script: + - mkdir -p vendor/{python,pip,apt} + - apt-get update -q && apt-get -o dir::cache::archives="vendor/apt" install -yqq mysql-client + - mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host="$DBHOST" + -e "GRANT ALL ON test_$DBNAME.* TO '$DBUSER'@'%'" + - pip install --cache-dir vendor/pip -t vendor/python -r requirements-devel.txt + +test: + stage: test + script: + - python manage.py test diff --git a/cof/settings_dev.py b/cof/settings_dev.py index 6747963b..1c3476dd 100644 --- a/cof/settings_dev.py +++ b/cof/settings_dev.py @@ -98,6 +98,7 @@ DATABASES = { 'NAME': os.environ['DBNAME'], 'USER': os.environ['DBUSER'], 'PASSWORD': os.environ['DBPASSWD'], + 'HOST': os.environ.get('DBHOST', 'localhost'), } } @@ -179,7 +180,7 @@ CHANNEL_LAYERS = { "default": { "BACKEND": "asgi_redis.RedisChannelLayer", "CONFIG": { - "hosts": [("localhost", 6379)], + "hosts": [(os.environ.get("REDIS_HOST", "localhost"), 6379)], }, "ROUTING": "cof.routing.channel_routing", } diff --git a/requirements-devel.txt b/requirements-devel.txt index dc8dbc45..425dfc36 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -1,2 +1,3 @@ +-r requirements.txt django-debug-toolbar ipython From 107079ce1f4c0986a17843b8cfc379263775e4a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 14 Nov 2016 06:39:55 +0100 Subject: [PATCH 9/9] Fix pip version --- provisioning/bootstrap.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/provisioning/bootstrap.sh b/provisioning/bootstrap.sh index 152e903a..a873973f 100644 --- a/provisioning/bootstrap.sh +++ b/provisioning/bootstrap.sh @@ -10,6 +10,7 @@ DBPASSWD="4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4" # Installation de paquets utiles apt-get update && apt-get install -y mercurial python-pip python-dev \ libmysqlclient-dev libjpeg-dev git redis-server +pip install -U pip # Configuration et installation de mysql. Le mot de passe root est le même que # le mot de passe pour l'utilisateur local - pour rappel, ceci est une instance