Corrections erreurs affichage none
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / chercheurs / api.py
CommitLineData
bf563475
NBV
1# -*- encoding: utf-8 -*
2from django.http import HttpResponse
3from django.core import serializers
5b3ac131
NBV
4from django.shortcuts import get_object_or_404
5
776eadeb
NBV
6from django.utils import simplejson
7
3f4f9c9c 8from savoirs.models import Region
68eafe9e 9from savoirs.rss import FilChercheurs
776eadeb 10from chercheurs.models import Chercheur, Personne
bf563475
NBV
11
12STATUS_OK = 200
13STATUS_ERROR = 400
14STATUS_ERROR_PERMISSIONS = 403
15STATUS_ERROR_NOT_FOUND = 404
16STATUS_ERROR_BADMETHOD = 405
17
68eafe9e
OL
18class APIFilChercheurs(FilChercheurs):
19 description = "Pour services tiers"
20
21 def items(self, search):
22 """Pas de limite temporelle"""
23 return search.run().order_by('-date_modification')
24
776eadeb 25def api(request, pays=None, region=None, chercheur_id=None):
bf563475 26 api = API(request)
776eadeb
NBV
27 if chercheur_id is not None:
28 return api.api_chercheur(chercheur_id)
3f4f9c9c 29 elif pays is not None:
6cb88817 30 filter_pays = pays.split(',')
3f4f9c9c
NBV
31 return api.api_chercheurs_liste(pays=filter_pays)
32 else:
33 return api.api_chercheurs_liste(region=region)
bf563475
NBV
34
35def api_return(status, text='', json=False):
36 content_type = 'text/html'
37 if status == STATUS_OK and json:
38 content_type = 'text/json'
39 if text is None:
40 if status == STATUS_ERROR:
41 text = 'Error'
42 elif status == STATUS_ERROR_NOT_FOUND:
43 text = 'Resource Not Found'
44 elif status == STATUS_ERROR_PERMISSIONS:
45 text = 'Invalid username or password'
46 elif status == STATUS_ERROR_BADMETHOD:
47 text = 'Invalid request method'
48 elif status == STATUS_OK:
49 text = 'OK'
50
51 r = HttpResponse(status=status, content=text, content_type=content_type)
52
53 if status == STATUS_ERROR_BADMETHOD:
54 r.Allow = 'POST'
55
56 return r
57
3a91ea07
OL
58
59def dict_2_json(data):
60 return simplejson.dumps(data, indent=4)
61
62
bf563475
NBV
63class API:
64 def __init__(self, request):
65 self.request = request
66
776eadeb
NBV
67 def api_chercheur(self, chercheur_id):
68 chercheur = get_object_or_404(Chercheur, id=chercheur_id)
69 # Domaines de recherche du chercheur
70 data = serializers.serialize('json', [chercheur,])
776eadeb
NBV
71
72 domaines_recherche = []
73 for dr in chercheur.domaines_recherche:
74 domaines_recherche.append(dr.nom)
75
76 # Groupes chercheur
77 groupes_chercheur = []
78 for gc in chercheur.groupes_chercheur:
79 groupes_chercheur.append(gc.nom)
80
81 # Expertises
82 expertises = []
83 for exp in chercheur.expertises.all():
84 expertises.append(
94441576
NBV
85 {'nom': '%s' % exp.nom,
86 'date': '%s' % exp.date,
87 'organisme_demandeur': '%s' % exp.organisme_demandeur,
88 'organisme_demandeur_visible': exp.organisme_demandeur_visible})
776eadeb
NBV
89
90 # Publications
91 publications = []
92 for pub in chercheur.publications.all():
93 publications.append(
94441576
NBV
94 {'auteurs': '%s' % pub.auteurs,
95 'titre': '%s' % pub.titre,
96 'revue': '%s' % pub.revue,
97 'annee': '%s' % pub.annee,
98 'editeur': '%s' % pub.editeur,
99 'lieu_edition': '%s' % pub.lieu_edition,
100 'nb_pages': '%s' % pub.nb_pages,
101 'url': '%s' % pub.url,
102 'publication_affichage': '%s' % pub.publication_affichage})
103
104 chercheur_details = [{'id': '%s' % chercheur.id,
105 'civilite': '%s' % chercheur.civilite,
106 'prenom': '%s' % chercheur.prenom,
107 'nom': '%s' % chercheur.nom,
108 'pays': '%s' % chercheur.pays,
3b2b3f11 109 'pays_code': '%s' % chercheur.pays.code,
94441576
NBV
110 'etablissement': '%s' % chercheur.etablissement_display,
111 'afficher_courriel': '%s' % chercheur.afficher_courriel,
257d1c26 112 'courriel': '%s' % chercheur.courriel_display(),
94441576
NBV
113 'region': '%s' % chercheur.region.nom,
114 'statut': '%s' % chercheur.get_statut_display(),
115 'diplome': '%s' % chercheur.diplome,
116 'domaines_recherche': domaines_recherche,
117 'discipline': '%s' % chercheur.discipline,
118 'theme_recherche': '%s' % chercheur.theme_recherche,
119 'equipe_recherche': '%s' % chercheur.equipe_recherche,
120 'mots_cles': '%s' % chercheur.mots_cles,
121 'url_site_web': '%s' % chercheur.url_site_web,
122 'url_blog': '%s' % chercheur.url_blog,
123 'url_reseau_social': '%s' % chercheur.url_reseau_social,
124 'membre_instance_auf': chercheur.membre_instance_auf,
125 'expert_oif': chercheur.expert_oif,
126 'membre_association_francophone': chercheur.membre_association_francophone,
127 'membre_reseau_institutionnel': chercheur.membre_reseau_institutionnel,
128 'membre_instance_auf_nom': '%s' % chercheur.get_membre_instance_auf_nom_display(),
129 'membre_instance_auf_fonction': '%s' % chercheur.membre_instance_auf_fonction,
130 'membre_instance_auf_dates': '%s' % chercheur.membre_instance_auf_dates,
131 'expert_oif_details': '%s' % chercheur.expert_oif_details,
132 'expert_oif_dates': '%s' % chercheur.expert_oif_dates,
133 'membre_association_francophone_details': '%s' % chercheur.membre_association_francophone_details,
134 'membre_reseau_institutionnel_nom': '%s' %
6d09d5c1 135 chercheur.get_membre_reseau_institutionnel_nom_display(),
776eadeb
NBV
136 "membre_reseau_institutionnel_fonction": "%s" % chercheur.membre_reseau_institutionnel_fonction,
137 "membre_reseau_institionnel_dates": "%s" % chercheur.membre_reseau_institutionnel_dates,
138 "expertises": expertises,
159c3d76 139 "expertises_auf": chercheur.expertises_auf,
cbbc5606
OL
140 "publications": publications}]
141
142 # devrait faire le lookup
d02673a5
NBV
143 try:
144 if chercheur.these:
145 details_pop = chercheur_details.pop(0)
146 details_pop.update(
147 {"these" : "%s" % chercheur.these,
148 "these_url": "%s" % chercheur.these.url,
149 "these_titre": "%s" % chercheur.these.titre,
150 "these_etablissement": "%s" % chercheur.these.etablissement,
151 "these_annee": "%s" % chercheur.these.annee,
152 "these_nb_pages": "%s" % chercheur.these.nb_pages,
153 "these_directeur": "%s" % chercheur.these.directeur,
154 })
776eadeb 155 chercheur_details.append(details_pop)
d02673a5 156 except:
cbbc5606
OL
157 pass
158
3a91ea07 159 return api_return(STATUS_OK, dict_2_json(chercheur_details), True)
5b3ac131 160
d2a13dcd 161
776eadeb 162 def api_chercheurs_liste(self, pays=None, region=None):
bf563475 163 if pays is not None:
d2a13dcd 164 chercheurs = Chercheur.objects.filter(etablissement__pays__in=pays) | Chercheur.objects.filter(etablissement_autre_pays__in=pays)
87567c72 165 elif region is not None:
ebde48e0 166 chercheurs = Chercheur.objects.filter_region(region)
bf563475
NBV
167 else:
168 return api_return(STATUS_ERROR, "Erreur dans la requete de recherche de chercheurs")
169
d2a13dcd 170 results = []
0f226d1e 171 for c in chercheurs:
d2a13dcd
OL
172 if c.etablissement_autre_pays is not None:
173 etablissement_autre_pays_nom = c.etablissement_autre_pays.nom
174 else:
175 etablissement_autre_pays_nom = None
0f226d1e
NBV
176
177 if c.etablissement is not None:
178 etablissement = c.etablissement.nom
179 else:
180 etablissement = c.etablissement_autre_nom
d2a13dcd
OL
181
182 data = {"id": "%s" % c.id,
776eadeb
NBV
183 "nom": "%s" % c.nom,
184 "prenom": "%s" % c.prenom,
0f226d1e 185 "etablissement": "%s" % etablissement,
94441576
NBV
186 "etablissement_autre_nom": "%s" % c.etablissement_autre_nom,
187 "pays": "%s" % c.pays.nom,
d2a13dcd
OL
188 "etablissement_pays_autre_nom": "%s" % etablissement_autre_pays_nom}
189 results.append(data)
190
191 return api_return(STATUS_OK, dict_2_json(results), json=True)
192