1 # -*- encoding: utf-8 -*
3 from django
.http
import HttpResponse
4 from django
.shortcuts
import get_object_or_404
6 from django
.utils
import simplejson
8 from savoirs
.rss
import FilChercheurs
9 from auf
.django
.references
import models
as ref
10 from chercheurs
.models
import Chercheur
11 from chercheurs
.forms
import ChercheurSearchForm
15 STATUS_ERROR_PERMISSIONS
= 403
16 STATUS_ERROR_NOT_FOUND
= 404
17 STATUS_ERROR_BADMETHOD
= 405
19 def recherche(request
):
21 API spéciale de recherche pour retourner une structure de données complète
24 search_form
= ChercheurSearchForm(request
.GET
)
25 search
= search_form
.save(commit
=False)
28 # S'assure qu'un filtre existe au moins
30 for criterion
, val
in request
.GET
.items():
31 if val
not in (None, u
'', ''):
35 return api_return(STATUS_ERROR
, 'no criterion', True)
37 # run() de ChercheurSearchForm()
38 results
= Chercheur
.objects
40 results
= results
.search(search
.q
)
41 if search
.nom_chercheur
:
42 results
= results
.add_to_query('@(nom,prenom) ' + search
.nom_chercheur
)
43 if search
.equipe_recherche
:
44 results
= results
.add_to_query('@equipe_recherche ' + search
.equipe_recherche
)
46 results
= results
.filter_discipline(search
.discipline
)
48 results
= results
.filter_region(search
.region
)
50 if search
.statut
== "expert":
51 results
= results
.filter_expert()
53 results
= results
.filter_statut(search
.statut
)
55 results
= results
.filter_groupe(search
.domaine
)
57 results
= results
.filter_pays(search
.pays
)
59 results
= results
.filter_nord_sud(search
.nord_sud
)
61 results
= results
.filter_genre(search
.genre
)
62 if search
.activites_francophonie
== 'instance_auf':
63 results
= results
.filter(membre_instance_auf
=True)
64 elif search
.activites_francophonie
== 'expert_oif':
65 results
= results
.filter(expert_oif
=True)
66 elif search
.activites_francophonie
== 'association_francophone':
67 results
= results
.filter(membre_association_francophone
=True)
68 elif search
.activites_francophonie
== 'reseau_institutionnel':
69 results
= results
.filter(membre_reseau_institutionnel
=True)
71 # sous-ensemble de pays
72 limitation_pays
= request
.GET
.get('limitation_pays', None)
74 if limitation_pays
is not None:
75 pays
= [ref
.Pays
.objects
.get(code
=pays_code
) for pays_code
in limitation_pays
.split(',')]
76 results
= results
.filter_pays(pays
)
78 for chercheur
in results
.all():
79 data
.append(chercheur_2_dict(chercheur
))
81 return api_return(STATUS_OK
, dict_2_json(data
), True)
84 def api(request
, pays
=None, region
=None, chercheur_id
=None):
86 if chercheur_id
is not None:
87 return api
.api_chercheur(chercheur_id
)
88 elif pays
is not None:
89 filter_pays
= pays
.split(',')
90 return api
.api_chercheurs_liste(pays
=filter_pays
)
92 return api
.api_chercheurs_liste(region
=region
)
94 def api_return(status
, text
='', json
=False):
95 content_type
= 'text/html'
96 if status
== STATUS_OK
and json
:
97 content_type
= 'text/json'
99 if status
== STATUS_ERROR
:
101 elif status
== STATUS_ERROR_NOT_FOUND
:
102 text
= 'Resource Not Found'
103 elif status
== STATUS_ERROR_PERMISSIONS
:
104 text
= 'Invalid username or password'
105 elif status
== STATUS_ERROR_BADMETHOD
:
106 text
= 'Invalid request method'
107 elif status
== STATUS_OK
:
110 r
= HttpResponse(status
=status
, content
=text
, content_type
=content_type
)
112 if status
== STATUS_ERROR_BADMETHOD
:
118 def dict_2_json(data
):
119 return simplejson
.dumps(data
, indent
=4)
122 def chercheur_2_dict(chercheur
):
124 Structure flat d'un chercheur pour JSON
126 # Domaines de recherche du chercheur
127 domaines_recherche
= []
128 for dr
in chercheur
.domaines_recherche
:
129 domaines_recherche
.append(dr
.nom
)
132 groupes_chercheur
= []
133 for gc
in chercheur
.groupes_chercheur
:
134 groupes_chercheur
.append(gc
.nom
)
138 for exp
in chercheur
.expertises
.all():
140 {'nom': '%s' % exp
.nom
,
141 'date': '%s' % exp
.date
,
142 'organisme_demandeur': '%s' % exp
.organisme_demandeur
,
143 'organisme_demandeur_visible': exp
.organisme_demandeur_visible
})
147 for pub
in chercheur
.publications
.all():
149 {'auteurs': '%s' % pub
.auteurs
,
150 'titre': '%s' % pub
.titre
,
151 'revue': '%s' % pub
.revue
,
152 'annee': '%s' % pub
.annee
,
153 'editeur': '%s' % pub
.editeur
,
154 'lieu_edition': '%s' % pub
.lieu_edition
,
155 'nb_pages': '%s' % pub
.nb_pages
,
156 'url': '%s' % pub
.url
,
157 'publication_affichage': '%s' % pub
.publication_affichage
})
159 chercheur_details
= {'id': '%s' % chercheur
.id,
160 'civilite': '%s' % chercheur
.civilite
,
161 'prenom': '%s' % chercheur
.prenom
,
162 'nom': '%s' % chercheur
.nom
,
163 'pays': '%s' % chercheur
.pays
,
164 'pays_code': '%s' % chercheur
.pays
.code
,
165 'etablissement': '%s' % chercheur
.etablissement_display
,
166 'afficher_courriel': '%s' % chercheur
.afficher_courriel
,
167 'courriel': '%s' % chercheur
.courriel_display(),
168 'region': '%s' % chercheur
.region
.nom
,
169 'statut': '%s' % chercheur
.get_statut_display(),
170 'diplome': '%s' % chercheur
.diplome
,
171 'domaines_recherche': domaines_recherche
,
172 'discipline': '%s' % chercheur
.discipline
,
173 'theme_recherche': '%s' % chercheur
.theme_recherche
,
174 'equipe_recherche': '%s' % chercheur
.equipe_recherche
,
175 'mots_cles': '%s' % chercheur
.mots_cles
,
176 'url_site_web': '%s' % chercheur
.url_site_web
,
177 'url_blog': '%s' % chercheur
.url_blog
,
178 'url_reseau_social': '%s' % chercheur
.url_reseau_social
,
179 'membre_instance_auf': chercheur
.membre_instance_auf
,
180 'expert_oif': chercheur
.expert_oif
,
181 'membre_association_francophone': chercheur
.membre_association_francophone
,
182 'membre_reseau_institutionnel': chercheur
.membre_reseau_institutionnel
,
183 'membre_instance_auf_nom': '%s' % chercheur
.get_membre_instance_auf_nom_display(),
184 'membre_instance_auf_fonction': '%s' % chercheur
.membre_instance_auf_fonction
,
185 'membre_instance_auf_dates': '%s' % chercheur
.membre_instance_auf_dates
,
186 'expert_oif_details': '%s' % chercheur
.expert_oif_details
,
187 'expert_oif_dates': '%s' % chercheur
.expert_oif_dates
,
188 'membre_association_francophone_details': '%s' % chercheur
.membre_association_francophone_details
,
189 'membre_reseau_institutionnel_nom': '%s' %
190 chercheur
.get_membre_reseau_institutionnel_nom_display(),
191 "membre_reseau_institutionnel_fonction": "%s" % chercheur
.membre_reseau_institutionnel_fonction
,
192 "membre_reseau_institionnel_dates": "%s" % chercheur
.membre_reseau_institutionnel_dates
,
193 "expertises": expertises
,
194 "expertises_auf": chercheur
.expertises_auf
,
195 "publications": publications
}
197 # devrait faire le lookup
200 chercheur_details
['these'] = {"these" : "%s" % chercheur
.these
,
201 "these_url": "%s" % chercheur
.these
.url
,
202 "these_titre": "%s" % chercheur
.these
.titre
,
203 "these_etablissement": "%s" % chercheur
.these
.etablissement
,
204 "these_annee": "%s" % chercheur
.these
.annee
,
205 "these_nb_pages": "%s" % chercheur
.these
.nb_pages
,
206 "these_directeur": "%s" % chercheur
.these
.directeur
,
210 return chercheur_details
214 def __init__(self
, request
):
215 self
.request
= request
217 def api_chercheur(self
, chercheur_id
):
218 chercheur
= get_object_or_404(Chercheur
, id=chercheur_id
)
219 chercheur_details
= chercheur_2_dict(chercheur
)
220 return api_return(STATUS_OK
, dict_2_json(chercheur_details
), True)
223 def api_chercheurs_liste(self
, pays
=None, region
=None):
225 chercheurs
= Chercheur
.objects
.filter(etablissement__pays__in
=pays
) | Chercheur
.objects
.filter(etablissement_autre_pays__in
=pays
)
226 elif region
is not None:
227 chercheurs
= Chercheur
.objects
.filter_region(region
)
229 return api_return(STATUS_ERROR
, "Erreur dans la requete de recherche de chercheurs")
233 if c
.etablissement_autre_pays
is not None:
234 etablissement_autre_pays_nom
= c
.etablissement_autre_pays
.nom
236 etablissement_autre_pays_nom
= None
238 if c
.etablissement
is not None:
239 etablissement
= c
.etablissement
.nom
241 etablissement
= c
.etablissement_autre_nom
243 data
= {"id": "%s" % c
.id,
245 "prenom": "%s" % c
.prenom
,
246 "etablissement": "%s" % etablissement
,
247 "etablissement_autre_nom": "%s" % c
.etablissement_autre_nom
,
248 "pays": "%s" % c
.pays
.nom
,
249 "etablissement_pays_autre_nom": "%s" % etablissement_autre_pays_nom
}
252 return api_return(STATUS_OK
, dict_2_json(results
), json
=True)