def index(request): """ Répertoire des chercheurs """ search_form = ChercheurSearchForm(request.GET) if search_form.is_valid(): search = search_form.save(commit=False) else: raise Http404 chercheurs = search.run().select_related('etablissement') sort = request.GET.get('tri') if sort is not None and sort.endswith('_desc'): sort = sort[:-5] direction = '-' else: direction = '' if sort == 'nom': chercheurs = chercheurs.order_by_nom(direction) elif sort == 'etablissement': chercheurs = chercheurs.order_by_etablissement(direction) elif sort == 'pays': chercheurs = chercheurs.order_by_pays(direction) else: chercheurs = chercheurs.order_by('-date_modification') try: p = PageStatique.objects.get(id='repertoire') entete = p.contenu except PageStatique.DoesNotExist: entete = u'<h1>Répertoire des chercheurs</h1>' nb_chercheurs = chercheurs.count() return render(request, "chercheurs/index.html", { 'chercheurs': chercheurs, 'nb_chercheurs': nb_chercheurs, 'search_form': search_form, 'entete': entete })
def recherche(request): """ API spéciale de recherche pour retourner une structure de données complète par rapport au RSS. """ search_form = ChercheurSearchForm(request.GET) search = search_form.save(commit=False) data = [] # S'assure qu'un filtre existe au moins no_criterion = True for criterion, val in request.GET.items(): if val not in (None, u'', ''): no_criterion = False break if no_criterion: return api_return(STATUS_ERROR, 'no criterion', True) # run() de ChercheurSearchForm() results = Chercheur.objects if search.q: results = results.search(search.q) if search.nom_chercheur: results = results.add_to_query('@(nom,prenom) ' + search.nom_chercheur) if search.equipe_recherche: results = results.add_to_query('@equipe_recherche ' + search.equipe_recherche) if search.discipline: results = results.filter_discipline(search.discipline) if search.region: results = results.filter_region(search.region) if search.statut: if search.statut == "expert": results = results.filter_expert() else: results = results.filter_statut(search.statut) if search.domaine: results = results.filter_groupe(search.domaine) if search.pays: results = results.filter_pays(search.pays) if search.nord_sud: results = results.filter_nord_sud(search.nord_sud) if search.genre: results = results.filter_genre(search.genre) if search.activites_francophonie == 'instance_auf': results = results.filter(membre_instance_auf=True) elif search.activites_francophonie == 'expert_oif': results = results.filter(expert_oif=True) elif search.activites_francophonie == 'association_francophone': results = results.filter(membre_association_francophone=True) elif search.activites_francophonie == 'reseau_institutionnel': results = results.filter(membre_reseau_institutionnel=True) # sous-ensemble de pays limitation_pays = request.GET.get('limitation_pays', None) if limitation_pays is not None: pays = [ref.Pays.objects.get(code=pays_code) for pays_code in limitation_pays.split(',')] results = results.filter_pays(pays) for chercheur in results.all(): data.append(chercheur_2_dict(chercheur)) return api_return(STATUS_OK, dict_2_json(data), True)