ajout filtre json ; systeme de template dans .py a part
[restcoda.git] / rest.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 import sys, traceback
5
6 # configuration (codes d'accès à la base MS-SQL)
7 sys.path.append('/home/thomas/public_html/')
8 import rest_config
9
10 # pour savoir quel objet interroger : Routes
11 from routes import Mapper
12 from routes.middleware import RoutesMiddleware
13
14 # Gestion des erreurs
15 from jinja.exceptions import TemplateNotFound
16 from objet import ObjetInconnu
17
18 # TODO : ajouter un middleware de cache (beaker, basé sur REQUEST_URI quand la methode est GET)
19 # from beaker.middleware import CacheMiddleware
20
21 # content-type correspondant a certains formats
22 contenttype = { 'xml': 'application/xml',
23 'rss': 'application/rss+xml',
24 'html': 'text/html',
25 'txt': 'text/plain',
26 'json': 'text/plain', # 'application/json',
27 'csv': 'text/csv',
28 'debug': 'text/plain' }
29
30 # les routes RESTful (cf http://routes.groovie.org/manual.html#restful-services)
31 mapper = Mapper()
32 mapper.resource('demlog','demlog')
33 mapper.resource('comlog','comlog')
34 mapper.resource('demdep','demdep')
35 mapper.resource('comdep','comdep')
36 mapper.resource('dempub','dempub')
37 mapper.resource('compub','compub')
38 mapper.resource('comare','comare')
39 mapper.resource('comarei','comare:(impl)',controller='comare') # pour les comarexxx où xxx est un code d'implantation
40 mapper.resource('comsre','comsre')
41 mapper.resource('comsrei','comsre:(impl)',controller='comsre')
42 mapper.resource('comxre','comxre') # comxre = comare + comsre
43 mapper.resource('comxrei','comxre:(impl)',controller='comxre')
44 mapper.resource('dem','dem')
45 mapper.resource('com','com')
46 mapper.resource('utilisateur','utilisateur')
47 mapper.resource('fournisseur','fournisseur')
48 mapper.resource('budget','budget')
49
50 # objets disponibles
51 from document import demlog, comlog, demdep, comdep, dempub, compub, comare, comsre, comxre, dem, com
52 from utilisateur import utilisateur
53 from fournisseur import fournisseur
54 from budget import budget
55
56 def dispatcher(environ, start_response):
57 """dispatch vers la bonne methode du bon objet, et retour WSGI"""
58 results = environ['wsgiorg.routing_args'][1] # résultat du middleware Routes
59 try:
60 # On cherche l'objet puis la méthode
61 target_class = globals()[results['controller']]
62 method = getattr(target_class,results['action'])
63 except:
64 # Si erreur pendant la recherche, on renvoie un 501
65 start_response("501 Not Implemented", [('Content-type', 'text/html; charset=utf-8')])
66 return '<html><body><h2>501 objet ou action invalide</h2></body></html>' # <pre>%s: %s\n%s</pre></body></html>' % ( sys.exc_info()[0] , sys.exc_info()[1] , traceback.format_exc())
67 try:
68 # On lance la méthode et on renvoie le résultat
69 type, output = method(target_class(environ))
70 start_response("200 OK", [('Content-type', contenttype.get(type,'text/plain') + "; charset=utf-8")])
71 return output.encode('utf-8')
72 # gestion des problèmes possibles pendant l'exécution
73 except ObjetInconnu, type:
74 start_response("404 Not Found", [('Content-type', 'text/html; charset=utf-8')])
75 return '<html><body><h2>404 %s inexistant</h2></body></html>' % type
76 except TemplateNotFound, template:
77 start_response("415 Unsupported Media Type", [('Content-type', 'text/html; charset=utf-8')])
78 return '<html><body><h2>415 format non supporté (%s inexistant)</h2></body></html>' % template
79 except:
80 start_response("500 INTERNAL ERROR", [('Content-type', 'text/html; charset=utf-8')])
81 return '<html><body><h2>500 erreur lors du traitement</h2><pre>%s: %s\n%s</pre></body></html>' % ( sys.exc_info()[0] , sys.exc_info()[1] , traceback.format_exc())
82
83
84 # application() sera lancée par mod_wsgi : on route et on dispatche
85 application = RoutesMiddleware( dispatcher, mapper )
86
87