Possibilité de développer sans ElasticSearch

This commit is contained in:
Evarin 2019-01-14 22:32:01 +01:00
parent 833a8367cf
commit 8f3c02d292
4 changed files with 75 additions and 37 deletions

View file

@ -41,9 +41,13 @@ Vous pouvez alors lancez le serveur de développement
python manage.py runserver
C'est bon, vous pouvez développer sur ExpériENS !
## Configuration de la recherche
Il faut installer elasticsearch 5.*. C'est compliqué. Mais en suivant https://www.elastic.co/guide/en/elasticsearch/reference/5.4/deb.html ça va.
**Cette partie n'est pas obligatoire pour faire fonctionner un serveur de développement en local.** Elle n'est utile que si vous voulez toucher aux fonctionnalités de recherche.
Il faut installer elasticsearch 5.*. C'est compliqué. Mais en suivant https://www.elastic.co/guide/en/elasticsearch/reference/5.4/deb.html c'est faisable.
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
@ -54,11 +58,13 @@ Il faut installer elasticsearch 5.*. C'est compliqué. Mais en suivant https://w
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
Et puis, de retour dans le virtualenv python
Vous devez ensuite activer ElasticSearch dans vos paramètres locaux, en changeant `USE_ELASTICSEARCH = True` à la fin du fichier `experiENS/settings_dev.py`.
Enfin, de retour dans la console et le virtualenv python, vous pouvez faire
python manage.py search_index --rebuild
Si des erreurs s'affichent, il y a une cachuète dans le beurre.
Si des erreurs s'affichent, demandez de l'aide sur Merle ou par e-mail.
## Changer le CSS

View file

@ -4,6 +4,7 @@ from datetime import date
from django import forms
from django.contrib.auth.decorators import login_required
from django.conf import settings
from django.core.cache import cache
from django.core.paginator import Paginator
from django.db.models import Q, Case, When
@ -13,7 +14,11 @@ from django.shortcuts import render, redirect, get_object_or_404
import json
import logging
from .documents import StageDocument
USE_ELASTICSEARCH = getattr(settings, "USE_ELASTICSEARCH", True)
if USE_ELASTICSEARCH:
from .documents import StageDocument
from .decorators import en_scolarite_required
from .models import Stage
from .statics import TYPE_LIEU_OPTIONS, TYPE_STAGE_OPTIONS, NIVEAU_SCOL_OPTIONS
@ -50,8 +55,6 @@ class SearchForm(forms.Form):
def cherche(**kwargs):
filtres = Q(public=True)
dsl = StageDocument.search()
use_dsl = False
def field_relevant(field, test_string=True):
@ -59,35 +62,53 @@ def cherche(**kwargs):
kwargs[field] is not None and \
((not test_string) or kwargs[field].strip() != '')
#
# Recherche libre
#
# Champ générique : recherche dans tous les champs
if field_relevant("generique"):
#print("Filtre generique", kwargs['generique'])
dsl = dsl.query(
"match",
_all={"query": kwargs["generique"],
"fuzziness": "auto"})
use_dsl = True
if USE_ELASTICSEARCH:
dsl = StageDocument.search()
# Sujet -> Recherche dan les noms de sujets et les thématiques
if field_relevant("sujet"):
dsl = dsl.query("multi_match",
query = kwargs["sujet"],
fields = ['sujet^2', 'thematiques', 'matieres'],
fuzziness = "auto")
use_dsl = True
#
# Recherche libre AVEC ELASTICSEARCH
#
# Contexte -> Encadrants, structure, lieu
if field_relevant("contexte"):
dsl = dsl.query("multi_match",
query = kwargs["contexte"],
fields = ['encadrants', 'structure^2',
'lieux.nom', 'lieux.pays', 'lieux.ville'],
fuzziness = "auto")
use_dsl = True
# Champ générique : recherche dans tous les champs
if field_relevant("generique"):
#print("Filtre generique", kwargs['generique'])
dsl = dsl.query(
"match",
_all={"query": kwargs["generique"],
"fuzziness": "auto"})
use_dsl = True
# Sujet -> Recherche dan les noms de sujets et les thématiques
if field_relevant("sujet"):
dsl = dsl.query("multi_match",
query = kwargs["sujet"],
fields = ['sujet^2', 'thematiques', 'matieres'],
fuzziness = "auto")
use_dsl = True
# Contexte -> Encadrants, structure, lieu
if field_relevant("contexte"):
dsl = dsl.query("multi_match",
query = kwargs["contexte"],
fields = ['encadrants', 'structure^2',
'lieux.nom', 'lieux.pays', 'lieux.ville'],
fuzziness = "auto")
use_dsl = True
else:
# Sans ElasticSearch, on active quand même une approximation de
# recherche en base de données
if field_relevant("generique"):
generique = kwargs["generique"]
filtres |= Q(sujet__icontains=generique)
filtres |= Q(thematiques__name__icontains=generique)
filtres |= Q(matieres__nom__icontains=generique)
filtres |= Q(lieux__nom__icontains=generique)
# Autres champs -> non fonctionnels
if field_relevant("sujet") or field_relevant("contexte"):
raise NotImplementedError(
"ElasticSearch doit être activé pour ce type de recherche")
#
# Filtres directs db
@ -115,7 +136,7 @@ def cherche(**kwargs):
# Application
if use_dsl:
if USE_ELASTICSEARCH and use_dsl:
filtres &= Q(id__in=[s.meta.id for s in dsl.scan()])
#print(filtres)

View file

@ -21,7 +21,7 @@ ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = (
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
@ -49,7 +49,7 @@ INSTALLED_APPS = (
'taggit',
'taggit_autosuggest',
'avisstage'
)
]
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
@ -61,6 +61,7 @@ MIDDLEWARE_CLASSES = (
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
@ -83,6 +84,7 @@ TEMPLATES = [
},
]
ROOT_URLCONF = 'experiENS.urls'
WSGI_APPLICATION = 'experiENS.wsgi.application'
@ -94,7 +96,7 @@ WSGI_APPLICATION = 'experiENS.wsgi.application'
# Internationalization
# https://docs.djangoproject.com/en/1.7/topics/i18n/
LANGUAGE_CODE = 'fr-fr'
LANGUAGE_CODE = 'fr'
TIME_ZONE = 'Europe/Paris'

View file

@ -11,6 +11,7 @@ DATABASES = {
}
}
"""
INSTALLED_APPS += (
'debug_toolbar',
)
@ -18,6 +19,7 @@ INSTALLED_APPS += (
MIDDLEWARE_CLASSES = (
'debug_toolbar.middleware.DebugToolbarMiddleware',
) + MIDDLEWARE_CLASSES
"""
INTERNAL_IPS = ['127.0.0.1']
@ -37,3 +39,10 @@ ELASTICSEARCH_DSL = {
CLIPPER_LDAP_SERVER = 'ldaps://localhost:636'
# Changer à True pour développer avec ES
USE_ELASTICSEARCH = False
if not USE_ELASTICSEARCH:
INSTALLED_APPS.remove('django_elasticsearch_dsl')