experiENS/avisstage/views_search.py

150 lines
5 KiB
Python
Raw Normal View History

2017-06-16 00:17:25 +02:00
# coding: utf-8
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from django import forms
2017-06-17 00:34:11 +02:00
from django.db.models import Q
2017-06-16 00:17:25 +02:00
2017-06-17 00:34:11 +02:00
from .documents import StageDocument
from .models import Stage
from .statics import TYPE_LIEU_OPTIONS, TYPE_STAGE_OPTIONS, NIVEAU_SCOL_OPTIONS
from datetime import date
2017-06-16 00:17:25 +02:00
# Recherche
class SearchForm(forms.Form):
2017-06-17 00:34:11 +02:00
generique = forms.CharField(required=False)
sujet = forms.CharField(label=u'À propos de', required=False)
2017-06-17 17:41:52 +02:00
contexte = forms.CharField(label=u'Contexte (lieu, encadrant⋅e⋅s, structure)',
required=False)
2017-06-17 00:34:11 +02:00
apres_annee = forms.IntegerField(label=u'Après cette année', required=False)
avant_annee = forms.IntegerField(label=u'Avant cette année', required=False)
2017-06-17 17:41:52 +02:00
type_stage = forms.ChoiceField(label="Type de stage", choices=([('', u'')]
2017-06-17 00:34:11 +02:00
+ list(TYPE_STAGE_OPTIONS)),
required=False)
2017-06-20 00:24:48 +02:00
niveau_scol = forms.ChoiceField(label="Année d'étude", choices=([('', u'')]
2017-06-20 00:22:19 +02:00
+ list(NIVEAU_SCOL_OPTIONS)),
2017-06-17 00:34:11 +02:00
required=False)
2017-06-17 17:41:52 +02:00
type_lieu = forms.ChoiceField(label=u"Type de lieu d'accueil",
choices=([('', u'')]
2017-06-17 00:34:11 +02:00
+ list(TYPE_LIEU_OPTIONS)),
required=False)
2017-06-17 17:41:52 +02:00
tri = forms.ChoiceField(label=u'Tri par',
choices=[('pertinence', u'Pertinence'),
('-date_maj',u'Dernière mise à jour')],
2017-06-17 00:34:11 +02:00
required=False, initial='pertinence')
2017-06-16 00:17:25 +02:00
def cherche(**kwargs):
2017-06-17 00:34:11 +02:00
filtres = Q(public=True)
dsl = StageDocument.search()
use_dsl = False
def field_relevant(field, test_string=True):
return field in kwargs and \
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"):
2017-06-20 19:17:59 +02:00
#print "Filtre generique", kwargs['generique']
2017-06-17 00:34:11 +02:00
dsl = dsl.filter(
2017-06-16 00:17:25 +02:00
"match",
_all={"query": kwargs["generique"],
"fuzziness": "auto"})
2017-06-17 00:34:11 +02:00
use_dsl = True
# Sujet -> Recherche dan les noms de sujets et les thématiques
if field_relevant("sujet"):
dsl = dsl.filter("multi_match",
query = kwargs["sujet"],
fields = ['sujet^2', 'thematiques'],
fuzziness = "auto")
use_dsl = True
# Contexte -> Encadrants, structure, lieu
if field_relevant("contexte"):
dsl = dsl.filter("multi_match",
query = kwargs["contexte"],
fields = ['encadrants', 'structure^2',
'lieux.nom', 'lieux.pays', 'lieux.ville'],
fuzziness = "auto")
use_dsl = True
#
# Filtres directs db
#
# Dates
if field_relevant('avant_annee', False):
dte = date(kwargs['avant_annee']+1, 1, 1)
filtres &= Q(date_fin__lt=dte)
if field_relevant('apres_annee', False):
dte = date(kwargs['apres_annee'], 1, 1)
filtres &= Q(date_debut__gte=dte)
# Type de stage
if field_relevant('type_stage'):
filtres &= Q(type_stage=kwargs["type_stage"])
2017-06-20 00:24:48 +02:00
if field_relevant('niveau_scol'):
filtres &= Q(niveau_scol=kwargs["niveau_scol"])
2017-06-17 00:34:11 +02:00
# Type de lieu
if field_relevant('type_lieu'):
filtres &= Q(lieux__type_lieu=kwargs["type_lieu"])
# Application
if use_dsl:
filtres &= Q(id__in=[s.meta.id for s in dsl])
2017-06-20 19:17:59 +02:00
#print filtres
2017-06-17 00:34:11 +02:00
resultat = Stage.objects.filter(filtres)
2017-06-17 17:41:52 +02:00
tri = 'pertinence'
if not use_dsl:
kwargs['tri'] = '-date_maj'
2017-06-17 00:34:11 +02:00
if field_relevant('tri') and kwargs['tri'] != 'pertinence':
2017-06-17 17:41:52 +02:00
tri = kwargs['tri']
2017-06-17 00:34:11 +02:00
resultat = resultat.order_by(kwargs['tri'])
2017-06-17 17:41:52 +02:00
return resultat, tri
2017-06-16 00:17:25 +02:00
@login_required
def recherche(request):
form = SearchForm()
return render(request, 'avisstage/recherche/recherche.html',
{"form": form})
@login_required
def recherche_resultats(request):
2017-06-16 00:17:25 +02:00
stages = []
2017-06-17 17:41:52 +02:00
tri = ''
vue = 'vue-liste'
lieux = []
2017-06-16 00:17:25 +02:00
if request.method == "GET":
form = SearchForm(request.GET)
if form.is_valid():
2017-06-17 17:41:52 +02:00
stages, tri = cherche(**form.cleaned_data)
2017-06-26 22:40:35 +02:00
stages = stages.prefetch_related('lieux', 'auteur', 'matieres', 'thematiques')
2017-06-23 11:13:34 +02:00
lieux = [[stageid, lieuid] for (stageid, lieuid) in stages.values_list('id', 'lieux') if lieuid is not None]
2017-06-16 00:17:25 +02:00
else:
form = SearchForm()
2017-06-17 17:41:52 +02:00
if stages:
vue = 'vue-hybride'
return render(request, 'avisstage/recherche/resultats.html',
2017-06-17 17:41:52 +02:00
{"form": form, "stages":stages,
"tri": tri, "vue": vue, "lieux": lieux})