ajout infos buget et liaison dans document
[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 # formats de sortie autorisés, et content-type correspondant
22 formats = { 'xml': 'application/xml', 'html': 'text/html', 'txt': 'text/plain', 'json': 'application/json', 'rss': 'application/rss+xml', 'debug': 'text/plain' }
23
24
25 # les routes RESTful (cf http://routes.groovie.org/manual.html#restful-services)
26 mapper = Mapper()
27 mapper.resource('demlog','demlog')
28 mapper.resource('comlog','comlog')
29 mapper.resource('demdep','demdep')
30 mapper.resource('comdep','comdep')
31 mapper.resource('dempub','dempub')
32 mapper.resource('compub','compub')
33 mapper.resource('comare','comare')
34 mapper.resource('comarei','comare:(impl)',controller='comare') # pour les comarexxx où xxx est un code d'implantation
35 mapper.resource('comsre','comsre')
36 mapper.resource('comsrei','comsre:(impl)',controller='comsre')
37 mapper.resource('comxre','comxre') # comxre = comare + comsre
38 mapper.resource('comxrei','comxre:(impl)',controller='comxre')
39 mapper.resource('dem','dem')
40 mapper.resource('com','com')
41 mapper.resource('utilisateur','utilisateur')
42 mapper.resource('fournisseur','fournisseur')
43
44 # objets disponibles
45 from document import demlog, comlog, demdep, comdep, dempub, compub, comare, comsre, comxre, dem, com
46 from utilisateur import utilisateur
47 from fournisseur import fournisseur
48
49 def dispatcher(environ, start_response):
50 """dispatch vers la bonne methode du bon objet, et retour WSGI"""
51 results = environ['wsgiorg.routing_args'][1] # résultat du middleware Routes
52 try:
53 # On cherche l'objet puis la méthode
54 target_class = globals()[results['controller']]
55 method = getattr(target_class,results['action'])
56 except:
57 # Si erreur pendant la recherche, on renvoie un 501
58 start_response("501 Not Implemented", [('Content-type', 'text/html')])
59 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())
60 try:
61 # On lance la méthode et on renvoie le résultat
62 type, output = method(target_class(environ))
63 start_response("200 OK", [('Content-type', formats[type])])
64 return output.encode('utf-8')
65 # gestion des problèmes possibles pendant l'exécution
66 except ObjetInconnu, type:
67 start_response("404 Not Found", [('Content-type', 'text/html')])
68 return '<html><body><h2>404 %s inexistant</h2></body></html>' % type
69 except TemplateNotFound, template:
70 start_response("415 Unsupported Media Type", [('Content-type', 'text/html')])
71 return '<html><body><h2>415 format non supporté (%s inexistant)</h2></body></html>' % template
72 except:
73 start_response("500 INTERNAL ERROR", [('Content-type', 'text/html')])
74 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())
75
76
77 # application() sera lancée par mod_wsgi : on route et on dispatche
78 application = RoutesMiddleware( dispatcher, mapper )
79
80