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