pas de filtre possible sur les show()
[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 57 # Si erreur pendant la recherche, on renvoie un 501
4bd61de2 58 start_response("501 Not Implemented", [('Content-type', 'text/html; charset=utf-8')])
6264cb94 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 62 type, output = method(target_class(environ))
4bd61de2 63 start_response("200 OK", [('Content-type', formats[type] + "; charset=utf-8")])
30e64411
TN
64 return output.encode('utf-8')
65 # gestion des problèmes possibles pendant l'exécution
65f02320 66 except ObjetInconnu, type:
4bd61de2 67 start_response("404 Not Found", [('Content-type', 'text/html; charset=utf-8')])
6264cb94 68 return '<html><body><h2>404 %s inexistant</h2></body></html>' % type
30e64411 69 except TemplateNotFound, template:
4bd61de2 70 start_response("415 Unsupported Media Type", [('Content-type', 'text/html; charset=utf-8')])
0ae81148 71 return '<html><body><h2>415 format non supporté (%s inexistant)</h2></body></html>' % template
1795efcd 72 except:
4bd61de2 73 start_response("500 INTERNAL ERROR", [('Content-type', 'text/html; charset=utf-8')])
0ae81148 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