ajout infos buget et liaison dans document
[restcoda.git] / rest.py
CommitLineData
1795efcd
TN
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4import sys, traceback
5
a6627284
TN
6# configuration (codes d'accès à la base MS-SQL)
7sys.path.append('/home/thomas/public_html/')
8import rest_config
9
0a4c31d4 10# pour savoir quel objet interroger : Routes
1795efcd 11from routes import Mapper
a6627284 12from routes.middleware import RoutesMiddleware
1795efcd 13
30e64411
TN
14# Gestion des erreurs
15from jinja.exceptions import TemplateNotFound
65f02320 16from objet import ObjetInconnu
a6627284 17
30e64411 18# TODO : ajouter un middleware de cache (beaker, basé sur REQUEST_URI quand la methode est GET)
0a4c31d4 19# from beaker.middleware import CacheMiddleware
1795efcd 20
a6627284 21# formats de sortie autorisés, et content-type correspondant
f60ed9f0 22formats = { 'xml': 'application/xml', 'html': 'text/html', 'txt': 'text/plain', 'json': 'application/json', 'rss': 'application/rss+xml', 'debug': 'text/plain' }
30e64411 23
1795efcd 24
0a4c31d4 25# les routes RESTful (cf http://routes.groovie.org/manual.html#restful-services)
1795efcd 26mapper = Mapper()
0a4c31d4
TN
27mapper.resource('demlog','demlog')
28mapper.resource('comlog','comlog')
29mapper.resource('demdep','demdep')
30mapper.resource('comdep','comdep')
31mapper.resource('dempub','dempub')
32mapper.resource('compub','compub')
0a4c31d4 33mapper.resource('comare','comare')
85a89d99
TN
34mapper.resource('comarei','comare:(impl)',controller='comare') # pour les comarexxx où xxx est un code d'implantation
35mapper.resource('comsre','comsre')
36mapper.resource('comsrei','comsre:(impl)',controller='comsre')
37mapper.resource('comxre','comxre') # comxre = comare + comsre
38mapper.resource('comxrei','comxre:(impl)',controller='comxre')
f6b772ed
TN
39mapper.resource('dem','dem')
40mapper.resource('com','com')
ef44a84b 41mapper.resource('utilisateur','utilisateur')
d374db4d 42mapper.resource('fournisseur','fournisseur')
1795efcd 43
30e64411
TN
44# objets disponibles
45from document import demlog, comlog, demdep, comdep, dempub, compub, comare, comsre, comxre, dem, com
ef44a84b 46from utilisateur import utilisateur
d374db4d 47from fournisseur import fournisseur
0ae81148 48
a6627284 49def dispatcher(environ, start_response):
81b8aba3 50 """dispatch vers la bonne methode du bon objet, et retour WSGI"""
30e64411 51 results = environ['wsgiorg.routing_args'][1] # résultat du middleware Routes
1795efcd 52 try:
30e64411 53 # On cherche l'objet puis la méthode
1795efcd 54 target_class = globals()[results['controller']]
0ae81148
TN
55 method = getattr(target_class,results['action'])
56 except:
6264cb94
TN
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())
0ae81148 60 try:
30e64411 61 # On lance la méthode et on renvoie le résultat
1795efcd
TN
62 type, output = method(target_class(environ))
63 start_response("200 OK", [('Content-type', formats[type])])
30e64411
TN
64 return output.encode('utf-8')
65 # gestion des problèmes possibles pendant l'exécution
65f02320 66 except ObjetInconnu, type:
6264cb94
TN
67 start_response("404 Not Found", [('Content-type', 'text/html')])
68 return '<html><body><h2>404 %s inexistant</h2></body></html>' % type
30e64411 69 except TemplateNotFound, template:
0ae81148
TN
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
1795efcd 72 except:
0ae81148
TN
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())
1795efcd
TN
75
76
30e64411
TN
77# application() sera lancée par mod_wsgi : on route et on dispatche
78application = RoutesMiddleware( dispatcher, mapper )
1795efcd 79
a6627284 80