fix rss date limit for API
[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 savoirs.rss import FilChercheurs
10 from chercheurs.models import Chercheur, Personne
11
12 STATUS_OK = 200
13 STATUS_ERROR = 400
14 STATUS_ERROR_PERMISSIONS = 403
15 STATUS_ERROR_NOT_FOUND = 404
16 STATUS_ERROR_BADMETHOD = 405
17
18 class 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
25 def api(request, pays=None, region=None, chercheur_id=None):
26 api = API(request)
27 if chercheur_id is not None:
28 return api.api_chercheur(chercheur_id)
29 elif pays is not None:
30 filter_pays = pays.split(',')
31 return api.api_chercheurs_liste(pays=filter_pays)
32 else:
33 return api.api_chercheurs_liste(region=region)
34
35 def 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
58
59 def dict_2_json(data):
60 return simplejson.dumps(data, indent=4)
61
62
63 class API:
64 def __init__(self, request):
65 self.request = request
66
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,])
71 #return api_return(STATUS_OK, data, True)
72
73
74 domaines_recherche = []
75 for dr in chercheur.domaines_recherche:
76 domaines_recherche.append(dr.nom)
77
78 # Groupes chercheur
79 groupes_chercheur = []
80 for gc in chercheur.groupes_chercheur:
81 groupes_chercheur.append(gc.nom)
82
83 # Expertises
84 expertises = []
85 for exp in chercheur.expertises.all():
86 expertises.append(
87 {"nom": "%s" % exp.nom,
88 "date": "%s" % exp.date,
89 "organisme_demandeur": "%s" % exp.organisme_demandeur,
90 "organisme_demandeur_visible": exp.organisme_demandeur_visible})
91
92 # Publications
93 publications = []
94 for pub in chercheur.publications.all():
95 publications.append(
96 {"auteurs": "%s" % pub.auteurs,
97 "titre": "%s" % pub.titre,
98 "revue": "%s" % pub.revue,
99 "annee": "%s" % pub.annee,
100 "editeur": "%s" % pub.editeur,
101 "lieu_edition": "%s" % pub.lieu_edition,
102 "nb_pages": "%s" % pub.nb_pages,
103 "url": "%s" % pub.url,
104 "publication_affichage": "%s" % pub.publication_affichage})
105
106 chercheur_details = [{"id": "%s" % chercheur.id,
107 "civilite": "%s" % chercheur.civilite,
108 "prenom": "%s" % chercheur.prenom,
109 "nom": "%s" % chercheur.nom,
110 "pays": "%s" % chercheur.pays,
111 "etablissement": "%s" % chercheur.etablissement_display,
112 "afficher_courriel": "%s" % chercheur.afficher_courriel,
113 "courriel": "%s" % chercheur.courriel,
114 "region": "%s" % chercheur.region.nom,
115 "statut": "%s" % chercheur.get_statut_display(),
116 "diplome": "%s" % chercheur.diplome,
117 "domaines_recherche": domaines_recherche,
118 "discipline": "%s" % chercheur.discipline,
119 "theme_recherche": "%s" % chercheur.theme_recherche,
120 "equipe_recherche": "%s" % chercheur.equipe_recherche,
121 "mots_cles": "%s" % chercheur.mots_cles,
122 "url_site_web": "%s" % chercheur.url_site_web,
123 "url_blog": "%s" % chercheur.url_blog,
124 "url_reseau_social": "%s" % chercheur.url_reseau_social,
125 "membre_instance_auf": chercheur.membre_instance_auf,
126 "expert_oif": chercheur.expert_oif,
127 "membre_association_francophone": chercheur.membre_association_francophone,
128 "membre_reseau_institutionnel": chercheur.membre_reseau_institutionnel,
129 "membre_instance_auf_nom": "%s" % chercheur.get_membre_instance_auf_nom_display(),
130 "membre_instance_auf_fonction": "%s" % chercheur.membre_instance_auf_fonction,
131 "membre_instance_auf_dates": "%s" % chercheur.membre_instance_auf_dates,
132 "expert_oif_details": "%s" % chercheur.expert_oif_details,
133 "expert_oif_dates": "%s" % chercheur.expert_oif_dates,
134 "membre_association_francophone_details": "%s" % chercheur.membre_association_francophone_details,
135 "membre_reseau_institutionnel_nom": "%s" %
136 chercheur.get_membre_reseau_institutionnel_nom_display(),
137 "membre_reseau_institutionnel_fonction": "%s" % chercheur.membre_reseau_institutionnel_fonction,
138 "membre_reseau_institionnel_dates": "%s" % chercheur.membre_reseau_institutionnel_dates,
139 "expertises": expertises,
140 "expertises_auf": chercheur.expertises_auf,
141 "publications": publications}]
142
143 if chercheur.these:
144 details_pop = chercheur_details.pop(0)
145 details_pop.update(
146 {"these" : "%s" % chercheur.these,
147 "these_url": "%s" % chercheur.these.url,
148 "these_titre": "%s" % chercheur.these.titre,
149 "these_etablissement": "%s" % chercheur.these.etablissement,
150 "these_annee": "%s" % chercheur.these.annee,
151 "these_nb_pages": "%s" % chercheur.these.nb_pages,
152 "these_directeur": "%s" % chercheur.these.directeur,
153 })
154 chercheur_details.append(details_pop)
155 return api_return(STATUS_OK, dict_2_json(chercheur_details), True)
156
157 def api_chercheurs_liste(self, pays=None, region=None):
158 if pays is not None:
159 chercheurs = Chercheur.objects.filter(etablissement__pays__in=[pays])|Chercheur.objects.filter(etablissement_autre_pays__in=pays)
160 elif region is not None:
161 chercheurs = Chercheur.objects.filter_region(region)
162 else:
163 return api_return(STATUS_ERROR, "Erreur dans la requete de recherche de chercheurs")
164
165 return api_return(STATUS_OK, dict_2_json(
166 [{"id": "%s" % c.id,
167 "nom": "%s" % c.nom,
168 "prenom": "%s" % c.prenom,
169 "etablissement": "%s" % c.etablissement,
170 "pays": "%s" % c.pays}
171 for c in chercheurs]), json=True)