diff --git a/avisstage/api.py b/avisstage/api.py index a1e4c0e..8bbeff7 100644 --- a/avisstage/api.py +++ b/avisstage/api.py @@ -2,12 +2,12 @@ from tastypie.resources import ModelResource from tastypie.authentication import SessionAuthentication -from tastypie import fields, utils +from tastypie import fields from django.contrib.gis import geos from django.urls import reverse -from .models import Lieu, Stage, Normalien, StageMatiere +from .models import Lieu, Stage, Normalien from .utils import approximate_distance class EnScolariteAuthentication(SessionAuthentication): @@ -20,12 +20,12 @@ class EnScolariteAuthentication(SessionAuthentication): class LieuResource(ModelResource): #stages = fields.ToManyField("avisstage.api.StageResource", # "stages", use_in="detail", full=True) - + class Meta: queryset = Lieu.objects.all() resource_name = "lieu" fields = ["nom", "ville", "pays", "coord", "type_lieu", "id"] - + #login_required authentication = SessionAuthentication() @@ -46,17 +46,17 @@ class LieuResource(ModelResource): # Filtrer les lieux qui ont déjà des stages if "has_stage" in filters: orm_filters['stages__public'] = True - + return orm_filters # Custom apply filters pour ajouter le "distinct" def apply_filters(self, request, applicable_filters): return self.get_object_list(request).filter(**applicable_filters).distinct() - + # Ajout d'informations def dehydrate(self, bundle): bundle = super(LieuResource, self).dehydrate(bundle) - + obj = bundle.obj bundle.data['coord'] = {'lat': float(obj.coord.y), 'lng': float(obj.coord.x)} @@ -65,12 +65,12 @@ class LieuResource(ModelResource): if "lat" in bundle.request.GET and "lng" in bundle.request.GET: bundle.data['distance'] = approximate_distance( self.reference_point, bundle.obj.coord) - + # Autres infos utiles bundle.data["pays_nom"] = obj.get_pays_display() bundle.data["type_lieu_nom"] = obj.type_lieu_fancy # TODO use annotate? - bundle.data["num_stages"] = obj.stages.filter(public=True).count() + bundle.data["num_stages"] = obj.stages.filter(public=True).count() return bundle @@ -94,7 +94,7 @@ class StageResource(ModelResource): if "lieux" in filters: flieux = map(int, filters['lieux'].split(',')) orm_filters['lieux__id__in'] = flieux - + return orm_filters # Informations à ajouter @@ -106,7 +106,7 @@ class StageResource(ModelResource): bundle.data['auteur'] = obj.auteur.nom bundle.data['thematiques'] = list(obj.thematiques.all().values_list("name", flat=True)) bundle.data['matieres'] = list(obj.matieres.all().values_list("nom", flat=True)) - + # Adresse de la fiche de stage bundle.data['url'] = reverse("avisstage:stage", kwargs={"pk": obj.id}); return bundle @@ -115,7 +115,7 @@ class StageResource(ModelResource): class AuteurResource(ModelResource): stages = fields.ToManyField("avisstage.api.StageResource", "stages", use_in="detail") - + class Meta: queryset = Normalien.objects.all() resource_name = "profil" diff --git a/avisstage/documents.py b/avisstage/documents.py index b2fcf50..e12ca6c 100644 --- a/avisstage/documents.py +++ b/avisstage/documents.py @@ -1,7 +1,7 @@ from django_elasticsearch_dsl import DocType, Index, fields -from elasticsearch_dsl import analyzer, token_filter, tokenizer +from elasticsearch_dsl import analyzer, token_filter -from .models import Stage, AvisStage, AvisLieu +from .models import Stage from .statics import PAYS_OPTIONS PAYS_DICT = dict(PAYS_OPTIONS) @@ -11,7 +11,7 @@ stage.settings( number_of_shards=1, number_of_replicas=0 ) - + text_analyzer = analyzer( 'default', tokenizer="standard", @@ -32,7 +32,7 @@ class StageDocument(DocType): }) thematiques = fields.StringField() matieres = fields.StringField() - + class Meta: model = Stage fields = [ @@ -65,11 +65,11 @@ class StageDocument(DocType): def prepare_sujet(self, instance): return instance.sujet.lower() - + # Hook pour l'affichage des noms de pays def prepare(self, instance): data = super(StageDocument, self).prepare(instance) - + for lieu in data['lieux']: lieu['pays'] = PAYS_DICT[lieu['pays']].lower() return data diff --git a/avisstage/forms.py b/avisstage/forms.py index 8af5c57..ad114f8 100644 --- a/avisstage/forms.py +++ b/avisstage/forms.py @@ -5,7 +5,7 @@ from django.utils import timezone import re -from .models import Normalien, Stage, Lieu, AvisLieu, AvisStage +from .models import Stage, Lieu, AvisLieu, AvisStage from .widgets import LatLonField # Sur-classe utile @@ -15,12 +15,12 @@ class HTMLTrimmerForm(forms.ModelForm): leading_white = re.compile(r"^( \t\n)*(

( |[ \n\t]|)*

( \t\n)*)+?", re.IGNORECASE) trailing_white = re.compile(r"(( \t\n)*

( |[ \n\t]|)*

)+?( \t\n)*$", re.IGNORECASE) cleaned_data = super(HTMLTrimmerForm, self).clean() - + for (fname, fval) in cleaned_data.items(): # Heuristique : les champs commençant par "avis_" sont des champs html if fname[:5] == "avis_": cleaned_data[fname] = leading_white.sub("", trailing_white.sub("", fval)) - + return cleaned_data # Infos sur un stage @@ -48,17 +48,17 @@ class StageForm(forms.ModelForm): if "request" in kwargs: self.request = kwargs.pop("request") super(StageForm, self).__init__(*args, **kwargs) - + def save(self, commit=True): # Lors de la création : attribution à l'utilisateur connecté if self.instance.id is None and hasattr(self, 'request'): self.instance.auteur = self.request.user.profil - + # Date de modification self.instance.date_maj = timezone.now() self.instance.update_stats(False) - + stage = super(StageForm, self).save(commit=commit) return stage @@ -97,7 +97,7 @@ class AvisLieuForm(HTMLTrimmerForm): class LieuForm(forms.ModelForm): coord = LatLonField() id = forms.IntegerField(widget=forms.widgets.HiddenInput(), required=False) - + class Meta: model = Lieu fields = ['id', 'nom', 'type_lieu', 'ville', 'pays', 'coord'] @@ -106,4 +106,3 @@ class LieuForm(forms.ModelForm): class FeedbackForm(forms.Form): objet = forms.CharField(label="Objet", required=True) message = forms.CharField(label="Message", required=True, widget=forms.widgets.Textarea()) - diff --git a/avisstage/management/commands/nettoie_lieux.py b/avisstage/management/commands/nettoie_lieux.py index abf3195..49f871d 100644 --- a/avisstage/management/commands/nettoie_lieux.py +++ b/avisstage/management/commands/nettoie_lieux.py @@ -1,7 +1,7 @@ #coding: utf-8 -from django.core.management.base import BaseCommand, CommandError -from django.db.models import Count -from avisstage.models import Stage, Lieu + +from django.core.management.base import BaseCommand +from avisstage.models import Lieu class Command(BaseCommand): help = 'Nettoie les stages à plusieurs lieux identiques' @@ -21,7 +21,7 @@ class Command(BaseCommand): rundb = True else: print(u"Les modifications ne seront pas appliquées") - + min_lieu = options.get('min_lieu', 0) for lieu in Lieu.objects.filter(id__gte=min_lieu).order_by('-id'): diff --git a/avisstage/management/commands/nettoie_stages.py b/avisstage/management/commands/nettoie_stages.py index 8d7704e..12134a9 100644 --- a/avisstage/management/commands/nettoie_stages.py +++ b/avisstage/management/commands/nettoie_stages.py @@ -1,7 +1,8 @@ #coding: utf-8 -from django.core.management.base import BaseCommand, CommandError + +from django.core.management.base import BaseCommand from django.db.models import Count -from avisstage.models import Stage, Lieu +from avisstage.models import Stage class Command(BaseCommand): help = 'Nettoie les stages à plusieurs lieux identiques' @@ -31,7 +32,7 @@ class Command(BaseCommand): rundb = True else: print(u"Les modifications ne seront pas appliquées") - + min_stage = options.get('min_stage', 0) for stage in Stage.objects.annotate(c=Count("lieux"))\ diff --git a/avisstage/management/commands/supprime_lieu.py b/avisstage/management/commands/supprime_lieu.py index 3b138b1..d45b7ee 100644 --- a/avisstage/management/commands/supprime_lieu.py +++ b/avisstage/management/commands/supprime_lieu.py @@ -1,7 +1,7 @@ #coding: utf-8 -from django.core.management.base import BaseCommand, CommandError -from django.db.models import Count -from avisstage.models import Stage, Lieu + +from django.core.management.base import BaseCommand +from avisstage.models import Lieu class Command(BaseCommand): help = 'Nettoie les stages à plusieurs lieux identiques' diff --git a/avisstage/models.py b/avisstage/models.py index 4cbf780..9912748 100644 --- a/avisstage/models.py +++ b/avisstage/models.py @@ -9,13 +9,10 @@ from django.db import models from django.db.models.signals import post_save from django.contrib.auth.models import User from django.contrib.gis.db import models as geomodels -from django.template.defaultfilters import slugify -from django.forms.widgets import DateInput from django.urls import reverse from django.utils import timezone from django.utils.functional import cached_property -from django.utils.html import strip_tags from taggit_autosuggest.managers import TaggableManager from tinymce.models import HTMLField as RichTextField @@ -23,8 +20,6 @@ from tinymce.models import HTMLField as RichTextField from .utils import choices_length from .statics import DEPARTEMENTS_DEFAUT, PAYS_OPTIONS, TYPE_LIEU_OPTIONS, TYPE_STAGE_OPTIONS, TYPE_LIEU_DICT, TYPE_STAGE_DICT, NIVEAU_SCOL_OPTIONS, NIVEAU_SCOL_DICT -import ldap - # # Profil Normalien (extension du modèle User) # @@ -93,7 +88,7 @@ def create_user_profile(sender, instance, created, **kwargs): if "department_code" in edata: dep = dict(DEPARTEMENTS_DEFAUT).get( edata["department_code"].lower(), '') - + profil.promotion = "%s %s" % (dep, edata["entrance_year"]) profil.nom = edata.get("name", "") profil.save() @@ -119,7 +114,7 @@ class Lieu(models.Model): pays = models.CharField(u"Pays", choices=PAYS_OPTIONS, max_length=choices_length(PAYS_OPTIONS)) - + # Coordonnées objects = geomodels.GeoManager() # Requis par GeoDjango coord = geomodels.PointField(u"Coordonnées", @@ -137,11 +132,11 @@ class Lieu(models.Model): def __str__(self): return u"%s (%s)" % (self.nom, self.ville) - + class Meta: verbose_name = "Lieu" verbose_name_plural = "Lieux" - + # # Matières des stages # @@ -149,7 +144,7 @@ class Lieu(models.Model): class StageMatiere(models.Model): nom = models.CharField(u"Nom", max_length=30) slug = models.SlugField() - + class Meta: verbose_name = "Matière des stages" verbose_name_plural = "Matières des stages" @@ -228,7 +223,7 @@ class Stage(models.Model): def get_absolute_url(self): return reverse('avisstage:stage', self) - + def __str__(self): return u"%s (par %s)" % (self.sujet, self.auteur.user.username) @@ -242,16 +237,16 @@ class Stage(models.Model): length += len(obj.les_plus.split()) length += len(obj.les_moins.split()) return length - + if self.avis_stage: self.len_avis_stage = get_len(self.avis_stage) self.len_avis_lieux = 0 for avis in self.avislieu_set.all(): self.len_avis_lieux += get_len(avis) - + if save: self.save() - + class Meta: verbose_name = "Stage" diff --git a/avisstage/tests.py b/avisstage/tests.py index ed8721a..87cca39 100644 --- a/avisstage/tests.py +++ b/avisstage/tests.py @@ -4,16 +4,15 @@ from allauth_ens.adapter import deprecate_clippers from datetime import date -from django.test import TestCase from django.urls import reverse from django.conf import settings -from .models import User, Normalien, Lieu, Stage, StageMatiere, AvisLieu +from .models import User, Lieu, Stage, StageMatiere, AvisLieu class ExperiENSTestCase(CASTestCase): - + # Dummy database - + def setUp(self): self.u_conscrit = User.objects.create_user('conscrit', 'conscrit@ens.fr', @@ -28,7 +27,7 @@ class ExperiENSTestCase(CASTestCase): provider="clipper", uid="conscrit") self.sa_conscrit.save() - + self.u_archi = User.objects.create_user('archicube', 'archicube@ens.fr', 'archicube') @@ -50,7 +49,7 @@ class ExperiENSTestCase(CASTestCase): self.matiere1.save() self.matiere2 = StageMatiere(nom="Sortilège", slug="sortilege") self.matiere2.save() - + self.cstage1 = Stage(auteur=self.p_conscrit, sujet="Wingardium Leviosa", date_debut=date(2000, 5, 10), date_fin=date(2000, 8, 26), @@ -73,7 +72,7 @@ class ExperiENSTestCase(CASTestCase): chapo="Trop nul") alieu2.save() - + self.astage1 = Stage(auteur=self.p_archi, sujet="Alohomora", date_debut=date(1994, 5, 10), date_fin=date(1994, 8, 26), @@ -109,10 +108,10 @@ class PublicViewsTest(ExperiENSTestCase): def test_stage_visibility_public(self): self.assertRedirectToLogin(reverse('avisstage:stage', kwargs={'pk':self.cstage1.id})) - + self.assertRedirectToLogin(reverse('avisstage:stage', kwargs={'pk':self.cstage2.id})) - + self.assertRedirectToLogin(reverse('avisstage:stage', kwargs={'pk':self.astage1.id})) @@ -127,7 +126,7 @@ class PublicViewsTest(ExperiENSTestCase): self.assertRedirectToLogin(reverse( 'avisstage:profil', kwargs={'username': self.u_archi.username})) - + """ Vérifie que la recherche n'est pas accessible hors connexion """ @@ -151,27 +150,27 @@ class PublicViewsTest(ExperiENSTestCase): "api_name": "v1"}) r = self.client.get(testurl) self.assertEqual(r.status_code, 401) - + testurl = reverse('avisstage:api_dispatch_list', kwargs={"resource_name": "stage", "api_name": "v1"}) r = self.client.get(testurl) self.assertEqual(r.status_code, 401) - + testurl = reverse('avisstage:api_dispatch_list', kwargs={"resource_name": "profil", "api_name": "v1"}) r = self.client.get(testurl) self.assertEqual(r.status_code, 401) - + """ Vérifie que les pages d'édition ne sont pas accessible hors connexion """ def test_edit_visibility_public(self): self.assertRedirectToLogin(reverse( 'avisstage:stage_edit', kwargs={'pk':self.cstage1.id})) - + self.assertRedirectToLogin(reverse( 'avisstage:stage_edit', kwargs={'pk':self.astage1.id})) @@ -208,10 +207,10 @@ class ArchicubeViewsTest(ExperiENSTestCase): def test_stage_visibility_archi(self): self.assertPageNotFound(reverse('avisstage:stage', kwargs={'pk':self.cstage1.id})) - + self.assertPageNotFound(reverse('avisstage:stage', kwargs={'pk':self.cstage2.id})) - + testurl = reverse('avisstage:stage', kwargs={'pk':self.astage1.id}) r = self.client.get(testurl) @@ -230,13 +229,13 @@ class ArchicubeViewsTest(ExperiENSTestCase): r = self.client.get(testurl) self.assertEqual(r.status_code, 200) - + """ Vérifie que la recherche n'est pas accessible """ def test_pages_visibility_archi(self): self.assert403Archicubes(reverse('avisstage:recherche')) - + self.assert403Archicubes(reverse('avisstage:recherche_resultats')) self.assert403Archicubes(reverse('avisstage:stage_items')) @@ -260,20 +259,20 @@ class ArchicubeViewsTest(ExperiENSTestCase): "api_name": "v1"}) r = self.client.get(testurl) self.assertEqual(r.status_code, 200) - + testurl = reverse('avisstage:api_dispatch_list', kwargs={"resource_name": "stage", "api_name": "v1"}) r = self.client.get(testurl) self.assertEqual(r.status_code, 401) - + testurl = reverse('avisstage:api_dispatch_list', kwargs={"resource_name": "profil", "api_name": "v1"}) r = self.client.get(testurl) self.assertEqual(r.status_code, 401) - + """ Vérifie que le seul stage modifiable est le sien """ @@ -296,11 +295,11 @@ class ArchicubeViewsTest(ExperiENSTestCase): r = self.client.post(testurl, {"publier": True}) self.assertRedirects(r, reverse('avisstage:stage', kwargs={"pk": self.astage1.id})) - + testurl = reverse('avisstage:stage_ajout') r = self.client.get(testurl) self.assertEqual(r.status_code, 200) - + testurl = reverse('avisstage:profil_edit') r = self.client.get(testurl) self.assertEqual(r.status_code, 200) @@ -311,14 +310,14 @@ class ArchicubeViewsTest(ExperiENSTestCase): class DeprecatedArchicubeViewsTest(ArchicubeViewsTest): def setUp(self): super().setUp() - + self.sa_archi = SocialAccount(user=self.u_archi, provider="clipper", uid="archicube") self.sa_archi.save() deprecate_clippers() - + self.client.login(username='archicube', password='archicube') @@ -330,7 +329,7 @@ ACCÈS EN SCOLARITE class ScolariteViewsTest(ExperiENSTestCase): def setUp(self): super().setUp() - + self.u_vieuxcon = User.objects.create_user('vieuxcon', 'vieuxcon@ens.fr', 'vieuxcon') @@ -344,7 +343,7 @@ class ScolariteViewsTest(ExperiENSTestCase): provider="clipper", uid="vieuxcon") self.sa_vieuxcon.save() - + self.vstage1 = Stage(auteur=self.p_vieuxcon, sujet="Oubliettes", date_debut=date(1998, 5, 10), date_fin=date(1998, 8, 26), @@ -355,7 +354,7 @@ class ScolariteViewsTest(ExperiENSTestCase): alieu1 = AvisLieu(stage=self.vstage1, lieu=self.lieu2, chapo="Pas si mal") alieu1.save() - + self.client.login(username='vieuxcon', password='vieuxcon') """ @@ -370,7 +369,7 @@ class ScolariteViewsTest(ExperiENSTestCase): self.assertPageNotFound(reverse('avisstage:stage', kwargs={'pk':self.cstage2.id})) - + testurl = reverse('avisstage:stage', kwargs={'pk':self.vstage1.id}) r = self.client.get(testurl) @@ -398,7 +397,7 @@ class ScolariteViewsTest(ExperiENSTestCase): r = self.client.get(testurl) self.assertEqual(r.status_code, 200) - + """ Vérifie que la recherche et les autres pages sont accessible """ @@ -442,7 +441,7 @@ class ScolariteViewsTest(ExperiENSTestCase): "api_name": "v1"}) r = self.client.get(testurl) self.assertEqual(r.status_code, 200) - + testurl = reverse('avisstage:api_dispatch_list', kwargs={"resource_name": "stage", "api_name": "v1"}) @@ -450,14 +449,14 @@ class ScolariteViewsTest(ExperiENSTestCase): self.assertEqual(r.status_code, 200) self.assertContains(r, "Wingardium Leviosa") # Public self.assertNotContains(r, "Avada Kedavra") # Brouillon - + testurl = reverse('avisstage:api_dispatch_list', kwargs={"resource_name": "profil", "api_name": "v1"}) r = self.client.get(testurl) self.assertEqual(r.status_code, 200) - + """ Vérifie que le seul stage modifiable est le sien """ @@ -469,7 +468,7 @@ class ScolariteViewsTest(ExperiENSTestCase): testurl = reverse('avisstage:stage_edit', kwargs={'pk':self.astage1.id}) r = self.client.get(testurl) self.assertEqual(r.status_code, 403) - + testurl = reverse('avisstage:stage_edit', kwargs={'pk':self.vstage1.id}) r = self.client.get(testurl) self.assertEqual(r.status_code, 200) @@ -484,11 +483,11 @@ class ScolariteViewsTest(ExperiENSTestCase): r = self.client.post(testurl, {"publier": True}) self.assertRedirects(r, reverse('avisstage:stage', kwargs={"pk": self.vstage1.id})) - + testurl = reverse('avisstage:stage_ajout') r = self.client.get(testurl) self.assertEqual(r.status_code, 200) - + testurl = reverse('avisstage:profil_edit') r = self.client.get(testurl) self.assertEqual(r.status_code, 200) diff --git a/avisstage/utils.py b/avisstage/utils.py index 9aad26d..44c25a0 100644 --- a/avisstage/utils.py +++ b/avisstage/utils.py @@ -1,6 +1,5 @@ # coding: utf-8 -from allauth.socialaccount.models import SocialAccount from functools import reduce from math import cos, radians, sqrt diff --git a/avisstage/views.py b/avisstage/views.py index 2bcb19c..4e4996e 100644 --- a/avisstage/views.py +++ b/avisstage/views.py @@ -2,7 +2,7 @@ from django.shortcuts import render, redirect, get_object_or_404 -from django.views.generic import DetailView, ListView +from django.views.generic import DetailView from django.views.generic.edit import UpdateView, CreateView from django import forms from django.urls import reverse @@ -58,7 +58,7 @@ class ProfilView(LoginRequiredMixin, DetailView): # Récupération du profil def get_object(self): - + # Restriction d'accès pour les archicubes if (en_scolarite(self.request.user) or self.kwargs.get('username') == self.request.user.username): @@ -76,7 +76,7 @@ class StageView(LoginRequiredMixin, DetailView): # Restriction aux stages publics ou personnels def get_queryset(self): filtre = Q(auteur__user_id=self.request.user.id) - + # Restriction d'accès pour les archicubes if en_scolarite(self.request.user): filtre |= Q(public=True) @@ -106,7 +106,7 @@ class ProfilEdit(LoginRequiredMixin, UpdateView): # Limitation à son propre profil def get_object(self): return self.request.user.profil - + def get_success_url(self): return reverse('avisstage:perso') @@ -179,7 +179,7 @@ def manage_stage(request, pk=None): @login_required def save_lieu(request): normalien = request.user.profil - + if request.method == "POST": pk = request.POST.get("id", None) #print(request.POST) @@ -198,7 +198,7 @@ def save_lieu(request): lieu = Lieu() # Servira à bouger un peu le lieu jitter = True - + # Lecture des données form = LieuForm(request.POST, instance=lieu) @@ -222,7 +222,7 @@ def save_lieu(request): olieu.ville == lieu.ville and \ olieu.pays == lieu.pays: return JsonResponse({"success": True, "id": olieu.id}) - + lieu.save() return JsonResponse({"success": True, "id": lieu.id}) else: @@ -270,7 +270,7 @@ def publier_stage(request, pk): stage.public = False stage.save() - + return redirect(reverse("avisstage:stage", kwargs={"pk": pk})) # diff --git a/avisstage/views_search.py b/avisstage/views_search.py index bedc8a1..62c60fe 100644 --- a/avisstage/views_search.py +++ b/avisstage/views_search.py @@ -9,7 +9,7 @@ from django.core.cache import cache from django.core.paginator import Paginator from django.db.models import Q, Case, When from django.http import JsonResponse, HttpResponseBadRequest -from django.shortcuts import render, redirect, get_object_or_404 +from django.shortcuts import render import json import logging @@ -32,7 +32,7 @@ class SearchForm(forms.Form): sujet = forms.CharField(label=u'À propos de', required=False) contexte = forms.CharField(label=u'Contexte (lieu, encadrant⋅e⋅s, structure)', required=False) - + 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) @@ -42,7 +42,7 @@ class SearchForm(forms.Form): niveau_scol = forms.ChoiceField(label="Année d'étude", choices=([('', u'')] + list(NIVEAU_SCOL_OPTIONS)), required=False) - + type_lieu = forms.ChoiceField(label=u"Type de lieu d'accueil", choices=([('', u'')] + list(TYPE_LIEU_OPTIONS)), @@ -105,7 +105,7 @@ def cherche(**kwargs): | Q(matieres__nom__icontains=generique) | Q(lieux__nom__icontains=generique)) - # Autres champs -> non fonctionnels + # Autres champs -> non fonctionnels if field_relevant("sujet") or field_relevant("contexte"): raise NotImplementedError( "ElasticSearch doit être activé pour ce type de recherche") @@ -113,7 +113,7 @@ def cherche(**kwargs): # # Filtres directs db # - + # Dates if field_relevant('avant_annee', False): dte = date(kwargs['avant_annee']+1, 1, 1) @@ -126,7 +126,7 @@ def cherche(**kwargs): # Type de stage if field_relevant('type_stage'): filtres &= Q(type_stage=kwargs["type_stage"]) - + if field_relevant('niveau_scol'): filtres &= Q(niveau_scol=kwargs["niveau_scol"]) @@ -134,7 +134,7 @@ def cherche(**kwargs): if field_relevant('type_lieu'): filtres &= Q(lieux__type_lieu=kwargs["type_lieu"]) - + # Application if USE_ELASTICSEARCH and use_dsl: filtres &= Q(id__in=[s.meta.id for s in dsl.scan()]) @@ -145,7 +145,7 @@ def cherche(**kwargs): if not use_dsl: kwargs['tri'] = '-date_maj' - + if field_relevant('tri') and kwargs['tri'] in ['-date_maj']: tri = kwargs['tri'] resultat = resultat.order_by(tri) @@ -223,7 +223,7 @@ def recherche_resultats(request): if request.GET.get("format") == "json": return JsonResponse({"stages": stages, "page": page, "num_pages": paginator.num_pages}) - + template_name = 'avisstage/recherche/resultats.html' if request.GET.get("format") == "raw": template_name = 'avisstage/recherche/stage_items.html'