fournisseur.show() renvoie toutes les adresses d'un fournisseur
[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': '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
49 # objets disponibles
50 from document import demlog, comlog, demdep, comdep, dempub, compub, comare, comsre, comxre, dem, com
51 from utilisateur import utilisateur
52 from fournisseur import fournisseur
53
54 def dispatcher(environ, start_response):
55 """dispatch vers la bonne methode du bon objet, et retour WSGI"""
56 results = environ['wsgiorg.routing_args'][1] # résultat du middleware Routes
57 try:
58 # On cherche l'objet puis la méthode
59 target_class = globals()[results['controller']]
60 method = getattr(target_class,results['action'])
61 except:
62 # Si erreur pendant la recherche, on renvoie un 501
63 start_response("501 Not Implemented", [('Content-type', 'text/html; charset=utf-8')])
64 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())
65 try:
66 # On lance la méthode et on renvoie le résultat
67 type, output = method(target_class(environ))
68 start_response("200 OK", [('Content-type', contenttype.get(type,'text/plain') + "; charset=utf-8")])
69 return output.encode('utf-8')
70 # gestion des problèmes possibles pendant l'exécution
71 except ObjetInconnu, type:
72 start_response("404 Not Found", [('Content-type', 'text/html; charset=utf-8')])
73 return '<html><body><h2>404 %s inexistant</h2></body></html>' % type
74 except TemplateNotFound, template:
75 start_response("415 Unsupported Media Type", [('Content-type', 'text/html; charset=utf-8')])
76 return '<html><body><h2>415 format non supporté (%s inexistant)</h2></body></html>' % template
77 except:
78 start_response("500 INTERNAL ERROR", [('Content-type', 'text/html; charset=utf-8')])
79 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())
80
81
82 # application() sera lancée par mod_wsgi : on route et on dispatche
83 application = RoutesMiddleware( dispatcher, mapper )
84
85