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