api recherche
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / chercheurs / api.py
CommitLineData
bf563475 1# -*- encoding: utf-8 -*
f41337c8 2
bf563475 3from django.http import HttpResponse
5b3ac131
NBV
4from django.shortcuts import get_object_or_404
5
776eadeb
NBV
6from django.utils import simplejson
7
68eafe9e 8from savoirs.rss import FilChercheurs
f41337c8
OL
9from auf.django.references import models as ref
10from chercheurs.models import Chercheur
11from chercheurs.forms import ChercheurSearchForm
bf563475
NBV
12
13STATUS_OK = 200
14STATUS_ERROR = 400
15STATUS_ERROR_PERMISSIONS = 403
16STATUS_ERROR_NOT_FOUND = 404
17STATUS_ERROR_BADMETHOD = 405
18
f41337c8
OL
19def recherche(request):
20 """
21 API spéciale de recherche pour retourner une structure de données complète
22 par rapport au RSS.
23 """
24 search_form = ChercheurSearchForm(request.GET)
25 search = search_form.save(commit=False)
26 data = []
27
28 # S'assure qu'un filtre existe au moins
29 no_criterion = True
30 for criterion, val in request.GET.items():
31 if val not in (None, u'', ''):
32 no_criterion = False
33 break
34 if no_criterion:
35 return api_return(STATUS_ERROR, 'no criterion', True)
36
37 # run() de ChercheurSearchForm()
38 results = Chercheur.objects
39 if search.q:
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)
45 if search.discipline:
46 results = results.filter_discipline(search.discipline)
47 if search.region:
48 results = results.filter_region(search.region)
49 if search.statut:
50 if search.statut == "expert":
51 results = results.filter_expert()
52 else:
53 results = results.filter_statut(search.statut)
54 if search.domaine:
55 results = results.filter_groupe(search.domaine)
56 if search.pays:
57 results = results.filter_pays(search.pays)
58 if search.nord_sud:
59 results = results.filter_nord_sud(search.nord_sud)
60 if search.genre:
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)
70
71 # sous-ensemble de pays
72 limitation_pays = request.GET.get('limitation_pays', None)
73
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)
77
78 for chercheur in results.all():
79 data.append(chercheur_2_dict(chercheur))
80
81 return api_return(STATUS_OK, dict_2_json(data), True)
68eafe9e 82
68eafe9e 83
776eadeb 84def api(request, pays=None, region=None, chercheur_id=None):
bf563475 85 api = API(request)
776eadeb
NBV
86 if chercheur_id is not None:
87 return api.api_chercheur(chercheur_id)
3f4f9c9c 88 elif pays is not None:
6cb88817 89 filter_pays = pays.split(',')
3f4f9c9c
NBV
90 return api.api_chercheurs_liste(pays=filter_pays)
91 else:
92 return api.api_chercheurs_liste(region=region)
bf563475
NBV
93
94def api_return(status, text='', json=False):
95 content_type = 'text/html'
96 if status == STATUS_OK and json:
97 content_type = 'text/json'
98 if text is None:
99 if status == STATUS_ERROR:
100 text = '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:
108 text = 'OK'
109
110 r = HttpResponse(status=status, content=text, content_type=content_type)
111
112 if status == STATUS_ERROR_BADMETHOD:
113 r.Allow = 'POST'
114
115 return r
116
3a91ea07
OL
117
118def dict_2_json(data):
119 return simplejson.dumps(data, indent=4)
120
121
f41337c8
OL
122def chercheur_2_dict(chercheur):
123 """
124 Structure flat d'un chercheur pour JSON
125 """
126 # Domaines de recherche du chercheur
127 domaines_recherche = []
128 for dr in chercheur.domaines_recherche:
129 domaines_recherche.append(dr.nom)
130
131 # Groupes chercheur
132 groupes_chercheur = []
133 for gc in chercheur.groupes_chercheur:
134 groupes_chercheur.append(gc.nom)
135
136 # Expertises
137 expertises = []
138 for exp in chercheur.expertises.all():
139 expertises.append(
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})
144
145 # Publications
146 publications = []
147 for pub in chercheur.publications.all():
148 publications.append(
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})
158
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}
196
197 # devrait faire le lookup
198 try:
199 if chercheur.these:
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,
207 }
208 except:
209 pass
210 return chercheur_details
211
212
bf563475
NBV
213class API:
214 def __init__(self, request):
215 self.request = request
216
776eadeb
NBV
217 def api_chercheur(self, chercheur_id):
218 chercheur = get_object_or_404(Chercheur, id=chercheur_id)
f41337c8 219 chercheur_details = chercheur_2_dict(chercheur)
3a91ea07 220 return api_return(STATUS_OK, dict_2_json(chercheur_details), True)
5b3ac131 221
d2a13dcd 222
776eadeb 223 def api_chercheurs_liste(self, pays=None, region=None):
bf563475 224 if pays is not None:
d2a13dcd 225 chercheurs = Chercheur.objects.filter(etablissement__pays__in=pays) | Chercheur.objects.filter(etablissement_autre_pays__in=pays)
87567c72 226 elif region is not None:
ebde48e0 227 chercheurs = Chercheur.objects.filter_region(region)
bf563475
NBV
228 else:
229 return api_return(STATUS_ERROR, "Erreur dans la requete de recherche de chercheurs")
230
d2a13dcd
OL
231 results = []
232 for c in chercheurs:
233 if c.etablissement_autre_pays is not None:
234 etablissement_autre_pays_nom = c.etablissement_autre_pays.nom
235 else:
236 etablissement_autre_pays_nom = None
237
238 data = {"id": "%s" % c.id,
776eadeb
NBV
239 "nom": "%s" % c.nom,
240 "prenom": "%s" % c.prenom,
94441576
NBV
241 "etablissement": "%s" % c.etablissement_display,
242 "etablissement_autre_nom": "%s" % c.etablissement_autre_nom,
243 "pays": "%s" % c.pays.nom,
d2a13dcd
OL
244 "etablissement_pays_autre_nom": "%s" % etablissement_autre_pays_nom}
245 results.append(data)
246
247 return api_return(STATUS_OK, dict_2_json(results), json=True)
248